1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19: #include <ctype.h>
20: #include <errno.h>
21: #include <grp.h>
22: #include <stdio.h>
23:
24: #ifdef USE_IN_LIBIO
25: # include <libio/iolibio.h>
26: # define flockfile(s) _IO_flockfile (s)
27: # define funlockfile(s) _IO_funlockfile (s)
28: #endif
29:
30:
31:
32:
33: #define STRUCTURE group
34: #define ENTNAME grent
35: struct grent_data {};
36:
37: #define TRAILING_LIST_MEMBER gr_mem
38: #define TRAILING_LIST_SEPARATOR_P(c) ((c) == ',')
39: #include <nss/nss_files/files-parse.c>
40: LINE_PARSER
41: (,
42: STRING_FIELD (result->gr_name, ISCOLON, 0);
43: if (line[0] == '\0'
44: && (result->gr_name[0] == '+' || result->gr_name[0] == '-'))
45: {
46: result->gr_passwd = NULL;
47: result->gr_gid = 0;
48: }
49: else
50: {
51: STRING_FIELD (result->gr_passwd, ISCOLON, 0);
52: if (result->gr_name[0] == '+' || result->gr_name[0] == '-')
53: INT_FIELD_MAYBE_NULL (result->gr_gid, ISCOLON, 0, 10, , 0)
54: else
55: INT_FIELD (result->gr_gid, ISCOLON, 0, 10,)
56: }
57: )
58:
59:
60:
61: int
62: __fgetgrent_r (FILE *stream, struct group *resbuf, char *buffer, size_t buflen,
63: struct group **result)
64: {
65: char *p;
66: int parse_result;
67:
68: flockfile (stream);
69: do
70: {
71: buffer[buflen - 1] = '\xff';
72: p = fgets_unlocked (buffer, buflen, stream);
73: if (__builtin_expect (p == NULL, 0) && feof_unlocked (stream))
74: {
75: funlockfile (stream);
76: *result = NULL;
77: __set_errno (ENOENT);
78: return errno;
79: }
80: if (__builtin_expect (p == NULL, 0) || buffer[buflen - 1] != '\xff')
81: {
82: funlockfile (stream);
83: *result = NULL;
84: __set_errno (ERANGE);
85: return errno;
86: }
87:
88:
89: while (isspace (*p))
90: ++p;
91: } while (*p == '\0' || *p == '#'
92:
93:
94: || ! (parse_result = parse_line (p, resbuf,
95: (void *) buffer, buflen,
96: &errno)));
97:
98: funlockfile (stream);
99:
100: if (__builtin_expect (parse_result, 0) == -1)
101: {
102:
103: *result = NULL;
104: return errno;
105: }
106:
107: *result = resbuf;
108: return 0;
109: }
110: weak_alias (__fgetgrent_r, fgetgrent_r)