* Copyright (c) 1991, 1993
* The Regents of the University of California. All rights reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
static char copyright
[] =
"@(#) Copyright (c) 1991, 1993\n\
The Regents of the University of California. All rights reserved.\n";
static char sccsid
[] = "@(#)id.c 8.1 (Berkeley) 6/6/93";
void current
__P((void));
void err
__P((const char *, ...));
void pretty
__P((struct passwd
*));
void group
__P((struct passwd
*, int));
void user
__P((struct passwd
*));
int Gflag
, ch
, gflag
, id
, nflag
, pflag
, rflag
, uflag
;
Gflag
= gflag
= nflag
= pflag
= rflag
= uflag
= 0;
while ((ch
= getopt(argc
, argv
, "Ggnpru")) != EOF
)
switch(Gflag
+ gflag
+ pflag
+ uflag
) {
pw
= *argv
? who(*argv
) : NULL
;
id
= pw
? pw
->pw_gid
: rflag
? getgid() : getegid();
if (nflag
&& (gr
= getgrgid(id
)))
(void)printf("%s\n", gr
->gr_name
);
(void)printf("%u\n", id
);
id
= pw
? pw
->pw_uid
: rflag
? getuid() : geteuid();
if (nflag
&& (pw
= getpwuid(id
)))
(void)printf("%s\n", pw
->pw_name
);
(void)printf("%u\n", id
);
(void)printf("uid\t%s\n", pw
->pw_name
);
(void)printf("groups\t");
if ((login
= getlogin()) == NULL
)
err("getlogin: %s", strerror(errno
));
pw
= getpwuid(rid
= getuid());
if (pw
== NULL
|| strcmp(login
, pw
->pw_name
))
(void)printf("login\t%s\n", login
);
(void)printf("uid\t%s\n", pw
->pw_name
);
(void)printf("uid\t%u\n", rid
);
if ((eid
= geteuid()) != rid
)
(void)printf("euid\t%s", pw
->pw_name
);
(void)printf("euid\t%u", eid
);
if ((rid
= getgid()) != (eid
= getegid()))
(void)printf("rgid\t%s\n", gr
->gr_name
);
(void)printf("rgid\t%u\n", rid
);
(void)printf("groups\t");
int cnt
, id
, eid
, lastid
, ngroups
, groups
[NGROUPS
];
(void)printf("uid=%u", id
);
(void)printf("(%s)", pw
->pw_name
);
if ((eid
= geteuid()) != id
) {
(void)printf(" euid=%u", eid
);
(void)printf("(%s)", pw
->pw_name
);
(void)printf(" gid=%u", id
);
(void)printf("(%s)", gr
->gr_name
);
if ((eid
= getegid()) != id
) {
(void)printf(" egid=%u", eid
);
(void)printf("(%s)", gr
->gr_name
);
if (ngroups
= getgroups(NGROUPS
, groups
)) {
for (fmt
= " groups=%u", lastid
= -1, cnt
= 0; cnt
< ngroups
;
fmt
= ", %u", lastid
= id
) {
(void)printf("(%s)", gr
->gr_name
);
register struct passwd
*pw
;
register struct group
*gr
;
int cnt
, id
, lastid
, ngroups
, groups
[NGROUPS
+ 1];
(void)printf("uid=%u(%s)", id
, pw
->pw_name
);
(void)printf(" gid=%u", pw
->pw_gid
);
(void)printf("(%s)", gr
->gr_name
);
(void) getgrouplist(pw
->pw_name
, pw
->pw_gid
, groups
, &ngroups
);
for (lastid
= -1, cnt
= 0; cnt
< ngroups
; ++cnt
) {
if (lastid
== (id
= groups
[cnt
]))
(void)printf("(%s)", gr
->gr_name
);
int cnt
, id
, lastid
, ngroups
, groups
[NGROUPS
+ 1];
(void) getgrouplist(pw
->pw_name
, pw
->pw_gid
, groups
, &ngroups
);
ngroups
= getgroups(NGROUPS
, groups
+ 1) + 1;
fmt
= nflag
? "%s" : "%u";
for (lastid
= -1, cnt
= 0; cnt
< ngroups
; ++cnt
) {
if (lastid
== (id
= groups
[cnt
]))
(void)printf(fmt
, gr
->gr_name
);
(void)printf(*fmt
== ' ' ? " %u" : "%u",
* Translate user argument into a pw pointer. First, try to
* get it as specified. If that fails, try it as a number.
if (*u
&& !*ep
&& (pw
= getpwuid(id
)))
err("%s: No such user", u
);
err(const char *fmt
, ...)
(void)fprintf(stderr
, "id: ");
(void)vfprintf(stderr
, fmt
, ap
);
(void)fprintf(stderr
, "\n");
(void)fprintf(stderr
, "usage: id [user]\n");
(void)fprintf(stderr
, " id -G [-n] [user]\n");
(void)fprintf(stderr
, " id -g [-nr] [user]\n");
(void)fprintf(stderr
, " id -u [-nr] [user]\n");