getgrouplist

NAME

getgrouplist - list of groups a user belongs to

SYNOPSIS

#include <grp.h> I int getgrouplist(const char * user , gid_t group , I gid_t * groups , int * ngroups );

DESCRIPTION

The R getgrouplist () function scans the group database for all the groups user belongs to. Up to *ngroups group IDs corresponding to these groups are stored in the array R groups ; the return value from the function is the number of group IDs actually stored. The group group is automatically included in the list of groups returned by R getgrouplist ().

RETURN VALUE

If *ngroups is smaller than the total number of groups found, then R getgrouplist () returns -1. In all cases the actual number of groups is stored in *ngroups.

VERSIONS

This function is present since glibc 2.2.4.

CONFORMING TO

This function is non-standard; it appears on most BSDs.

BUGS

The glibc 2.3.2 implementation of this function is broken: it overwrites memory when the actual number of groups is larger than *ngroups.

EXAMPLE

/* This crashes with glibc 2.3.2 */
#include <stdio.h>
#include <stdlib.h>
#include <grp.h>
#include <pwd.h>

int
main(void)
{
    int i, ng = 0;
    char *user = "who";       /* username here */
    gid_t *groups = NULL;
    struct passwd *pw = getpwnam(user);

    if (pw == NULL)
        exit(EXIT_SUCCESS);

    if (getgrouplist(user, pw->pw_gid, NULL, &ng) < 0) {
        groups = (gid_t *) malloc(ng * sizeof (gid_t));
        getgrouplist(user, pw->pw_gid, groups, &ng);
    }

    for (i = 0; i < ng; i++)
        printf("%d\n", groups[i]);

    exit(EXIT_SUCCESS);
}

SEE ALSO