Thu Jan 18 00:32:43 1996 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
[kopensolaris-gnu/glibc.git] / grp / grpread.c
index bf288a5..1fed32f 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1992, 1995 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
@@ -31,10 +31,8 @@ Cambridge, MA 02139, USA.  */
 /* Structure containing info kept by each __grpread caller.  */
 typedef struct
   {
-#define        NAME_SIZE       8
-#define        PASSWD_SIZE     20
-#define        MEMLIST_SIZE    1000
-    char buf[NAME_SIZE + 1 + PASSWD_SIZE + 1 + 20 + 1 + 20 + MEMLIST_SIZE + 1];
+    char *buf;
+    size_t buflen;
     size_t max_members;
     char **members;
     struct group g;
@@ -45,15 +43,18 @@ typedef struct
 PTR
 DEFUN_VOID(__grpalloc)
 {
-  grpread_info *info = (PTR) malloc(sizeof(grpread_info));
+  grpread_info *info = (PTR) malloc (sizeof(grpread_info));
   if (info == NULL)
     return NULL;
 
+  info->buf = NULL;
+  info->buflen = 0;
+
   info->max_members = 5;
-  info->members = (char **) malloc(5 * sizeof(char *));
+  info->members = (char **) malloc (5 * sizeof(char *));
   if (info->members == NULL)
     {
-      free((PTR) info);
+      free ((PTR) info);
       return NULL;
     }
 
@@ -75,8 +76,10 @@ DEFUN(__grpread, (stream, g), FILE *stream AND PTR CONST g)
       return NULL;
     }
 
-  if (fgets (info->buf, sizeof(info->buf), stream) == NULL)
-    return NULL;
+  do
+    if (__getline (&info->buf, &info->buflen, stream) == -1)
+      return NULL;
+  while (info->buf[0] == '#');
 
   start = info->buf;
   end = strchr (start, ':');
@@ -130,3 +133,34 @@ DEFUN(__grpread, (stream, g), FILE *stream AND PTR CONST g)
 
   return &info->g;
 }
+
+
+struct group *
+__grpscan (void **info, int (*selector) (struct group *))
+{
+  FILE *stream;
+  struct group *p;
+
+  if (*info == NULL)
+    {
+      *info = __grpalloc ();
+      if (info == NULL)
+       return NULL;
+    }
+
+  stream = __grpopen ();
+  if (stream == NULL)
+    return NULL;
+
+  p = NULL;
+  while (! feof (stream))
+    {
+      p = __grpread (stream, *info);
+      if (p && (*selector) (p))
+       break;
+      p = NULL;
+    }
+
+  (void) fclose (stream);
+  return p;
+}