(linenum→info "unix/slp.c:2238")

glibc/2.7/pwd/fgetpwent_r.c

    1: /* Copyright (C) 1991, 1996, 1997, 1998, 1999 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 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.
    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:    Lesser General Public License for more details.
   13: 
   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.  */
   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: /* Define a line parsing function using the common code
   30:    used in the nss_files module.  */
   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:      /* This a special case.  We allow lines containing only a `+' sign
   44:         since this is used for nss_compat.  All other services will
   45:         reject this entry later.  Initialize all other fields now.  */
   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: /* Read one entry from the given stream.  */
   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:       /* Skip leading blanks.  */
  101:       while (isspace (*p))
  102:         ++p;
  103:     } while (*p == '\0' || *p == '#' || /* Ignore empty and comment lines.  */
  104:              /* Parse the line.  If it is invalid, loop to
  105:                 get the next line of the file to parse.  */
  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)
Syntax (Markdown)