Back to index

glibc  2.9
Classes | Defines | Functions
fgetpwent_r.c File Reference
#include <ctype.h>
#include <errno.h>
#include <stdio.h>
#include <pwd.h>
#include <nss/nss_files/files-parse.c>

Go to the source code of this file.

Classes

struct  pwent_data

Defines

#define STRUCTURE   passwd
#define ENTNAME   pwent

Functions

 LINE_PARSER ()

Class Documentation

struct pwent_data

Definition at line 25 of file files-pwd.c.


Define Documentation

#define ENTNAME   pwent

Definition at line 33 of file fgetpwent_r.c.

#define STRUCTURE   passwd

Definition at line 32 of file fgetpwent_r.c.


Function Documentation

Definition at line 38 of file fgetpwent_r.c.

   {
     /* This a special case.  We allow lines containing only a `+' sign
       since this is used for nss_compat.  All other services will
       reject this entry later.  Initialize all other fields now.  */
     result->pw_passwd = NULL;
     result->pw_uid = 0;
     result->pw_gid = 0;
     result->pw_gecos = NULL;
     result->pw_dir = NULL;
     result->pw_shell = NULL;
   }
 else
   {
     STRING_FIELD (result->pw_passwd, ISCOLON, 0);
     if (result->pw_name[0] == '+' || result->pw_name[0] == '-')
       {
        INT_FIELD_MAYBE_NULL (result->pw_uid, ISCOLON, 0, 10, , 0)
        INT_FIELD_MAYBE_NULL (result->pw_gid, ISCOLON, 0, 10, , 0)
       }
     else
       {
        INT_FIELD (result->pw_uid, ISCOLON, 0, 10,)
        INT_FIELD (result->pw_gid, ISCOLON, 0, 10,)
       }
     STRING_FIELD (result->pw_gecos, ISCOLON, 0);
     STRING_FIELD (result->pw_dir, ISCOLON, 0);
     result->pw_shell = line;
   }
 )


/* Read one entry from the given stream.  */
int
__fgetpwent_r (FILE *stream, struct passwd *resbuf, char *buffer,
              size_t buflen, struct passwd **result)
{
  char *p;

  flockfile (stream);
  do
    {
      buffer[buflen - 1] = '\xff';
      p = fgets_unlocked (buffer, buflen, stream);
      if (p == NULL && feof_unlocked (stream))
       {
         funlockfile (stream);
         *result = NULL;
         __set_errno (ENOENT);
         return errno;
       }
      if (p == NULL || buffer[buflen - 1] != '\xff')
       {
         funlockfile (stream);
         *result = NULL;
         __set_errno (ERANGE);
         return errno;
       }

      /* Skip leading blanks.  */
      while (isspace (*p))
       ++p;
    } while (*p == '\0' || *p == '#' ||   /* Ignore empty and comment lines.  */
            /* Parse the line.  If it is invalid, loop to
              get the next line of the file to parse.  */
            ! parse_line (p, resbuf, (void *) buffer, buflen, &errno));

  funlockfile (stream);

  *result = resbuf;
  return 0;
}