1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19: #include <errno.h>
20: #include <grp.h>
21: #include <bits/libc-lock.h>
22: #include <stdio.h>
23: #include <stdlib.h>
24:
25:
26:
27: __libc_lock_define_initialized (static, lock);
28:
29: libc_freeres_ptr (static char *buffer);
30:
31:
32: struct group *
33: fgetgrent (FILE *stream)
34: {
35: static size_t buffer_size;
36: static struct group resbuf;
37: fpos_t pos;
38: struct group *result;
39: int save;
40:
41: if (__builtin_expect (fgetpos (stream, &pos), 0) != 0)
42: return NULL;
43:
44:
45: __libc_lock_lock (lock);
46:
47:
48: if (buffer == NULL)
49: {
50: buffer_size = NSS_BUFLEN_GROUP;
51: buffer = malloc (buffer_size);
52: }
53:
54: while (buffer != NULL
55: && (__fgetgrent_r (stream, &resbuf, buffer, buffer_size, &result)
56: == ERANGE))
57: {
58: char *new_buf;
59: buffer_size += NSS_BUFLEN_GROUP;
60: new_buf = realloc (buffer, buffer_size);
61: if (__builtin_expect (new_buf == NULL, 0))
62: {
63:
64:
65: save = errno;
66: free (buffer);
67: __set_errno (save);
68: }
69: buffer = new_buf;
70:
71:
72: if (fsetpos (stream, &pos) != 0)
73: buffer = NULL;
74: }
75:
76: if (buffer == NULL)
77: result = NULL;
78:
79:
80: save = errno;
81: __libc_lock_unlock (lock);
82: __set_errno (save);
83:
84: return result;
85: }