* Copyright (c) 1991 The Regents of the University of California.
* %sccs.include.redist.c%
"@(#) Copyright (c) 1991 The Regents of the University of California.\n\
static char sccsid
[] = "@(#)id.c 5.4 (Berkeley) %G%";
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
);
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 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; --ngroups
>= 0;
fmt
= ", %u", lastid
= id
) {
(void)printf("(%s)", gr
->gr_name
);
register struct passwd
*pw
;
register struct group
*gr
;
(void)printf("uid=%u(%s)", id
, pw
->pw_name
);
(void)printf(" gid=%u", pw
->pw_gid
);
(void)printf("(%s)", gr
->gr_name
);
for (fmt
= " groups=%u(%s)", lastid
= -1; gr
= getgrent();
if (pw
->pw_gid
== gr
->gr_gid
)
for (p
= gr
->gr_mem
; p
&& *p
; p
++)
if (!strcmp(*p
, pw
->pw_name
)) {
(void)printf(fmt
, gr
->gr_gid
, gr
->gr_name
);
int id
, lastid
, ngroups
, groups
[NGROUPS
+ 1];
fmt
= nflag
? "%s" : "%u";
while (gr
= getgrent()) {
for (p
= gr
->gr_mem
; p
&& *p
; p
++)
(void)printf(fmt
, gr
->gr_name
);
(void)printf(fmt
, gr
->gr_gid
);
ngroups
= getgroups(NGROUPS
, groups
+ 1) + 1;
for (lastid
= -1; --ngroups
>= 0;) {
if (lastid
== (id
= groups
[ngroups
]))
(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");