]>
Commit | Line | Data |
---|---|---|
e1c6ee83 | 1 | /* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. |
19361cb7 UD |
2 | This file is part of the GNU C Library. |
3 | ||
4 | The GNU C Library is free software; you can redistribute it and/or | |
41bdb6e2 AJ |
5 | modify it under the terms of the GNU Lesser General Public |
6 | License as published by the Free Software Foundation; either | |
7 | version 2.1 of the License, or (at your option) any later version. | |
19361cb7 UD |
8 | |
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 | |
41bdb6e2 | 12 | Lesser General Public License for more details. |
19361cb7 | 13 | |
41bdb6e2 AJ |
14 | You should have received a copy of the GNU Lesser General Public |
15 | License along with the GNU C Library; if not, write to the Free | |
16 | Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | |
17 | 02111-1307 USA. */ | |
267ca16a UD |
18 | |
19 | #include <ctype.h> | |
d71b808a | 20 | #include <errno.h> |
267ca16a UD |
21 | #include <shadow.h> |
22 | #include <stdio.h> | |
23 | ||
50304ef0 UD |
24 | #ifdef USE_IN_LIBIO |
25 | # define flockfile(s) _IO_flockfile (s) | |
7ce241a0 | 26 | # define funlockfile(s) _IO_funlockfile (s) |
50304ef0 UD |
27 | #endif |
28 | ||
267ca16a UD |
29 | /* Define a line parsing function using the common code |
30 | used in the nss_files module. */ | |
31 | ||
32 | #define STRUCTURE spwd | |
33 | #define ENTNAME spent | |
34 | #define EXTERN_PARSER 1 | |
35 | struct spent_data {}; | |
36 | ||
d71b808a | 37 | #include <nss/nss_files/files-parse.c> |
267ca16a UD |
38 | |
39 | ||
40 | /* Read one shadow entry from the given stream. */ | |
ba1ffaa1 UD |
41 | int |
42 | __fgetspent_r (FILE *stream, struct spwd *resbuf, char *buffer, size_t buflen, | |
43 | struct spwd **result) | |
267ca16a UD |
44 | { |
45 | char *p; | |
46 | ||
50304ef0 | 47 | flockfile (stream); |
267ca16a UD |
48 | do |
49 | { | |
31f7410f | 50 | buffer[buflen - 1] = '\xff'; |
50304ef0 UD |
51 | p = fgets_unlocked (buffer, buflen, stream); |
52 | if (p == NULL && feof_unlocked (stream)) | |
b4012b75 | 53 | { |
50304ef0 | 54 | funlockfile (stream); |
b4012b75 | 55 | *result = NULL; |
26cee9a4 | 56 | __set_errno (ENOENT); |
b4012b75 UD |
57 | return errno; |
58 | } | |
31f7410f | 59 | if (p == NULL || buffer[buflen - 1] != '\xff') |
af69217f | 60 | { |
50304ef0 | 61 | funlockfile (stream); |
af69217f | 62 | *result = NULL; |
e1c6ee83 UD |
63 | __set_errno (ERANGE); |
64 | return errno; | |
af69217f | 65 | } |
267ca16a UD |
66 | |
67 | /* Skip leading blanks. */ | |
68 | while (isspace (*p)) | |
69 | ++p; | |
70 | } while (*p == '\0' || *p == '#' || /* Ignore empty and comment lines. */ | |
71 | /* Parse the line. If it is invalid, loop to | |
72 | get the next line of the file to parse. */ | |
7ba4fcfc | 73 | ! parse_line (buffer, (void *) resbuf, NULL, 0, &errno)); |
267ca16a | 74 | |
50304ef0 UD |
75 | funlockfile (stream); |
76 | ||
ba1ffaa1 UD |
77 | *result = resbuf; |
78 | return 0; | |
267ca16a UD |
79 | } |
80 | weak_alias (__fgetspent_r, fgetspent_r) |