make all objects used with atomic operations volatile
[musl] / src / misc / getgrouplist.c
1 #define _GNU_SOURCE
2 #include <grp.h>
3 #include <string.h>
4 #include <limits.h>
5
6 int getgrouplist(const char *user, gid_t gid, gid_t *groups, int *ngroups)
7 {
8         size_t n, i;
9         struct group *gr;
10         if (*ngroups<1) return -1;
11         n = *ngroups;
12         *groups++ = gid;
13         *ngroups = 1;
14
15         setgrent();
16         while ((gr = getgrent()) && *ngroups < INT_MAX) {
17                 for (i=0; gr->gr_mem[i] && strcmp(user, gr->gr_mem[i]); i++);
18                 if (!gr->gr_mem[i]) continue;
19                 if (++*ngroups <= n) *groups++ = gr->gr_gid;
20         }
21         endgrent();
22
23         return *ngroups > n ? -1 : *ngroups;
24 }