示例#1
0
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;
}
示例#2
0
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;
}