update from main archive 961010
[kopensolaris-gnu/glibc.git] / nss / nss_files / files-netgrp.c
index 8af55f2..427c6bf 100644 (file)
@@ -188,12 +188,41 @@ _nss_netgroup_parseline (char **cursor, struct __netgrent *result,
   const char *host, *user, *domain;
   char *cp = *cursor;
 
+  /* Some sanity checks.  */
+  if (cp == NULL)
+    /* User bug.  setnetgrent() wasn't called before.  */
+    abort ();
+
   /* First skip leading spaces.  */
   while (isspace (*cp))
     ++cp;
 
   if (*cp != '(')
-    return first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN;
+    {
+      /* We have a list of other netgroups.  */
+      char *name = cp;
+
+      while (*cp != '\0' && ! isspace (*cp))
+       ++cp;
+
+      if (name != cp)
+       {
+         /* It is another netgroup name.  */
+         int last = *cp == '\0';
+
+         result->type = group_val;
+         result->val.group = name;
+         *cp = '\0';
+         if (! last)
+           ++cp;
+         *cursor = cp;
+         first = 0;
+
+         return NSS_STATUS_SUCCESS;
+       }
+
+      return first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN;
+    }
 
   /* Match host name.  */
   host = ++cp;
@@ -225,15 +254,17 @@ _nss_netgroup_parseline (char **cursor, struct __netgrent *result,
   else
     {
       memcpy (buffer, host, cp - host);
+      result->type = triple_val;
 
       buffer[(user - host) - 1] = '\0';
-      result->host = *host == ',' ? NULL : buffer;
+      result->val.triple.host = *host == ',' ? NULL : buffer;
 
       buffer[(domain - host) - 1] = '\0';
-      result->user = *user == ',' ? NULL : buffer + (user - host);
+      result->val.triple.user = *user == ',' ? NULL : buffer + (user - host);
 
       buffer[(cp - host) - 1] = '\0';
-      result->domain = *domain == ')' ? NULL : buffer + (domain - host);
+      result->val.triple.domain =
+       *domain == ')' ? NULL : buffer + (domain - host);
 
       status = NSS_STATUS_SUCCESS;