Home | History | Annotate | Download | only in groups
      1 /*
      2  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
      3  * Use is subject to license terms.
      4  */
      5 
      6 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
      7 /*	  All Rights Reserved  	*/
      8 
      9 
     10 /*
     11  * Copyright (c) 1980 Regents of the University of California.
     12  * All rights reserved. The Berkeley software License Agreement
     13  * specifies the terms and conditions for redistribution.
     14  */
     15 
     16 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     17 
     18 /*
     19  * groups
     20  */
     21 
     22 #include <sys/types.h>
     23 #include <sys/param.h>
     24 #include <grp.h>
     25 #include <pwd.h>
     26 #include <stdio.h>
     27 #include <stdlib.h>
     28 #include <unistd.h>
     29 #include <string.h>
     30 
     31 static void showgroups(char *user);
     32 
     33 int
     34 main(int argc, char *argv[])
     35 {
     36 	int ngroups, i;
     37 	char *sep = "";
     38 	struct group *gr;
     39 	gid_t groups[NGROUPS_UMAX];
     40 
     41 	if (argc > 1) {
     42 		for (i = 1; i < argc; i++)
     43 			showgroups(argv[i]);
     44 		exit(0);
     45 	}
     46 
     47 	ngroups = getgroups(NGROUPS_UMAX, groups);
     48 	if (getpwuid(getuid()) == NULL) {
     49 		(void) fprintf(stderr, "groups: could not find passwd entry\n");
     50 		exit(1);
     51 	}
     52 
     53 	for (i = 0; i < ngroups; i++) {
     54 		gr = getgrgid(groups[i]);
     55 		if (gr == NULL) {
     56 			(void) printf("%s%u", sep, groups[i]);
     57 			sep = " ";
     58 			continue;
     59 		}
     60 		(void) printf("%s%s", sep, gr->gr_name);
     61 		sep = " ";
     62 	}
     63 
     64 	(void) printf("\n");
     65 	return (0);
     66 }
     67 
     68 static void
     69 showgroups(char *user)
     70 {
     71 	struct group *gr;
     72 	struct passwd *pw;
     73 	char **cp;
     74 	char *sep = "";
     75 	int pwgid_printed = 0;
     76 
     77 	if ((pw = getpwnam(user)) == NULL) {
     78 		(void) fprintf(stderr, "groups: %s : No such user\n", user);
     79 		return;
     80 	}
     81 	setgrent();
     82 	(void) printf("%s : ", user);
     83 	while (gr = getgrent()) {
     84 		if (pw->pw_gid == gr->gr_gid) {
     85 			/*
     86 			 * To avoid duplicate group entries
     87 			 */
     88 			if (pwgid_printed == 0) {
     89 			    (void) printf("%s%s", sep, gr->gr_name);
     90 			    sep = " ";
     91 			    pwgid_printed = 1;
     92 			}
     93 			continue;
     94 		}
     95 		for (cp = gr->gr_mem; cp && *cp; cp++)
     96 			if (strcmp(*cp, user) == 0) {
     97 				(void) printf("%s%s", sep, gr->gr_name);
     98 				sep = " ";
     99 				break;
    100 			}
    101 	}
    102 	(void) printf("\n");
    103 	endgrent();
    104 }
    105