getgroups.c

/**
   @file      getgroups.c
   @author    Mitch Richling <http://www.mitchr.me/>
   @Copyright Copyright 1996 by Mitch Richling.  All rights reserved.
   @brief     UNIX group queries@EOL
   @Keywords  UNIX group user gid getgroup getgrgid
   @Std       ISOC BSD4.3 POSIX.1

              This is an example program intended to illustrate how to
              use getgroups to query the current user's group set.  The
              system call getgrgid is also demonstrated.

   @Tested    
              - Solaris 2.8
              - MacOS X.2
              - Linux (RH 7.3)
*/

#include <sys/types.h>          /* UNIX types      POSIX */
#include <grp.h>                /* UNIX groups     POSIX */
#include <stdlib.h>             /* Standard Lib    ISOC  */
#include <unistd.h>             /* UNIX std stf    POSIX */
#include <stdio.h>              /* I/O lib         ISOC  */
#include <sys/param.h>          /* UNIX Params     ????  */
#include <errno.h>              /* error stf       POSIX */

int main(int argc, char *argv[]);

int main(int argc, char *argv[]) {
  int numGroups, i;
  long ngroups_max; 
  /* gid_t gidList[NGROUPS_MAX]; */
  gid_t *gidList;
  struct group *grEnt;

  ngroups_max = sysconf(_SC_NGROUPS_MAX);
  gidList = (gid_t *)malloc(sizeof(gid_t)*ngroups_max);

  /* How to figure out how many groups the current
     user is in. */
  if( (numGroups = getgroups(0, NULL)) < 0) {
    printf("ERROR: getgroups() failure.\n");
    exit(1);
  } /* end if */
  printf("User is in %d groups.\n", numGroups);
  
  /* We could allocate just enough space to hold the group list;
     however, the number may have changed since we called getgroups()
     a moment ago!  Also the maximum number is generally quite small
     (less than 32).  Thus we have no reason not to just use the
     maximal array required. */
  if((numGroups = getgroups(ngroups_max, gidList)) < 0) {
    printf("ERROR: getgroups() failure.\n");
    if(errno == EINVAL) {
      /* In the case of EINVAL we know what happened. Many UNIXes
         provide additional diagnostics -- see your man pages. */
      printf("ERROR: ngroups_max != 0 && ngroups_max < # supplementary of groups\n");
    } /* end if */
    exit(2);
  } /* end if */

  if(numGroups >= 0) {
    /* Print the GIDs out */
    printf("The group ID list: ");
    for(i=0;i<numGroups;i++) {
      printf("%i ", gidList[i]);
    } /* end for */
    printf("\n");
    /* Convert the group IDs into group names. */
    printf("The group name list: ");
    for(i=0;i<numGroups;i++) {
      if((grEnt = getgrgid(gidList[i])) == NULL) {
        printf("??? ");
      } else {
        printf("%s ", grEnt->gr_name);
      } /* end if/else */
    } /* end for */
    printf("\n");
  } /* end if */

  return 0;
} /* end func main */

Generated by GNU Enscript 1.6.5.2.