2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these librararies and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* $XConsortium: id.c /main/3 1995/11/01 19:06:11 rswiston $ */
24 /***************************************************************
26 * AT&T - PROPRIETARY *
28 * THIS IS PROPRIETARY SOURCE CODE LICENSED BY *
31 * Copyright (c) 1995 AT&T Corp. *
32 * All Rights Reserved *
34 * This software is licensed by AT&T Corp. *
35 * under the terms and conditions of the license in *
36 * http://www.research.att.com/orgs/ssr/book/reuse *
38 * This software was created by the *
39 * Software Engineering Research Department *
40 * AT&T Bell Laboratories *
42 * For further information contact *
43 * gsf@research.att.com *
45 ***************************************************************/
47 /* : : generated by proto : : */
49 #if !defined(__PROTO__)
50 #if defined(__STDC__) || defined(__cplusplus) || defined(_proto) || defined(c_plusplus)
51 #if defined(__cplusplus)
52 #define __MANGLE__ "C"
57 #define __PROTO__(x) x
59 #define __PARAM__(n,o) n
60 #if !defined(__STDC__) && !defined(__cplusplus)
61 #if !defined(c_plusplus)
72 #define __PROTO__(x) ()
73 #define __OTORP__(x) x
74 #define __PARAM__(n,o) o
82 #if defined(__cplusplus) || defined(c_plusplus)
83 #define __VARARG__ ...
87 #if defined(__STDARG__)
88 #define __VA_START__(p,a) va_start(p,a)
90 #define __VA_START__(p,a) va_start(p)
93 static const char id[] = "\n@(#)id (AT&T Bell Laboratories) 07/17/94\0\n";
97 #include "FEATURE/ids"
103 #if _lib_getfsgid && ( _sys_fss || _hdr_fsg )
104 #define fss_grp fs_grp
106 #define fss_mem fs_mem
107 #define fss_passwd fs_passwd
108 #define fss_shares fs_shares
115 #if !_lib_isfsg && !defined(isfsg)
116 #define isfsg(p) (!(p)->fs_id&&!(p)->fs_shares&&(!(p)->fs_passwd||!*(p)->fs_passwd))
123 #define power2(n) (!((n)&((n)-1)))
125 #define GG_FLAG (1<<0)
126 #define G_FLAG (1<<1)
127 #define N_FLAG (1<<2)
128 #define R_FLAG (1<<3)
129 #define U_FLAG (1<<4)
130 #define S_FLAG (1<<5)
131 #define O_FLAG (1<<6)
132 #define X_FLAG (1<<7)
136 getfsids __PARAM__((Sfio_t* sp, const char* name, int flags, register int lastchar), (sp, name, flags, lastchar)) __OTORP__(Sfio_t* sp; const char* name; int flags; register int lastchar;){
137 register struct fsg* fs;
144 if (flags & O_FLAG) flags = 1;
147 else if (flags & N_FLAG) flags = 1;
150 while (fs = getfsgnam(name))
155 if (flags > 0) x = 0;
166 if (!(x = newof(0, char*, q - p, n)))
168 s = (char*)(x + (q - p));
183 sfputr(sp, " fsid=", -1);
185 else if (!lastchar) lastchar = ' ';
186 else sfputc(sp, lastchar);
187 if (flags > 0) sfprintf(sp, "%s", s);
191 while (fs = getfsgnam(s))
194 if (flags < 0) sfprintf(sp, "%u", fs->fs_id);
195 else sfprintf(sp, "%u(%s)", fs->fs_id, s);
205 if (lastchar == ' ') sfputc(sp, '\n');
210 putid __PARAM__((Sfio_t* sp, int flags, const char* label, const char* name, long number), (sp, flags, label, name, number)) __OTORP__(Sfio_t* sp; int flags; const char* label; const char* name; long number;){
211 sfprintf(sp, "%s=", label);
214 if (name) sfputr(sp, name, -1);
215 else sfprintf(sp, "%lu", number);
219 sfprintf(sp, "%u", number);
220 if (name) sfprintf(sp, "(%s)", name);
225 getids __PARAM__((Sfio_t* sp, const char* name, register int flags), (sp, name, flags)) __OTORP__(Sfio_t* sp; const char* name; register int flags;){
226 register struct passwd* pw;
227 register struct group* grp;
232 register struct fsg* fs;
246 static gid_t* groups;
250 static int maxgroups;
253 * get supplemental groups if required
262 if ((maxgroups = getgroups(0, groups)) <= 0)
263 maxgroups = NGROUPS_MAX;
264 groups = newof(0, gid_t, maxgroups + 1, 0);
266 ngroups = getgroups(maxgroups, groups);
267 for (i = j = 0; i < ngroups; i++)
269 for (k = 0; k < j && groups[k] != groups[i]; k++);
270 if (k >= j) groups[j++] = groups[i];
277 if (!(flags & N_FLAG) || (flags & (G_FLAG|GG_FLAG)))
279 if (!(pw = getpwnam(name)))
281 user = strtol(name, &s, 0);
282 if (*s || !(pw = getpwuid(user)))
283 error(ERROR_exit(1), "%s: name not found", name);
290 if (!(flags & N_FLAG) || (flags & S_FLAG))
295 if (!(fs = getfsgnam(name)))
296 error(ERROR_exit(1), "%u: fss name not found", name);
305 group = (flags & R_FLAG) ? getgid() : getegid();
306 if (flags & (GG_FLAG|N_FLAG|U_FLAG))
307 user = (flags & R_FLAG) ? getuid() : geteuid();
313 name = (pw = getpwuid(user)) ? pw->pw_name : (char*)0;
315 if (ngroups == 1 && groups[0] == group)
317 if ((flags & N_FLAG) && (flags & G_FLAG))
318 gname = (grp = getgrgid(group)) ? grp->gr_name : (char*)0;
320 if ((flags & N_FLAG) && (flags & S_FLAG))
323 fs_name = (fs = getfsgid(fs_id)) ? fs->fs_grp : (char*)0;
326 if ((flags & (U_FLAG|G_FLAG|S_FLAG)) == (U_FLAG|G_FLAG|S_FLAG))
328 putid(sp, flags, "uid", name, user);
329 putid(sp, flags, " gid", gname, group);
330 if ((flags & X_FLAG) && name)
337 while (grp = getgrent())
343 sfputr(sp, " groups", -1);
344 sfputc(sp, lastchar);
347 sfprintf(sp, "%s", grp->gr_name);
348 else sfprintf(sp, "%u(%s)", grp->gr_gid, grp->gr_name);
355 getfsids(sp, name, flags, '=');
360 if ((euid = geteuid()) != user)
361 putid(sp, flags, " euid", (pw = getpwuid(euid)) ? pw->pw_name : (char*)0, euid);
362 if ((egid = getegid()) != group)
363 putid(sp, flags, " egid", (grp = getgrgid(egid)) ? grp->gr_name : (char*)0, egid);
366 sfputr(sp, " groups", -1);
368 for (i = 0; i < ngroups; i++)
371 sfputc(sp, lastchar);
372 if (grp = getgrgid(group))
374 if (flags & O_FLAG) sfprintf(sp, "%s", grp->gr_name);
375 else sfprintf(sp, "%u(%s)", group, grp->gr_name);
377 else sfprintf(sp, "%u", group);
382 putid(sp, flags, " fsid", fs_name, fs_id);
390 if ((flags & N_FLAG) && name) sfputr(sp, name, '\n');
391 else sfprintf(sp, "%u\n", user);
393 else if (flags & G_FLAG)
395 if ((flags & N_FLAG) && gname) sfputr(sp, gname, '\n');
396 else sfprintf(sp, "%u\n", group);
398 else if (flags & GG_FLAG)
400 if ((flags & X_FLAG) && name)
407 while (grp = getgrent())
412 if (i++) sfputc(sp, ' ');
413 if (flags & N_FLAG) sfprintf(sp, "%s", grp->gr_name);
414 else sfprintf(sp, "%u", grp->gr_gid);
419 if (i) sfputc(sp, '\n');
422 else if (ngroups > 0)
427 if ((flags & N_FLAG) && (grp = getgrgid(group)))
428 sfprintf(sp, "%s", grp->gr_name);
429 else sfprintf(sp, "%u", group);
430 if (++i >= ngroups) break;
437 else if (flags & S_FLAG)
439 if ((flags & X_FLAG) && name) getfsids(sp, name, flags, 0);
440 else if ((flags & N_FLAG) && fs_name) sfputr(sp, fs_name, '\n');
441 else sfprintf(sp, "%u\n", fs_id);
448 b_id __PARAM__((int argc, char *argv[]), (argc, argv)) __OTORP__(int argc; char *argv[];){
449 register int flags = 0;
454 while (n = optget(argv, "[Ggus]nr [user]")) switch (n)
475 error(2, opt_info.arg);
478 error(ERROR_usage(2), opt_info.arg);
481 argv += opt_info.index;
482 argc -= opt_info.index;
483 n = (flags & (GG_FLAG|G_FLAG|S_FLAG|U_FLAG));
485 error(2, "incompatible options selected");
486 if (error_info.errors || argc > 1)
487 error(ERROR_usage(2), optusage(NiL));
488 if (!(flags & ~N_FLAG))
490 if (flags & N_FLAG) flags |= O_FLAG;
491 flags |= (U_FLAG|G_FLAG|N_FLAG|R_FLAG|S_FLAG|GG_FLAG);
493 error_info.errors = getids(sfstdout, *argv, flags);
494 return(error_info.errors);