X-Git-Url: http://nsz.repo.hu/git/?p=musl;a=blobdiff_plain;f=src%2Fmisc%2Fgetgrouplist.c;h=63557afe87681b07de17faa1804ea356bf15820e;hp=88f273d77871d662f225786f264888a2771a7d8f;hb=507faa63cb12571c14d66eb37dedbe6adbbf40a8;hpb=0b44a0315b47dd8eced9f3b7f31580cf14bbfc01 diff --git a/src/misc/getgrouplist.c b/src/misc/getgrouplist.c index 88f273d7..63557afe 100644 --- a/src/misc/getgrouplist.c +++ b/src/misc/getgrouplist.c @@ -1,11 +1,23 @@ #include - -/* FIXME */ +#include +#include int getgrouplist(const char *user, gid_t gid, gid_t *groups, int *ngroups) { + size_t n, i; + struct group *gr; if (*ngroups<1) return -1; - *groups = gid; + n = *ngroups; + *groups++ = gid; *ngroups = 1; - return 0; + + setgrent(); + while ((gr = getgrent()) && *ngroups < INT_MAX) { + for (i=0; gr->gr_mem[i] && strcmp(user, gr->gr_mem[i]); i++); + if (!gr->gr_mem[i]) continue; + if (++*ngroups <= n) *groups++ = gr->gr_gid; + } + endgrent(); + + return *ngroups > n ? -1 : *ngroups; }