version 1.13, 2003/06/10 22:20:47 |
version 1.14, 2004/01/07 22:18:14 |
|
|
{ |
{ |
struct group *gr; |
struct group *gr; |
struct passwd *pw; |
struct passwd *pw; |
int Gflag, ch, gflag, id, nflag, pflag, rflag, uflag; |
int Gflag, ch, gflag, nflag, pflag, rflag, uflag; |
|
uid_t uid; |
|
gid_t gid; |
|
|
Gflag = gflag = nflag = pflag = rflag = uflag = 0; |
Gflag = gflag = nflag = pflag = rflag = uflag = 0; |
while ((ch = getopt(argc, argv, "Ggnpru")) != -1) |
while ((ch = getopt(argc, argv, "Ggnpru")) != -1) |
|
|
pw = *argv ? who(*argv) : NULL; |
pw = *argv ? who(*argv) : NULL; |
|
|
if (gflag) { |
if (gflag) { |
id = pw ? pw->pw_gid : rflag ? getgid() : getegid(); |
gid = pw ? pw->pw_gid : rflag ? getgid() : getegid(); |
if (nflag && (gr = getgrgid(id))) |
if (nflag && (gr = getgrgid(gid))) |
(void)printf("%s\n", gr->gr_name); |
(void)printf("%s\n", gr->gr_name); |
else |
else |
(void)printf("%u\n", id); |
(void)printf("%u\n", gid); |
exit(0); |
exit(0); |
} |
} |
|
|
if (uflag) { |
if (uflag) { |
id = pw ? pw->pw_uid : rflag ? getuid() : geteuid(); |
uid = pw ? pw->pw_uid : rflag ? getuid() : geteuid(); |
if (nflag && (pw = getpwuid(id))) |
if (nflag && (pw = getpwuid(uid))) |
(void)printf("%s\n", pw->pw_name); |
(void)printf("%s\n", pw->pw_name); |
else |
else |
(void)printf("%u\n", id); |
(void)printf("%u\n", uid); |
exit(0); |
exit(0); |
} |
} |
|
|
|
|
struct group *gr; |
struct group *gr; |
struct passwd *pw; |
struct passwd *pw; |
int cnt, ngroups; |
int cnt, ngroups; |
uid_t id, eid; |
uid_t uid, euid; |
gid_t groups[NGROUPS], gid, lastgid; |
gid_t groups[NGROUPS], gid, egid, lastgid; |
char *fmt; |
char *fmt; |
|
|
id = getuid(); |
uid = getuid(); |
(void)printf("uid=%u", id); |
(void)printf("uid=%u", uid); |
if ((pw = getpwuid(id))) |
if ((pw = getpwuid(uid))) |
(void)printf("(%s)", pw->pw_name); |
(void)printf("(%s)", pw->pw_name); |
if ((eid = geteuid()) != id) { |
if ((euid = geteuid()) != uid) { |
(void)printf(" euid=%u", eid); |
(void)printf(" euid=%u", euid); |
if ((pw = getpwuid(eid))) |
if ((pw = getpwuid(euid))) |
(void)printf("(%s)", pw->pw_name); |
(void)printf("(%s)", pw->pw_name); |
} |
} |
id = getgid(); |
gid = getgid(); |
(void)printf(" gid=%u", id); |
(void)printf(" gid=%u", gid); |
if ((gr = getgrgid(id))) |
if ((gr = getgrgid(gid))) |
(void)printf("(%s)", gr->gr_name); |
(void)printf("(%s)", gr->gr_name); |
if ((eid = getegid()) != id) { |
if ((egid = getegid()) != gid) { |
(void)printf(" egid=%u", eid); |
(void)printf(" egid=%u", egid); |
if ((gr = getgrgid(eid))) |
if ((gr = getgrgid(egid))) |
(void)printf("(%s)", gr->gr_name); |
(void)printf("(%s)", gr->gr_name); |
} |
} |
if ((ngroups = getgroups(NGROUPS, groups))) { |
if ((ngroups = getgroups(NGROUPS, groups))) { |
|
|
void |
void |
user(struct passwd *pw) |
user(struct passwd *pw) |
{ |
{ |
|
gid_t gid, groups[NGROUPS + 1]; |
|
int cnt, ngroups; |
|
uid_t uid; |
struct group *gr; |
struct group *gr; |
char *fmt; |
char *fmt; |
int cnt, id, lastid, ngroups, groups[NGROUPS + 1]; |
|
|
|
id = pw->pw_uid; |
uid = pw->pw_uid; |
(void)printf("uid=%u(%s)", id, pw->pw_name); |
(void)printf("uid=%u(%s)", uid, pw->pw_name); |
(void)printf(" gid=%u", pw->pw_gid); |
(void)printf(" gid=%u", pw->pw_gid); |
if ((gr = getgrgid(pw->pw_gid))) |
if ((gr = getgrgid(pw->pw_gid))) |
(void)printf("(%s)", gr->gr_name); |
(void)printf("(%s)", gr->gr_name); |
ngroups = NGROUPS + 1; |
ngroups = NGROUPS + 1; |
(void) getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups); |
(void) getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups); |
fmt = " groups=%u"; |
fmt = " groups=%u"; |
for (lastid = -1, cnt = 0; cnt < ngroups; ++cnt) { |
for (cnt = 0; cnt < ngroups;) { |
if (lastid == (id = groups[cnt])) |
gid = groups[cnt]; |
continue; |
(void)printf(fmt, gid); |
(void)printf(fmt, id); |
|
fmt = ", %u"; |
fmt = ", %u"; |
if ((gr = getgrgid(id))) |
if ((gr = getgrgid(gid))) |
(void)printf("(%s)", gr->gr_name); |
(void)printf("(%s)", gr->gr_name); |
lastid = id; |
/* Skip same gid entries. */ |
|
while (++cnt < ngroups && gid == groups[cnt]); |
} |
} |
(void)printf("\n"); |
(void)printf("\n"); |
} |
} |
|
|
void |
void |
group(struct passwd *pw, int nflag) |
group(struct passwd *pw, int nflag) |
{ |
{ |
|
int cnt, ngroups; |
|
gid_t gid, groups[NGROUPS + 1]; |
|
uid_t uid; |
struct group *gr; |
struct group *gr; |
int cnt, id, lastid, ngroups; |
|
gid_t groups[NGROUPS + 1]; |
|
char *fmt; |
char *fmt; |
|
|
if (pw) { |
if (pw) { |
|
|
ngroups = getgroups(NGROUPS, groups + 1) + 1; |
ngroups = getgroups(NGROUPS, groups + 1) + 1; |
} |
} |
fmt = nflag ? "%s" : "%u"; |
fmt = nflag ? "%s" : "%u"; |
for (lastid = -1, cnt = 0; cnt < ngroups; ++cnt) { |
for (cnt = 0; cnt < ngroups;) { |
if (lastid == (id = groups[cnt])) |
gid = groups[cnt]; |
continue; |
|
if (nflag) { |
if (nflag) { |
if ((gr = getgrgid(id))) |
if ((gr = getgrgid(gid))) |
(void)printf(fmt, gr->gr_name); |
(void)printf(fmt, gr->gr_name); |
else |
else |
(void)printf(*fmt == ' ' ? " %u" : "%u", |
(void)printf(*fmt == ' ' ? " %u" : "%u", |
id); |
gid); |
fmt = " %s"; |
fmt = " %s"; |
} else { |
} else { |
(void)printf(fmt, id); |
(void)printf(fmt, gid); |
fmt = " %u"; |
fmt = " %u"; |
} |
} |
lastid = id; |
/* Skip same gid entries. */ |
|
while (++cnt < ngroups && gid == groups[cnt]); |
} |
} |
(void)printf("\n"); |
(void)printf("\n"); |
} |
} |
|
|
who(char *u) |
who(char *u) |
{ |
{ |
struct passwd *pw; |
struct passwd *pw; |
uid_t id; |
uid_t uid; |
char *ep; |
char *ep; |
|
|
/* |
/* |
|
|
*/ |
*/ |
if ((pw = getpwnam(u))) |
if ((pw = getpwnam(u))) |
return(pw); |
return(pw); |
id = strtoul(u, &ep, 10); |
uid = strtoul(u, &ep, 10); |
if (*u && !*ep && (pw = getpwuid(id))) |
if (*u && !*ep && (pw = getpwuid(uid))) |
return(pw); |
return(pw); |
errx(1, "%s: No such user", u); |
errx(1, "%s: No such user", u); |
/* NOTREACHED */ |
/* NOTREACHED */ |