3 #define FIX(x) (gr->gr_##x = gr->gr_##x-line+buf)
5 static int getgr_r(const char *name, gid_t gid, struct group *gr, char *buf, size_t size, struct group **res)
15 f = fopen("/etc/group", "rb");
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) {
27 buf += (16-(uintptr_t)buf)%16;
28 gr->gr_mem = (void *)buf;
29 buf += nmem*sizeof(char *);
30 memcpy(buf, line, len);
33 for (i=0; mem[i]; i++)
34 gr->gr_mem[i] = mem[i]-line+buf;
45 int getgrnam_r(const char *name, struct group *gr, char *buf, size_t size, struct group **res)
47 return getgr_r(name, 0, gr, buf, size, res);
50 int getgruid_r(gid_t gid, struct group *gr, char *buf, size_t size, struct group **res)
52 return getgr_r(0, gid, gr, buf, size, res);