| /* |
| * Copyright 2009 Sun Microsystems, Inc. All rights reserved. |
| * Use is subject to license terms. |
| */ |
| |
| /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ |
| /* All Rights Reserved */ |
| |
| |
| /* |
| * Copyright (c) 1980 Regents of the University of California. |
| * All rights reserved. The Berkeley software License Agreement |
| * specifies the terms and conditions for redistribution. |
| */ |
| |
| /* |
| * groups |
| */ |
| |
| #include <sys/types.h> |
| #include <sys/param.h> |
| #include <alloca.h> |
| #include <grp.h> |
| #include <pwd.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <unistd.h> |
| #include <string.h> |
| |
| static void showgroups(char *user); |
| |
| int |
| main(int argc, char *argv[]) |
| { |
| int ngroups, i; |
| char *sep = ""; |
| struct group *gr; |
| gid_t *groups; |
| int maxgrp = sysconf(_SC_NGROUPS_MAX); |
| |
| groups = alloca(maxgrp * sizeof (gid_t)); |
| |
| if (argc > 1) { |
| for (i = 1; i < argc; i++) |
| showgroups(argv[i]); |
| exit(0); |
| } |
| |
| ngroups = getgroups(maxgrp, groups); |
| if (getpwuid(getuid()) == NULL) { |
| (void) fprintf(stderr, "groups: could not find passwd entry\n"); |
| exit(1); |
| } |
| |
| for (i = 0; i < ngroups; i++) { |
| gr = getgrgid(groups[i]); |
| if (gr == NULL) { |
| (void) printf("%s%u", sep, groups[i]); |
| sep = " "; |
| continue; |
| } |
| (void) printf("%s%s", sep, gr->gr_name); |
| sep = " "; |
| } |
| |
| (void) printf("\n"); |
| return (0); |
| } |
| |
| static void |
| showgroups(char *user) |
| { |
| struct group *gr; |
| struct passwd *pw; |
| char **cp; |
| char *sep = ""; |
| int pwgid_printed = 0; |
| |
| if ((pw = getpwnam(user)) == NULL) { |
| (void) fprintf(stderr, "groups: %s : No such user\n", user); |
| return; |
| } |
| setgrent(); |
| (void) printf("%s : ", user); |
| while (gr = getgrent()) { |
| if (pw->pw_gid == gr->gr_gid) { |
| /* |
| * To avoid duplicate group entries |
| */ |
| if (pwgid_printed == 0) { |
| (void) printf("%s%s", sep, gr->gr_name); |
| sep = " "; |
| pwgid_printed = 1; |
| } |
| continue; |
| } |
| for (cp = gr->gr_mem; cp && *cp; cp++) |
| if (strcmp(*cp, user) == 0) { |
| (void) printf("%s%s", sep, gr->gr_name); |
| sep = " "; |
| break; |
| } |
| } |
| (void) printf("\n"); |
| endgrent(); |
| } |