| Index: fusl/src/passwd/getgrouplist.c
|
| diff --git a/fusl/src/passwd/getgrouplist.c b/fusl/src/passwd/getgrouplist.c
|
| index 43e518245f8e6bfdafdbdb2ff5aec92a247798e4..0cf95b0aa401b343442a0871da023659402e3f79 100644
|
| --- a/fusl/src/passwd/getgrouplist.c
|
| +++ b/fusl/src/passwd/getgrouplist.c
|
| @@ -9,72 +9,82 @@
|
| #include <errno.h>
|
| #include "nscd.h"
|
|
|
| -int getgrouplist(const char *user, gid_t gid, gid_t *groups, int *ngroups)
|
| -{
|
| - int rv, nlim, ret = -1;
|
| - ssize_t i, n = 1;
|
| - struct group gr;
|
| - struct group *res;
|
| - FILE *f;
|
| - int swap = 0;
|
| - int32_t resp[INITGR_LEN];
|
| - uint32_t *nscdbuf = 0;
|
| - char *buf = 0;
|
| - char **mem = 0;
|
| - size_t nmem = 0;
|
| - size_t size;
|
| - nlim = *ngroups;
|
| - if (nlim >= 1) *groups++ = gid;
|
| +int getgrouplist(const char* user, gid_t gid, gid_t* groups, int* ngroups) {
|
| + int rv, nlim, ret = -1;
|
| + ssize_t i, n = 1;
|
| + struct group gr;
|
| + struct group* res;
|
| + FILE* f;
|
| + int swap = 0;
|
| + int32_t resp[INITGR_LEN];
|
| + uint32_t* nscdbuf = 0;
|
| + char* buf = 0;
|
| + char** mem = 0;
|
| + size_t nmem = 0;
|
| + size_t size;
|
| + nlim = *ngroups;
|
| + if (nlim >= 1)
|
| + *groups++ = gid;
|
|
|
| - f = __nscd_query(GETINITGR, user, resp, sizeof resp, &swap);
|
| - if (!f) goto cleanup;
|
| - if (resp[INITGRFOUND]) {
|
| - nscdbuf = calloc(resp[INITGRNGRPS], sizeof(uint32_t));
|
| - if (!nscdbuf) goto cleanup;
|
| - if (!fread(nscdbuf, sizeof(*nscdbuf)*resp[INITGRNGRPS], 1, f)) {
|
| - if (!ferror(f)) errno = EIO;
|
| - goto cleanup;
|
| - }
|
| - if (swap) {
|
| - for (i = 0; i < resp[INITGRNGRPS]; i++)
|
| - nscdbuf[i] = bswap_32(nscdbuf[i]);
|
| - }
|
| - }
|
| - fclose(f);
|
| + f = __nscd_query(GETINITGR, user, resp, sizeof resp, &swap);
|
| + if (!f)
|
| + goto cleanup;
|
| + if (resp[INITGRFOUND]) {
|
| + nscdbuf = calloc(resp[INITGRNGRPS], sizeof(uint32_t));
|
| + if (!nscdbuf)
|
| + goto cleanup;
|
| + if (!fread(nscdbuf, sizeof(*nscdbuf) * resp[INITGRNGRPS], 1, f)) {
|
| + if (!ferror(f))
|
| + errno = EIO;
|
| + goto cleanup;
|
| + }
|
| + if (swap) {
|
| + for (i = 0; i < resp[INITGRNGRPS]; i++)
|
| + nscdbuf[i] = bswap_32(nscdbuf[i]);
|
| + }
|
| + }
|
| + fclose(f);
|
|
|
| - f = fopen("/etc/group", "rbe");
|
| - if (!f && errno != ENOENT && errno != ENOTDIR)
|
| - goto cleanup;
|
| + f = fopen("/etc/group", "rbe");
|
| + if (!f && errno != ENOENT && errno != ENOTDIR)
|
| + goto cleanup;
|
|
|
| - if (f) {
|
| - while (!(rv = __getgrent_a(f, &gr, &buf, &size, &mem, &nmem, &res)) && res) {
|
| - if (nscdbuf)
|
| - for (i=0; i < resp[INITGRNGRPS]; i++) {
|
| - if (nscdbuf[i] == gr.gr_gid) nscdbuf[i] = gid;
|
| - }
|
| - for (i=0; gr.gr_mem[i] && strcmp(user, gr.gr_mem[i]); i++);
|
| - if (!gr.gr_mem[i]) continue;
|
| - if (++n <= nlim) *groups++ = gr.gr_gid;
|
| - }
|
| - if (rv) {
|
| - errno = rv;
|
| - goto cleanup;
|
| - }
|
| - }
|
| - if (nscdbuf) {
|
| - for(i=0; i < resp[INITGRNGRPS]; i++) {
|
| - if (nscdbuf[i] != gid)
|
| - if(++n <= nlim) *groups++ = nscdbuf[i];
|
| - }
|
| - }
|
| + if (f) {
|
| + while (!(rv = __getgrent_a(f, &gr, &buf, &size, &mem, &nmem, &res)) &&
|
| + res) {
|
| + if (nscdbuf)
|
| + for (i = 0; i < resp[INITGRNGRPS]; i++) {
|
| + if (nscdbuf[i] == gr.gr_gid)
|
| + nscdbuf[i] = gid;
|
| + }
|
| + for (i = 0; gr.gr_mem[i] && strcmp(user, gr.gr_mem[i]); i++)
|
| + ;
|
| + if (!gr.gr_mem[i])
|
| + continue;
|
| + if (++n <= nlim)
|
| + *groups++ = gr.gr_gid;
|
| + }
|
| + if (rv) {
|
| + errno = rv;
|
| + goto cleanup;
|
| + }
|
| + }
|
| + if (nscdbuf) {
|
| + for (i = 0; i < resp[INITGRNGRPS]; i++) {
|
| + if (nscdbuf[i] != gid)
|
| + if (++n <= nlim)
|
| + *groups++ = nscdbuf[i];
|
| + }
|
| + }
|
|
|
| - ret = n > nlim ? -1 : n;
|
| - *ngroups = n;
|
| + ret = n > nlim ? -1 : n;
|
| + *ngroups = n;
|
|
|
| cleanup:
|
| - if (f) fclose(f);
|
| - free(nscdbuf);
|
| - free(buf);
|
| - free(mem);
|
| - return ret;
|
| + if (f)
|
| + fclose(f);
|
| + free(nscdbuf);
|
| + free(buf);
|
| + free(mem);
|
| + return ret;
|
| }
|
|
|