gid_t * supplementary_groups (char *user) { int ngroups = 16; gid_t *groups = (gid_t *) xmalloc (ngroups * sizeof (gid_t)); struct passwd *pw = getpwnam (user); if (pw == NULL) return NULL; if (getgrouplist (pw->pw_name, pw->pw_gid, groups, &ngroups) < 0) { groups = xrealloc (ngroups * sizeof (gid_t)); getgrouplist (pw->pw_name, pw->pw_gid, groups, &ngroups); } return groups; }