xref: /titanic_51/usr/src/cmd/groups/groups.c (revision 8eea8e29cc4374d1ee24c25a07f45af132db3499)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2000 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
28 /*	  All Rights Reserved  	*/
29 
30 /*
31  * University Copyright- Copyright (c) 1982, 1986, 1988
32  * The Regents of the University of California
33  * All Rights Reserved
34  *
35  * University Acknowledgment- Portions of this document are derived from
36  * software developed by the University of California, Berkeley, and its
37  * contributors.
38  */
39 
40 #pragma ident	"%Z%%M%	%I%	%E% SMI"
41 
42 /*
43  * groups - show group memberships
44  */
45 /* LINTLIBRARY PROTOLIB1 */
46 
47 #include <grp.h>
48 #include <pwd.h>
49 #include <stdio.h>
50 #include <unistd.h>
51 #include <stdlib.h>
52 
53 extern struct group *getgrgid();
54 extern struct passwd *getpwnam();
55 extern int _getgroupsbymember(const char *, gid_t[], int, int);
56 
57 static void showgroups();
58 
59 static int ngroups_max;
60 
61 void
62 main(argc, argv)
63 	int argc;
64 	char *argv[];
65 {
66 	register int xval = 0;
67 	register struct passwd *pw;
68 
69 	ngroups_max = sysconf(_SC_NGROUPS_MAX);
70 
71 	if (ngroups_max < 0) {
72 		(void) fprintf(stderr,
73 			"groups: could not get configuration info\n");
74 		exit(1);
75 	}
76 
77 	if (ngroups_max == 0)
78 		exit(0);
79 
80 	if (argc == 1) {
81 
82 		if ((pw = getpwuid(getuid())) == NULL) {
83 			(void) fprintf(stderr, "groups: No passwd entry\n");
84 			xval = 1;
85 		} else
86 			showgroups(pw);
87 
88 	} else while (*++argv) {
89 
90 		if ((pw = getpwnam(*argv)) == NULL) {
91 			(void) fprintf(stderr,
92 				"groups: %s : No such user\n", *argv);
93 			xval = 1;
94 		} else {
95 			if (argc > 2)
96 				(void) printf("%s : ", *argv);
97 			showgroups(pw);
98 		}
99 	}
100 
101 	exit(xval);
102 
103 }
104 
105 static void
106 showgroups(pw)
107 	register struct passwd *pw;
108 {
109 	register struct group *gr;
110 	static gid_t *groups = NULL;
111 	int ngroups;
112 	int i;
113 
114 	if (groups == NULL) {
115 		if ((groups = (gid_t *)calloc((uint_t)ngroups_max,
116 						sizeof (gid_t))) == 0) {
117 			(void) fprintf(stderr,
118 				"allocation of %d bytes failed\n",
119 				ngroups_max * sizeof (gid_t));
120 			exit(1);
121 		}
122 	}
123 	groups[0] = pw->pw_gid;
124 
125 	ngroups = _getgroupsbymember(pw->pw_name, groups, ngroups_max, 1);
126 
127 	if (gr = getgrgid(groups[0]))
128 		(void) printf("%s", gr->gr_name);
129 	else
130 		(void) printf("%d", (int)pw->pw_gid);
131 
132 	for (i = 1; i < ngroups; i++) {
133 		if ((gr = getgrgid(groups[i])))
134 			(void) printf(" %s", gr->gr_name);
135 		else
136 			(void) printf(" %d", (int)groups[i]);
137 	}
138 
139 	(void) printf("\n");
140 }
141