Add initgroups lookup support to getent
authorUlrich Drepper <drepper@gmail.com>
Thu, 16 Jun 2011 00:54:31 +0000 (20:54 -0400)
committerUlrich Drepper <drepper@gmail.com>
Thu, 16 Jun 2011 01:06:19 +0000 (21:06 -0400)
ChangeLog
nss/getent.c

index f741278..49d85da 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2011-06-15  Ulrich Drepper  <drepper@gmail.com>
 
+       * nss/getent.c: Add support for initgroups lookups through getgrouplist
+       interface.
+
        * grp/initgroups.c (__nss_initgroups_database): Renamed and exported.
        (internal_getgrouplist): Adjust to name change.
        Update use_initgroups_entry if this is not the first call.
index a33bcb4..9d43e2f 100644 (file)
@@ -501,6 +501,38 @@ netgroup_keys (int number, char *key[])
   return result;
 }
 
+/* This is for initgroups */
+static int
+initgroups_keys (int number, char *key[])
+{
+  int ngrps = 100;
+  size_t grpslen = ngrps * sizeof (gid_t);
+  gid_t *grps = alloca (grpslen);
+
+  for (int i = 0; i < number; ++i)
+    {
+      int no = ngrps;
+      int n;
+      while ((n = getgrouplist (key[i], -1, grps, &no)) == -1
+            && no > ngrps)
+       {
+         grps = extend_alloca (grps, grpslen, no * sizeof (gid_t));
+         ngrps = no;
+       }
+
+      if (n == -1)
+       return 1;
+
+      printf ("%-21s", key[i]);
+      for (int j = 0; j < n; ++j)
+       if (grps[j] != -1)
+         printf (" %ld", (long int) grps[j]);
+      putchar_unlocked ('\n');
+    }
+
+  return 0;
+}
+
 /* This is for networks */
 static void
 print_networks (struct netent *net)
@@ -829,6 +861,7 @@ D(ethers)
 D(group)
 D(gshadow)
 D(hosts)
+D(initgroups)
 D(netgroup)
 D(networks)
 D(passwd)