Annotation of src/usr.bin/id/id.c, Revision 1.1.1.1
1.1 deraadt 1: /*-
2: * Copyright (c) 1991, 1993
3: * The Regents of the University of California. All rights reserved.
4: *
5: * Redistribution and use in source and binary forms, with or without
6: * modification, are permitted provided that the following conditions
7: * are met:
8: * 1. Redistributions of source code must retain the above copyright
9: * notice, this list of conditions and the following disclaimer.
10: * 2. Redistributions in binary form must reproduce the above copyright
11: * notice, this list of conditions and the following disclaimer in the
12: * documentation and/or other materials provided with the distribution.
13: * 3. All advertising materials mentioning features or use of this software
14: * must display the following acknowledgement:
15: * This product includes software developed by the University of
16: * California, Berkeley and its contributors.
17: * 4. Neither the name of the University nor the names of its contributors
18: * may be used to endorse or promote products derived from this software
19: * without specific prior written permission.
20: *
21: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31: * SUCH DAMAGE.
32: */
33:
34: #ifndef lint
35: static char copyright[] =
36: "@(#) Copyright (c) 1991, 1993\n\
37: The Regents of the University of California. All rights reserved.\n";
38: #endif /* not lint */
39:
40: #ifndef lint
41: /*static char sccsid[] = "@(#)id.c 8.3 (Berkeley) 4/28/95";*/
42: static char rcsid[] = "$NetBSD: id.c,v 1.7 1995/09/28 08:05:42 perry Exp $";
43: #endif /* not lint */
44:
45: #include <sys/param.h>
46:
47: #include <errno.h>
48: #include <grp.h>
49: #include <pwd.h>
50: #include <stdio.h>
51: #include <stdlib.h>
52: #include <string.h>
53: #include <unistd.h>
54:
55: void current __P((void));
56: void err __P((const char *, ...));
57: void pretty __P((struct passwd *));
58: void group __P((struct passwd *, int));
59: void usage __P((void));
60: void user __P((struct passwd *));
61: struct passwd *
62: who __P((char *));
63:
64: int
65: main(argc, argv)
66: int argc;
67: char *argv[];
68: {
69: struct group *gr;
70: struct passwd *pw;
71: int Gflag, ch, gflag, id, nflag, pflag, rflag, uflag;
72:
73: Gflag = gflag = nflag = pflag = rflag = uflag = 0;
74: while ((ch = getopt(argc, argv, "Ggnpru")) != EOF)
75: switch(ch) {
76: case 'G':
77: Gflag = 1;
78: break;
79: case 'g':
80: gflag = 1;
81: break;
82: case 'n':
83: nflag = 1;
84: break;
85: case 'p':
86: pflag = 1;
87: break;
88: case 'r':
89: rflag = 1;
90: break;
91: case 'u':
92: uflag = 1;
93: break;
94: case '?':
95: default:
96: usage();
97: }
98: argc -= optind;
99: argv += optind;
100:
101: switch(Gflag + gflag + pflag + uflag) {
102: case 1:
103: break;
104: case 0:
105: if (!nflag && !rflag)
106: break;
107: /* FALLTHROUGH */
108: default:
109: usage();
110: }
111:
112: pw = *argv ? who(*argv) : NULL;
113:
114: if (gflag) {
115: id = pw ? pw->pw_gid : rflag ? getgid() : getegid();
116: if (nflag && (gr = getgrgid(id)))
117: (void)printf("%s\n", gr->gr_name);
118: else
119: (void)printf("%u\n", id);
120: exit(0);
121: }
122:
123: if (uflag) {
124: id = pw ? pw->pw_uid : rflag ? getuid() : geteuid();
125: if (nflag && (pw = getpwuid(id)))
126: (void)printf("%s\n", pw->pw_name);
127: else
128: (void)printf("%u\n", id);
129: exit(0);
130: }
131:
132: if (Gflag) {
133: group(pw, nflag);
134: exit(0);
135: }
136:
137: if (pflag) {
138: pretty(pw);
139: exit(0);
140: }
141:
142: if (pw)
143: user(pw);
144: else
145: current();
146: exit(0);
147: }
148:
149: void
150: pretty(pw)
151: struct passwd *pw;
152: {
153: struct group *gr;
154: u_int eid, rid;
155: char *login;
156:
157: if (pw) {
158: (void)printf("uid\t%s\n", pw->pw_name);
159: (void)printf("groups\t");
160: group(pw, 1);
161: } else {
162: if ((login = getlogin()) == NULL)
163: err("getlogin: %s", strerror(errno));
164:
165: pw = getpwuid(rid = getuid());
166: if (pw == NULL || strcmp(login, pw->pw_name))
167: (void)printf("login\t%s\n", login);
168: if (pw)
169: (void)printf("uid\t%s\n", pw->pw_name);
170: else
171: (void)printf("uid\t%u\n", rid);
172:
173: if ((eid = geteuid()) != rid)
174: if (pw = getpwuid(eid))
175: (void)printf("euid\t%s", pw->pw_name);
176: else
177: (void)printf("euid\t%u", eid);
178: if ((rid = getgid()) != (eid = getegid()))
179: if (gr = getgrgid(rid))
180: (void)printf("rgid\t%s\n", gr->gr_name);
181: else
182: (void)printf("rgid\t%u\n", rid);
183: (void)printf("groups\t");
184: group(NULL, 1);
185: }
186: }
187:
188: void
189: current()
190: {
191: struct group *gr;
192: struct passwd *pw;
193: int cnt, id, eid, lastid, ngroups;
194: gid_t groups[NGROUPS];
195: char *fmt;
196:
197: id = getuid();
198: (void)printf("uid=%u", id);
199: if (pw = getpwuid(id))
200: (void)printf("(%s)", pw->pw_name);
201: if ((eid = geteuid()) != id) {
202: (void)printf(" euid=%u", eid);
203: if (pw = getpwuid(eid))
204: (void)printf("(%s)", pw->pw_name);
205: }
206: id = getgid();
207: (void)printf(" gid=%u", id);
208: if (gr = getgrgid(id))
209: (void)printf("(%s)", gr->gr_name);
210: if ((eid = getegid()) != id) {
211: (void)printf(" egid=%u", eid);
212: if (gr = getgrgid(eid))
213: (void)printf("(%s)", gr->gr_name);
214: }
215: if (ngroups = getgroups(NGROUPS, groups)) {
216: for (fmt = " groups=%u", lastid = -1, cnt = 0; cnt < ngroups;
217: fmt = ", %u", lastid = id) {
218: id = groups[cnt++];
219: if (lastid == id)
220: continue;
221: (void)printf(fmt, id);
222: if (gr = getgrgid(id))
223: (void)printf("(%s)", gr->gr_name);
224: }
225: }
226: (void)printf("\n");
227: }
228:
229: void
230: user(pw)
231: register struct passwd *pw;
232: {
233: register struct group *gr;
234: register char *fmt, **p;
235: int cnt, id, lastid, ngroups, groups[NGROUPS + 1];
236:
237: id = pw->pw_uid;
238: (void)printf("uid=%u(%s)", id, pw->pw_name);
239: (void)printf(" gid=%u", pw->pw_gid);
240: if (gr = getgrgid(pw->pw_gid))
241: (void)printf("(%s)", gr->gr_name);
242: ngroups = NGROUPS + 1;
243: (void) getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups);
244: fmt = " groups=%u";
245: for (lastid = -1, cnt = 0; cnt < ngroups; ++cnt) {
246: if (lastid == (id = groups[cnt]))
247: continue;
248: (void)printf(fmt, id);
249: fmt = " %u";
250: if (gr = getgrgid(id))
251: (void)printf("(%s)", gr->gr_name);
252: lastid = id;
253: }
254: (void)printf("\n");
255: }
256:
257: void
258: group(pw, nflag)
259: struct passwd *pw;
260: int nflag;
261: {
262: struct group *gr;
263: int cnt, id, lastid, ngroups;
264: gid_t groups[NGROUPS + 1];
265: char *fmt;
266:
267: if (pw) {
268: ngroups = NGROUPS + 1;
269: (void) getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups);
270: } else {
271: groups[0] = getgid();
272: ngroups = getgroups(NGROUPS, groups + 1) + 1;
273: }
274: fmt = nflag ? "%s" : "%u";
275: for (lastid = -1, cnt = 0; cnt < ngroups; ++cnt) {
276: if (lastid == (id = groups[cnt]))
277: continue;
278: if (nflag) {
279: if (gr = getgrgid(id))
280: (void)printf(fmt, gr->gr_name);
281: else
282: (void)printf(*fmt == ' ' ? " %u" : "%u",
283: id);
284: fmt = " %s";
285: } else {
286: (void)printf(fmt, id);
287: fmt = " %u";
288: }
289: lastid = id;
290: }
291: (void)printf("\n");
292: }
293:
294: struct passwd *
295: who(u)
296: char *u;
297: {
298: struct passwd *pw;
299: long id;
300: char *ep;
301:
302: /*
303: * Translate user argument into a pw pointer. First, try to
304: * get it as specified. If that fails, try it as a number.
305: */
306: if (pw = getpwnam(u))
307: return(pw);
308: id = strtol(u, &ep, 10);
309: if (*u && !*ep && (pw = getpwuid(id)))
310: return(pw);
311: err("%s: No such user", u);
312: /* NOTREACHED */
313: }
314:
315: #if __STDC__
316: #include <stdarg.h>
317: #else
318: #include <varargs.h>
319: #endif
320:
321: void
322: #if __STDC__
323: err(const char *fmt, ...)
324: #else
325: err(fmt, va_alist)
326: char *fmt;
327: va_dcl
328: #endif
329: {
330: va_list ap;
331: #if __STDC__
332: va_start(ap, fmt);
333: #else
334: va_start(ap);
335: #endif
336: (void)fprintf(stderr, "id: ");
337: (void)vfprintf(stderr, fmt, ap);
338: va_end(ap);
339: (void)fprintf(stderr, "\n");
340: exit(1);
341: /* NOTREACHED */
342: }
343:
344: void
345: usage()
346: {
347: (void)fprintf(stderr, "usage: id [user]\n");
348: (void)fprintf(stderr, " id -G [-n] [user]\n");
349: (void)fprintf(stderr, " id -g [-nr] [user]\n");
350: (void)fprintf(stderr, " id -u [-nr] [user]\n");
351: exit(1);
352: }