Define as __pwrite and make pwrite weak alias.
[kopensolaris-gnu/glibc.git] / pwd / fgetpwent_r.c
1 /* Copyright (C) 1991, 1996 Free Software Foundation, Inc.
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
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.
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
12    Library General Public License for more details.
13
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.  */
18
19 #include <ctype.h>
20 #include <stdio.h>
21 #include <pwd.h>
22
23 /* Define a line parsing function using the common code
24    used in the nss_files module.  */
25
26 #define STRUCTURE       passwd
27 #define ENTNAME         pwent
28 struct pwent_data {};
29
30 #include "../nss/nss_files/files-parse.c"
31 LINE_PARSER
32 (,
33  STRING_FIELD (result->pw_name, ISCOLON, 0);
34  if (line[0] == '\0'
35      && (result->pw_name[0] == '+' || result->pw_name[0] == '-'))
36    {
37      /* This a special case.  We allow lines containing only a `+' sign
38         since this is used for nss_compat.  All other services will
39         reject this entry later.  Initialize all other fields now.  */
40      result->pw_passwd = NULL;
41      result->pw_uid = 0;
42      result->pw_gid = 0;
43      result->pw_gecos = NULL;
44      result->pw_dir = NULL;
45      result->pw_shell = NULL;
46    }
47  else
48    {
49      STRING_FIELD (result->pw_passwd, ISCOLON, 0);
50      if (result->pw_name[0] == '+' || result->pw_name[0] == '-')
51        {
52          INT_FIELD_MAYBE_NULL (result->pw_uid, ISCOLON, 0, 10, , 0)
53          INT_FIELD_MAYBE_NULL (result->pw_gid, ISCOLON, 0, 10, , 0)
54        }
55      else
56        {
57          INT_FIELD (result->pw_uid, ISCOLON, 0, 10,)
58          INT_FIELD (result->pw_gid, ISCOLON, 0, 10,)
59        }
60      STRING_FIELD (result->pw_gecos, ISCOLON, 0);
61      STRING_FIELD (result->pw_dir, ISCOLON, 0);
62      result->pw_shell = line;
63    }
64  )
65
66
67 /* Read one entry from the given stream.  */
68 int
69 __fgetpwent_r (FILE *stream, struct passwd *resbuf, char *buffer,
70                size_t buflen, struct passwd **result)
71 {
72   char *p;
73
74   do
75     {
76       p = fgets (buffer, buflen, stream);
77       if (p == NULL)
78         {
79           *result = NULL;
80           return errno;
81         }
82
83       /* Skip leading blanks.  */
84       while (isspace (*p))
85         ++p;
86     } while (*p == '\0' || *p == '#' || /* Ignore empty and comment lines.  */
87              /* Parse the line.  If it is invalid, loop to
88                 get the next line of the file to parse.  */
89              ! parse_line (p, resbuf, (void *) buffer, buflen));
90
91   *result = resbuf;
92   return 0;
93 }
94 weak_alias (__fgetpwent_r, fgetpwent_r)