* 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.1 (Berkeley) %G%";
typedef struct passwd PW
;
void current
__P((void));
void err
__P((const char *, ...));
int gcmp
__P((const void *, const void *));
int Gflag
, gflag
, nflag
, rflag
, uflag
;
while ((ch
= getopt(argc
, argv
, "Ggnru")) != EOF
)
pw
= *argv
? who(*argv
) : NULL
;
if (Gflag
+ gflag
+ uflag
> 1)
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
);
register char *name
, **p
;
for (fmt
= "%s", lastid
= -1; gr
= getgrent(); lastid
= id
) {
for (p
= gr
->gr_mem
; p
&& *p
; p
++)
(void)printf(fmt
, gr
->gr_name
);
ngroups
= getgroups(NGROUPS
, groups
+ 1) + 1;
heapsort(groups
, ngroups
, sizeof(groups
[0]), gcmp
);
for (fmt
= "%s", lastid
= -1; --ngroups
>= 0;) {
if (lastid
== (id
= groups
[ngroups
]))
(void)printf(fmt
, gr
->gr_name
);
(void)printf(*fmt
== ' ' ? " %u" : "%u", id
);
register char *name
, **p
;
for (fmt
= "%u", lastid
= -1; gr
= getgrent(); lastid
= id
) {
for (p
= gr
->gr_mem
; p
&& *p
; p
++)
(void)printf(fmt
, gr
->gr_gid
);
ngroups
= getgroups(NGROUPS
, groups
+ 1) + 1;
heapsort(groups
, ngroups
, sizeof(groups
[0]), gcmp
);
for (fmt
= "%u", lastid
= -1; --ngroups
>= 0;) {
if (lastid
== (id
= groups
[ngroups
]))
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
)) {
heapsort(groups
, ngroups
, sizeof(groups
[0]), gcmp
);
for (fmt
= " groups=%u", lastid
= -1; --ngroups
>= 0;
fmt
= ", %u", lastid
= id
) {
(void)printf("(%s)", gr
->gr_name
);
(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
);
* 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
);
return(*(int *)b
- *(int *)a
);
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");