]>
Commit | Line | Data |
---|---|---|
db873f32 | 1 | /* Copyright (C) 1991, 1996, 1997, 1998, 1999 Free Software Foundation, Inc. |
2303f5fd | 2 | This file is part of the GNU C Library. |
267ca16a | 3 | |
2303f5fd UD |
4 | The GNU C Library is free software; you can redistribute it and/or |
5 | modify it under the terms of the GNU Library General Public License as | |
6 | published by the Free Software Foundation; either version 2 of the | |
7 | License, or (at your option) any later version. | |
267ca16a | 8 | |
2303f5fd UD |
9 | The GNU C Library is distributed in the hope that it will be useful, |
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
12 | Library General Public License for more details. | |
267ca16a | 13 | |
2303f5fd UD |
14 | You should have received a copy of the GNU Library General Public |
15 | License along with the GNU C Library; see the file COPYING.LIB. If not, | |
16 | write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
17 | Boston, MA 02111-1307, USA. */ | |
267ca16a UD |
18 | |
19 | #include <ctype.h> | |
d71b808a | 20 | #include <errno.h> |
267ca16a UD |
21 | #include <grp.h> |
22 | #include <stdio.h> | |
23 | ||
50304ef0 UD |
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 | ||
267ca16a UD |
30 | /* Define a line parsing function using the common code |
31 | used in the nss_files module. */ | |
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) == ',') | |
d71b808a | 39 | #include <nss/nss_files/files-parse.c> |
267ca16a UD |
40 | LINE_PARSER |
41 | (, | |
42 | STRING_FIELD (result->gr_name, ISCOLON, 0); | |
2303f5fd UD |
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 | } | |
6ed0492f | 49 | else |
2303f5fd UD |
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 | } | |
267ca16a UD |
57 | ) |
58 | ||
59 | ||
60 | /* Read one entry from the given stream. */ | |
ba1ffaa1 UD |
61 | int |
62 | __fgetgrent_r (FILE *stream, struct group *resbuf, char *buffer, size_t buflen, | |
63 | struct group **result) | |
267ca16a UD |
64 | { |
65 | char *p; | |
22d57dd3 | 66 | int parse_result; |
267ca16a | 67 | |
50304ef0 | 68 | flockfile (stream); |
267ca16a UD |
69 | do |
70 | { | |
31f7410f | 71 | buffer[buflen - 1] = '\xff'; |
50304ef0 UD |
72 | p = fgets_unlocked (buffer, buflen, stream); |
73 | if (p == NULL && feof_unlocked (stream)) | |
ba1ffaa1 | 74 | { |
50304ef0 | 75 | funlockfile (stream); |
ba1ffaa1 | 76 | *result = NULL; |
db873f32 | 77 | __set_errno (ENOENT); |
ba1ffaa1 UD |
78 | return errno; |
79 | } | |
31f7410f | 80 | if (p == NULL || buffer[buflen - 1] != '\xff') |
6591c335 | 81 | { |
50304ef0 | 82 | funlockfile (stream); |
6591c335 | 83 | *result = NULL; |
db873f32 UD |
84 | __set_errno (ERANGE); |
85 | return errno; | |
6591c335 | 86 | } |
267ca16a UD |
87 | |
88 | /* Skip leading blanks. */ | |
89 | while (isspace (*p)) | |
90 | ++p; | |
22d57dd3 | 91 | } while (*p == '\0' || *p == '#' /* Ignore empty and comment lines. */ |
267ca16a UD |
92 | /* Parse the line. If it is invalid, loop to |
93 | get the next line of the file to parse. */ | |
22d57dd3 | 94 | || ! (parse_result = parse_line (p, resbuf, |
d71b808a | 95 | (void *) buffer, buflen, |
7ba4fcfc | 96 | &errno))); |
22d57dd3 | 97 | |
50304ef0 UD |
98 | funlockfile (stream); |
99 | ||
22d57dd3 UD |
100 | if (parse_result == -1) |
101 | { | |
102 | /* The parser ran out of space. */ | |
103 | *result = NULL; | |
104 | return errno; | |
105 | } | |
267ca16a | 106 | |
ba1ffaa1 UD |
107 | *result = resbuf; |
108 | return 0; | |
267ca16a UD |
109 | } |
110 | weak_alias (__fgetgrent_r, fgetgrent_r) |