static int getgrouplist_getgrset(const char *user, gid_t gid, gid_t *groups, int *grpcnt) { char *grplist; char *grp; gid_t temp_gid; int num_gids = 1; int ret = 0; long l; grplist = getgrset(user); DEBUG(10, ("getgrset returned %s\n", grplist)); if (grplist == NULL) { return -1; } if (*grpcnt > 0) { groups[0] = gid; } while ((grp = strsep(&grplist, ",")) != NULL) { l = strtol(grp, NULL, 10); temp_gid = (gid_t) l; if (temp_gid == gid) { continue; } if (num_gids + 1 > *grpcnt) { num_gids++; continue; } groups[num_gids++] = temp_gid; } free(grplist); if (num_gids > *grpcnt) { ret = -1; } *grpcnt = num_gids; DEBUG(10, ("Found %d groups for user %s\n", *grpcnt, user)); return ret; }
int getgrouplist(const char *user, gid_t pgid, gid_t *groups, int *grpcnt) { char *cp, *grplist, *grp; gid_t gid; int ret = 0, ngroups = 0, maxgroups; long l; maxgroups = *grpcnt; if ((cp = grplist = getgrset(user)) == NULL) return -1; /* handle zero-length case */ if (maxgroups <= 0) { *grpcnt = 0; return -1; } /* copy primary group */ groups[ngroups++] = pgid; /* copy each entry from getgrset into group list */ while ((grp = strsep(&grplist, ",")) != NULL) { l = strtol(grp, NULL, 10); if (ngroups >= maxgroups || l == LONG_MIN || l == LONG_MAX) { ret = -1; goto out; } gid = (gid_t)l; if (gid == pgid) continue; /* we have already added primary gid */ groups[ngroups++] = gid; } out: free(cp); *grpcnt = ngroups; return ret; }
/* * BSD-compatible getgrouplist(3) using getgrset(3) */ int getgrouplist(const char *name, gid_t basegid, gid_t *groups, int *ngroupsp) { char *cp, *grset = NULL; int i, ngroups = 1; int grpsize = *ngroupsp; int rval = -1; gid_t gid; /* We support BSD semantics where the first element is the base gid */ if (grpsize <= 0) return -1; groups[0] = basegid; #ifdef HAVE_SETAUTHDB aix_setauthdb((char *) name); #endif if ((grset = getgrset(name)) != NULL) { const char *errstr; for (cp = strtok(grset, ","); cp != NULL; cp = strtok(NULL, ",")) { gid = atoid(cp, NULL, NULL, &errstr); if (errstr == NULL && gid != basegid) { if (ngroups == grpsize) goto done; groups[ngroups++] = gid; } } } rval = 0; done: free(grset); #ifdef HAVE_SETAUTHDB aix_restoreauthdb(); #endif *ngroupsp = ngroups; return rval; }