it's called getgrgid_r, not getgruid_r...
[musl] / src / passwd / getgr_r.c
1 #include "pwf.h"
2
3 #define FIX(x) (gr->gr_##x = gr->gr_##x-line+buf)
4
5 static int getgr_r(const char *name, gid_t gid, struct group *gr, char *buf, size_t size, struct group **res)
6 {
7         FILE *f;
8         char *line = 0;
9         size_t len = 0;
10         char **mem = 0;
11         size_t nmem = 0;
12         int rv = 0;
13         size_t i;
14
15         f = fopen("/etc/group", "rb");
16         if (!f) return errno;
17
18         *res = 0;
19         while (__getgrent_a(f, gr, &line, &len, &mem, &nmem)) {
20                 if (name && !strcmp(name, gr->gr_name)
21                 || !name && gr->gr_gid == gid) {
22                         if (size < len + nmem*sizeof(char *) + 32) {
23                                 rv = ERANGE;
24                                 break;
25                         }
26                         *res = gr;
27                         buf += (16-(uintptr_t)buf)%16;
28                         gr->gr_mem = (void *)buf;
29                         buf += nmem*sizeof(char *);
30                         memcpy(buf, line, len);
31                         FIX(name);
32                         FIX(passwd);
33                         for (i=0; mem[i]; i++)
34                                 gr->gr_mem[i] = mem[i]-line+buf;
35                         gr->gr_mem[i] = 0;
36                         break;
37                 }
38         }
39         free(mem);
40         free(line);
41         fclose(f);
42         return rv;
43 }
44
45 int getgrnam_r(const char *name, struct group *gr, char *buf, size_t size, struct group **res)
46 {
47         return getgr_r(name, 0, gr, buf, size, res);
48 }
49
50 int getgrgid_r(gid_t gid, struct group *gr, char *buf, size_t size, struct group **res)
51 {
52         return getgr_r(0, gid, gr, buf, size, res);
53 }