805e28c90e9428545943e30e2530577f4cdaea22
[musl] / src / passwd / getgr_a.c
1 #include <pthread.h>
2 #include "pwf.h"
3
4 int __getgr_a(const char *name, gid_t gid, struct group *gr, char **buf, size_t *size, char ***mem, size_t *nmem, struct group **res)
5 {
6         FILE *f;
7         int rv = 0;
8         int cs;
9
10         *res = 0;
11
12         pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
13
14         f = fopen("/etc/group", "rbe");
15         if (!f) {
16                 rv = errno;
17                 goto done;
18         }
19
20         while (!(rv = __getgrent_a(f, gr, buf, size, mem, nmem, res)) && *res) {
21                 if (name && !strcmp(name, (*res)->gr_name)
22                 || !name && (*res)->gr_gid == gid) {
23                         break;
24                 }
25         }
26         fclose(f);
27
28 done:
29         pthread_setcancelstate(cs, 0);
30         if (rv) errno = rv;
31         return rv;
32 }