diff options
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | nss/getent.c | 33 |
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) |