summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3
-rw-r--r--nss/getent.c33
2 files changed, 36 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index f74127808e..49d85da5db 100644
--- 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.
diff --git a/nss/getent.c b/nss/getent.c
index a33bcb4ac1..9d43e2f656 100644
--- a/nss/getent.c
+++ b/nss/getent.c
@@ -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)