* Copyright (c) 1991 The Regents of the University of California.
* 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
"@(#) Copyright (c) 1991 The Regents of the University of California.\n\
static char sccsid
[] = "@(#)id.c 5.1 (Berkeley) 6/29/91";
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");