da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1992-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* http://www.opensource.org/licenses/cpl1.0.txt *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#pragma prototyped
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * David Korn
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Glenn Fowler
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Research
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * id
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic const char usage[] =
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[-?\n@(#)$Id: id (AT&T Research) 2004-06-11 $\n]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinUSAGE_LICENSE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+NAME?id - return user identity]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+DESCRIPTION?If no \auser\a operand is specified \bid\b writes user and "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "group IDs and the corresponding user and group names of the "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "invoking process to standard output. If the effective and "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "real IDs do not match, both are written. Any supplementary "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "groups the current process belongs to will also be written.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+?If a \auser\a operand is specified and the process has permission, "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "the user and group IDs and any supplementary group IDs of the "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "selected user will be written to standard output.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+?If any options are specified, then only a portion of the information "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "is written.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[n:name?Write the name instead of the numeric ID.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[r:real?Writes real ID instead of the effective ID.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[[a?This option is ignored.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[g:group?Writes only the group ID.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[u:user?Writes only the user ID.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[G:groups?Writes only the supplementary group IDs.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[s:fair-share?Writes fair share scheduler IDs and groups on systems that "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "support fair share scheduling.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"\n"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"\n[user]\n"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"\n"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+EXIT STATUS?]{"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "[+0?Successful completion.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "[+>0?An error occurred.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"}"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+SEE ALSO?\blogname\b(1), \bwho\b(1), \bgetgroups\b(2)]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <cmd.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "FEATURE/ids"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <grp.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <pwd.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_fsid
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_getfsgid && ( _sys_fss || _hdr_fsg )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define fss_grp fs_grp
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define fss_id fs_id
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define fss_mem fs_mem
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define fss_passwd fs_passwd
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define fss_shares fs_shares
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _sys_fss
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <sys/fss.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _hdr_fsg
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <fsg.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !_lib_isfsg && !defined(isfsg)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define isfsg(p) (!(p)->fs_id&&!(p)->fs_shares&&(!(p)->fs_passwd||!*(p)->fs_passwd))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _lib_fsid
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define power2(n) (!((n)&((n)-1)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define GG_FLAG (1<<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define G_FLAG (1<<1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define N_FLAG (1<<2)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define R_FLAG (1<<3)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define U_FLAG (1<<4)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_FLAG (1<<5)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define O_FLAG (1<<6)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define X_FLAG (1<<7)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_fsid
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chingetfsids(Sfio_t* sp, const char* name, int flags, register int lastchar)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register struct fsg* fs;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char** p;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char** x;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (lastchar)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & O_FLAG) flags = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else flags = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (flags & N_FLAG) flags = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else flags = -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin setfsgent();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (fs = getfsgnam(name))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!isfsg(fs))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (p = fs->fs_mem)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags > 0) x = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char** q;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin q = p;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (s = *q++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n += strlen(s) + 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(x = newof(0, char*, q - p, n)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = (char*)(x + (q - p));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin q = x;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (t = *p++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *q++ = s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*s++ = *t++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *q = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p = x;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (s = *p++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (lastchar == '=')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin lastchar = ',';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputr(sp, " fsid=", -1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (!lastchar) lastchar = ' ';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else sfputc(sp, lastchar);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags > 0) sfprintf(sp, "%s", s);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin setfsgent();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (fs = getfsgnam(s))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (isfsg(fs))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags < 0) sfprintf(sp, "%u", fs->fs_id);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else sfprintf(sp, "%u(%s)", fs->fs_id, s);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (x) free(x);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin endfsgent();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (lastchar == ' ') sfputc(sp, '\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinputid(Sfio_t* sp, int flags, const char* label, const char* name, long number)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp, "%s=", label);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & O_FLAG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (name) sfputr(sp, name, -1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else sfprintf(sp, "%lu", number);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp, "%u", number);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (name) sfprintf(sp, "(%s)", name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chingetids(Sfio_t* sp, const char* name, register int flags)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register struct passwd* pw;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register struct group* grp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int j;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int k;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_fsid
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register struct fsg* fs;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const char* fs_name;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int fs_id;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char** p;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int lastchar;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int ngroups = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const char* gname;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin uid_t user;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin uid_t euid;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin gid_t group;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin gid_t egid;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static gid_t* groups;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & GG_FLAG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static int maxgroups;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * get supplemental groups if required
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!maxgroups)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * first time
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((maxgroups = getgroups(0, groups)) <= 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin maxgroups = NGROUPS_MAX;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(groups = newof(0, gid_t, maxgroups + 1, 0)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_exit(1), "out of space [group array]");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ngroups = getgroups(maxgroups, groups);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (i = j = 0; i < ngroups; i++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (k = 0; k < j && groups[k] != groups[i]; k++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (k >= j) groups[j++] = groups[i];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ngroups = j;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (name)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= X_FLAG;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & N_FLAG) || (flags & (G_FLAG|GG_FLAG)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(pw = getpwnam(name)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin user = strtol(name, &s, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*s || !(pw = getpwuid(user)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_exit(1), "%s: name not found", name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin name = pw->pw_name;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin user = pw->pw_uid;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin group = pw->pw_gid;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_fsid
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & N_FLAG) || (flags & S_FLAG))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin setfsgent();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(fs = getfsgnam(name)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_exit(1), "%u: fss name not found", name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } while (isfsg(fs));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fs_id = fs->fs_id;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & G_FLAG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin group = (flags & R_FLAG) ? getgid() : getegid();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & (GG_FLAG|N_FLAG|U_FLAG))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin user = (flags & R_FLAG) ? getuid() : geteuid();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_fsid
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & S_FLAG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fs_id = fsid(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & N_FLAG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin name = (pw = getpwuid(user)) ? pw->pw_name : (char*)0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (ngroups == 1 && groups[0] == group)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ngroups = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((flags & N_FLAG) && (flags & G_FLAG))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin gname = (grp = getgrgid(group)) ? grp->gr_name : (char*)0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_fsid
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((flags & N_FLAG) && (flags & S_FLAG))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin setfsgent();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fs_name = (fs = getfsgid(fs_id)) ? fs->fs_grp : (char*)0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((flags & (U_FLAG|G_FLAG|S_FLAG)) == (U_FLAG|G_FLAG|S_FLAG))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin putid(sp, flags, "uid", name, user);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin putid(sp, flags, " gid", gname, group);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((flags & X_FLAG) && name)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_getgrent
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_setgrent
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin setgrent();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin lastchar = '=';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (grp = getgrent())
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (p = grp->gr_mem)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (s = *p++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (streq(s, name))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (lastchar == '=')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputr(sp, " groups", -1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputc(sp, lastchar);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin lastchar = ',';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & O_FLAG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp, "%s", grp->gr_name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else sfprintf(sp, "%u(%s)", grp->gr_gid, grp->gr_name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_endgrent
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin endgrent();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_fsid
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin getfsids(sp, name, flags, '=');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((euid = geteuid()) != user)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin putid(sp, flags, " euid", (pw = getpwuid(euid)) ? pw->pw_name : (char*)0, euid);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((egid = getegid()) != group)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin putid(sp, flags, " egid", (grp = getgrgid(egid)) ? grp->gr_name : (char*)0, egid);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (ngroups > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputr(sp, " groups", -1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin lastchar = '=';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (i = 0; i < ngroups; i++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin group = groups[i];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputc(sp, lastchar);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (grp = getgrgid(group))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & O_FLAG) sfprintf(sp, "%s", grp->gr_name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else sfprintf(sp, "%u(%s)", group, grp->gr_name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else sfprintf(sp, "%u", group);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin lastchar = ',';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_fsid
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin putid(sp, flags, " fsid", fs_name, fs_id);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputc(sp,'\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & U_FLAG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((flags & N_FLAG) && name) sfputr(sp, name, '\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else sfprintf(sp, "%u\n", user);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (flags & G_FLAG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((flags & N_FLAG) && gname) sfputr(sp, gname, '\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else sfprintf(sp, "%u\n", group);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (flags & GG_FLAG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((flags & X_FLAG) && name)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_getgrent
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_setgrent
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin setgrent();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (grp = getgrent())
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (p = grp->gr_mem)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (s = *p++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (streq(s, name))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (i++) sfputc(sp, ' ');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & N_FLAG) sfprintf(sp, "%s", grp->gr_name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else sfprintf(sp, "%u", grp->gr_gid);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_endgrent
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin endgrent();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (i) sfputc(sp, '\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (ngroups > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (i = 0;;)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin group = groups[i];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((flags & N_FLAG) && (grp = getgrgid(group)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp, "%s", grp->gr_name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else sfprintf(sp, "%u", group);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (++i >= ngroups) break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputc(sp, ' ');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputc(sp, '\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_fsid
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (flags & S_FLAG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((flags & X_FLAG) && name) getfsids(sp, name, flags, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if ((flags & N_FLAG) && fs_name) sfputr(sp, fs_name, '\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else sfprintf(sp, "%u\n", fs_id);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinb_id(int argc, char *argv[], void* context)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int flags = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cmdinit(argc, argv, context, ERROR_CATALOG, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (n = optget(argv, usage)) switch (n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'a':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'G':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= GG_FLAG;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'g':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= G_FLAG;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'n':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= N_FLAG;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'r':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= R_FLAG;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 's':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= S_FLAG;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'u':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= U_FLAG;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case ':':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(2, "%s", opt_info.arg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '?':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_usage(2), "%s", opt_info.arg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin argv += opt_info.index;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin argc -= opt_info.index;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = (flags & (GG_FLAG|G_FLAG|S_FLAG|U_FLAG));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!power2(n))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(2, "incompatible options selected");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (error_info.errors || argc > 1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_usage(2), "%s", optusage(NiL));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & ~(N_FLAG|R_FLAG)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & N_FLAG) flags |= O_FLAG;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= (U_FLAG|G_FLAG|N_FLAG|R_FLAG|S_FLAG|GG_FLAG);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error_info.errors = getids(sfstdout, *argv, flags);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(error_info.errors);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}