diff options
author | Ulrich Drepper <drepper@gmail.com> | 2011-06-15 20:54:31 -0400 |
---|---|---|
committer | Ulrich Drepper <drepper@gmail.com> | 2011-06-15 21:06:19 -0400 |
commit | 82e9a1f7df488c62a214ee63847b2c884dcba565 (patch) | |
tree | 271719d21cef70e74fc8c0f1e34f13f8790c689c /nss | |
parent | c41af17eed77f07983dab6f702a6347fcad9a619 (diff) | |
download | glibc-82e9a1f7df488c62a214ee63847b2c884dcba565.tar.gz glibc-82e9a1f7df488c62a214ee63847b2c884dcba565.tar.xz glibc-82e9a1f7df488c62a214ee63847b2c884dcba565.zip |
Add initgroups lookup support to getent
Diffstat (limited to 'nss')
-rw-r--r-- | nss/getent.c | 33 |
1 files changed, 33 insertions, 0 deletions
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) |