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 <stdio.h>
22: #include <pwd.h>
23:
24: #ifdef USE_IN_LIBIO
25: # define flockfile(s) _IO_flockfile (s)
26: # define funlockfile(s) _IO_funlockfile (s)
27: #endif
28:
29:
30:
31:
32: #define STRUCTURE passwd
33: #define ENTNAME pwent
34: struct pwent_data {};
35:
36: #include <nss/nss_files/files-parse.c>
37: LINE_PARSER
38: (,
39: STRING_FIELD (result->pw_name, ISCOLON, 0);
40: if (line[0] == '\0'
41: && (result->pw_name[0] == '+' || result->pw_name[0] == '-'))
42: {
43:
44:
45:
46: result->pw_passwd = NULL;
47: result->pw_uid = 0;
48: result->pw_gid = 0;
49: result->pw_gecos = NULL;
50: result->pw_dir = NULL;
51: result->pw_shell = NULL;
52: }
53: else
54: {
55: STRING_FIELD (result->pw_passwd, ISCOLON, 0);
56: if (result->pw_name[0] == '+' || result->pw_name[0] == '-')
57: {
58: INT_FIELD_MAYBE_NULL (result->pw_uid, ISCOLON, 0, 10, , 0)
59: INT_FIELD_MAYBE_NULL (result->pw_gid, ISCOLON, 0, 10, , 0)
60: }
61: else
62: {
63: INT_FIELD (result->pw_uid, ISCOLON, 0, 10,)
64: INT_FIELD (result->pw_gid, ISCOLON, 0, 10,)
65: }
66: STRING_FIELD (result->pw_gecos, ISCOLON, 0);
67: STRING_FIELD (result->pw_dir, ISCOLON, 0);
68: result->pw_shell = line;
69: }
70: )
71:
72:
73:
74: int
75: __fgetpwent_r (FILE *stream, struct passwd *resbuf, char *buffer,
76: size_t buflen, struct passwd **result)
77: {
78: char *p;
79:
80: flockfile (stream);
81: do
82: {
83: buffer[buflen - 1] = '\xff';
84: p = fgets_unlocked (buffer, buflen, stream);
85: if (p == NULL && feof_unlocked (stream))
86: {
87: funlockfile (stream);
88: *result = NULL;
89: __set_errno (ENOENT);
90: return errno;
91: }
92: if (p == NULL || buffer[buflen - 1] != '\xff')
93: {
94: funlockfile (stream);
95: *result = NULL;
96: __set_errno (ERANGE);
97: return errno;
98: }
99:
100:
101: while (isspace (*p))
102: ++p;
103: } while (*p == '\0' || *p == '#' ||
104:
105:
106: ! parse_line (p, resbuf, (void *) buffer, buflen, &errno));
107:
108: funlockfile (stream);
109:
110: *result = resbuf;
111: return 0;
112: }
113: weak_alias (__fgetpwent_r, fgetpwent_r)