groups.c revision 956e8222f10bf55e45b41d8b56084f72ebc113c9
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Use is subject to license terms.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/* All Rights Reserved */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Copyright (c) 1980 Regents of the University of California.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * All rights reserved. The Berkeley software License Agreement
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * specifies the terms and conditions for redistribution.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#pragma ident "%Z%%M% %I% %E% SMI"
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * groups
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister */
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister#include <sys/param.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <grp.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <pwd.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <stdio.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void showgroups(char *);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhint groups[NGROUPS_UMAX];
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhint
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhmain(int argc, char *argv[])
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int ngroups, i, j;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *sep = "";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh struct group *gr;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh struct passwd *pw;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (argc > 1) {
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister for (i=1; i < argc ; i++)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh showgroups(argv[i]);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh exit(0) ;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ngroups = getgroups(NGROUPS_UMAX, groups);
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne if ((pw = getpwuid(getuid())) == NULL) {
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne fprintf(stderr, "groups: could not find passwd entry\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh exit(1);
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh for (i = 0; i < ngroups; i++) {
4b4564630e2553df86b078f1fce1624dade2b2cbDavid Hollister gr = getgrgid(groups[i]);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (gr == NULL) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh printf("%s%d", sep, groups[i]);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sep = " ";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh continue;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh printf("%s%s", sep, gr->gr_name);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sep = " ";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhvoid
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhshowgroups(char *user)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh struct group *gr;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh struct passwd *pw;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char **cp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *sep = "";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int pwgid_printed = 0 ;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((pw = getpwnam(user)) == NULL) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh fprintf(stderr, "groups: %s : No such user\n", user);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh setgrent() ;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh printf("%s : ", user) ;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh while (gr = getgrent()) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (pw->pw_gid == gr->gr_gid) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * To avoid duplicate group entries
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (pwgid_printed==0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh printf("%s%s", sep, gr->gr_name);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sep = " ";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh pwgid_printed = 1 ;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh continue ;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh for (cp = gr->gr_mem; cp && *cp; cp++)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (strcmp(*cp, user) == 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh printf("%s%s", sep, gr->gr_name);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sep = " ";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh endgrent() ;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh