diff options
Diffstat (limited to 'grp/fgetgrent.c')
-rw-r--r-- | grp/fgetgrent.c | 50 |
1 files changed, 36 insertions, 14 deletions
diff --git a/grp/fgetgrent.c b/grp/fgetgrent.c index bef3e3f745..031ccb9c92 100644 --- a/grp/fgetgrent.c +++ b/grp/fgetgrent.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991 Free Software Foundation, Inc. +/* Copyright (C) 1991, 1996 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -16,26 +16,48 @@ License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include <ansidecl.h> -#include <errno.h> -#include <stddef.h> #include <stdio.h> -#include <stdlib.h> -#include <string.h> #include <grp.h> +/* Define a line parsing function using the common code + used in the nss_files module. */ -/* Read a group entry from STREAM. */ +#define STRUCTURE group +#define ENTNAME grent +struct grent_data {}; + +#define TRAILING_LIST_MEMBER gr_mem +#define TRAILING_LIST_SEPARATOR_P(c) ((c) == ',') +#include "../nss/nss_files/files-parse.c" +LINE_PARSER +( + STRING_FIELD (result->gr_name, ISCOLON); + STRING_FIELD (result->gr_passwd, ISCOLON); + INT_FIELD (result->gr_gid, ISCOLON, 10,); +) + + +/* Read one entry from the given stream. */ struct group * -DEFUN(fgetgrent, (stream), FILE *stream) +fgetgrent (FILE *stream) { - static PTR info = NULL; - if (info == NULL) + static char buffer[BUFSIZ]; + static struct group result; + char *p; + + do { - info = __grpalloc(); - if (info == NULL) + p = fgets (buffer, sizeof buffer, stream); + if (p == NULL) return NULL; - } - return __grpread(stream, info); + /* 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, &result, (void *) buffer, sizeof buffer)); + + return &result; } |