X-Git-Url: https://git.saurik.com/apple/shell_cmds.git/blobdiff_plain/44bd5ea795281151bc7b81a65d2dd42c6b8914d8..06a885f378573fb30cd55792407f220c85a43ae5:/id/id.c diff --git a/id/id.c b/id/id.c index b8732a0..2567770 100644 --- a/id/id.c +++ b/id/id.c @@ -31,21 +31,28 @@ * SUCH DAMAGE. */ -#include #ifndef lint -__COPYRIGHT("@(#) Copyright (c) 1991, 1993\n\ - The Regents of the University of California. All rights reserved.\n"); +static const char copyright[] = +"@(#) Copyright (c) 1991, 1993\n\ + The Regents of the University of California. All rights reserved.\n"; #endif /* not lint */ #ifndef lint #if 0 -static char sccsid[] = "@(#)id.c 8.3 (Berkeley) 4/28/95"; -#else -__RCSID("$NetBSD: id.c,v 1.10 1998/08/25 20:59:37 ross Exp $"); +static char sccsid[] = "@(#)id.c 8.2 (Berkeley) 2/16/94"; #endif #endif /* not lint */ +#include +__FBSDID("$FreeBSD: src/usr.bin/id/id.c,v 1.33 2006/12/29 12:28:34 stefanf Exp $"); #include +#ifndef __APPLE__ +#include +#endif /* !__APPLE__ */ + +#ifdef USE_BSM_AUDIT +#include +#endif #include #include @@ -56,45 +63,70 @@ __RCSID("$NetBSD: id.c,v 1.10 1998/08/25 20:59:37 ross Exp $"); #include #include -void current __P((void)); -void pretty __P((struct passwd *)); -int main __P((int, char **)); -void group __P((struct passwd *, int)); -void usage __P((void)); -void user __P((struct passwd *)); -struct passwd * - who __P((char *)); +void id_print(struct passwd *, int, int, int); +void pline(struct passwd *); +void pretty(struct passwd *); +void auditid(void); +void fullname(struct passwd *); +void group(struct passwd *, int); +void maclabel(void); +void usage(void); +struct passwd *who(char *); + +int isgroups, iswhoami; #ifdef __APPLE__ -extern char *__progname; +// SPI for 5235093 +int32_t getgrouplist_2(const char *, gid_t, gid_t **); #endif int -main(argc, argv) - int argc; - char *argv[]; +main(int argc, char *argv[]) { struct group *gr; struct passwd *pw; - int ch, id; - int Gflag, gflag, nflag, pflag, rflag, uflag; + int Gflag, Mflag, Pflag, ch, gflag, id, nflag, pflag, rflag, uflag; + int Aflag; + int Fflag; + const char *myname; - Gflag = gflag = nflag = pflag = rflag = uflag = 0; + Gflag = Mflag = Pflag = gflag = nflag = pflag = rflag = uflag = 0; + Aflag = 0; + Fflag = 0; - if (!strcmp(__progname, "groups")) { - Gflag = 1; - nflag = 1; - } - else if (!strcmp(__progname, "whoami")) { - uflag = 1; - nflag = 1; - } + myname = strrchr(argv[0], '/'); + myname = (myname != NULL) ? myname + 1 : argv[0]; + if (strcmp(myname, "groups") == 0) { + isgroups = 1; + Gflag = nflag = 1; + } + else if (strcmp(myname, "whoami") == 0) { + iswhoami = 1; + uflag = nflag = 1; + } - while ((ch = getopt(argc, argv, "Ggnpru")) != -1) + while ((ch = getopt(argc, argv, + (isgroups || iswhoami) ? "" : "AFPGMagnpru")) != -1) switch(ch) { +#ifdef USE_BSM_AUDIT + case 'A': + Aflag = 1; + break; +#endif + case 'F': + Fflag = 1; + break; case 'G': Gflag = 1; break; + case 'M': + Mflag = 1; + break; + case 'P': + Pflag = 1; + break; + case 'a': + break; case 'g': gflag = 1; break; @@ -117,7 +149,10 @@ main(argc, argv) argc -= optind; argv += optind; - switch(Gflag + gflag + pflag + uflag) { + if (iswhoami && argc > 0) + usage(); + + switch(Aflag + Fflag + Gflag + Mflag + Pflag + gflag + pflag + uflag) { case 1: break; case 0: @@ -130,6 +165,21 @@ main(argc, argv) pw = *argv ? who(*argv) : NULL; + if (Mflag && pw != NULL) + usage(); + +#ifdef USE_BSM_AUDIT + if (Aflag) { + auditid(); + exit(0); + } +#endif + + if (Fflag) { + fullname(pw); + exit(0); + } + if (gflag) { id = pw ? pw->pw_gid : rflag ? getgid() : getegid(); if (nflag && (gr = getgrgid(id))) @@ -153,21 +203,34 @@ main(argc, argv) exit(0); } + if (Mflag) { + maclabel(); + exit(0); + } + + if (Pflag) { + pline(pw); + exit(0); + } + if (pflag) { pretty(pw); exit(0); } - if (pw) - user(pw); - else - current(); + if (pw) { + id_print(pw, 1, 0, 0); + } + else { + id = getuid(); + pw = getpwuid(id); + id_print(pw, 0, 1, 1); + } exit(0); } void -pretty(pw) - struct passwd *pw; +pretty(struct passwd *pw) { struct group *gr; u_int eid, rid; @@ -188,15 +251,15 @@ pretty(pw) (void)printf("uid\t%s\n", pw->pw_name); else (void)printf("uid\t%u\n", rid); - + if ((eid = geteuid()) != rid) { - if ((pw = getpwuid(eid)) != NULL) - (void)printf("euid\t%s", pw->pw_name); + if ((pw = getpwuid(eid))) + (void)printf("euid\t%s\n", pw->pw_name); else - (void)printf("euid\t%u", eid); + (void)printf("euid\t%u\n", eid); } if ((rid = getgid()) != (eid = getegid())) { - if ((gr = getgrgid(rid)) != NULL) + if ((gr = getgrgid(rid))) (void)printf("rgid\t%s\n", gr->gr_name); else (void)printf("rgid\t%u\n", rid); @@ -207,88 +270,148 @@ pretty(pw) } void -current() +id_print(struct passwd *pw, int use_ggl, int p_euid, int p_egid) { struct group *gr; - struct passwd *pw; - int cnt, id, eid, lastid, ngroups; - gid_t groups[NGROUPS]; - char *fmt; - - id = getuid(); - (void)printf("uid=%u", id); - if ((pw = getpwuid(id)) != NULL) - (void)printf("(%s)", pw->pw_name); - if ((eid = geteuid()) != id) { - (void)printf(" euid=%u", eid); - if ((pw = getpwuid(eid)) != NULL) - (void)printf("(%s)", pw->pw_name); + gid_t gid, egid, lastgid; + uid_t uid, euid; + int cnt, ngroups; +#ifdef __APPLE__ + gid_t *groups = NULL; +#else + gid_t groups[NGROUPS + 1]; +#endif + const char *fmt; + +#ifdef __APPLE__ + if (pw == NULL) { + pw = getpwuid(getuid()); } - id = getgid(); - (void)printf(" gid=%u", id); - if ((gr = getgrgid(id)) != NULL) + + use_ggl = 1; +#endif + + if (pw != NULL) { + uid = pw->pw_uid; + gid = pw->pw_gid; + } + else { + uid = getuid(); + gid = getgid(); + } + + if (use_ggl && pw != NULL) { +#ifdef __APPLE__ + // 5235093 + ngroups = getgrouplist_2(pw->pw_name, gid, &groups); +#else + ngroups = NGROUPS + 1; + getgrouplist(pw->pw_name, gid, groups, &ngroups); +#endif + } + else { +#ifdef __APPLE__ + groups = malloc((NGROUPS + 1) * sizeof(gid_t)); +#endif + ngroups = getgroups(NGROUPS + 1, groups); + } + +#ifdef __APPLE__ + if (ngroups < 0) + warn("failed to retrieve group list"); +#endif + + if (pw != NULL) + printf("uid=%u(%s)", uid, pw->pw_name); + else + printf("uid=%u", getuid()); + printf(" gid=%u", gid); + if ((gr = getgrgid(gid))) (void)printf("(%s)", gr->gr_name); - if ((eid = getegid()) != id) { - (void)printf(" egid=%u", eid); - if ((gr = getgrgid(eid)) != NULL) + if (p_euid && (euid = geteuid()) != uid) { + (void)printf(" euid=%u", euid); + if ((pw = getpwuid(euid))) + (void)printf("(%s)", pw->pw_name); + } + if (p_egid && (egid = getegid()) != gid) { + (void)printf(" egid=%u", egid); + if ((gr = getgrgid(egid))) (void)printf("(%s)", gr->gr_name); } - if ((ngroups = getgroups(NGROUPS, groups)) != NULL) { - for (fmt = " groups=%u", lastid = -1, cnt = 0; cnt < ngroups; - fmt = ", %u", lastid = id) { - id = groups[cnt++]; - if (lastid == id) - continue; - (void)printf(fmt, id); - if ((gr = getgrgid(id)) != NULL) - (void)printf("(%s)", gr->gr_name); - } + fmt = " groups=%u"; + for (lastgid = -1, cnt = 0; cnt < ngroups; ++cnt) { + if (lastgid == (gid = groups[cnt])) + continue; + printf(fmt, gid); + fmt = ",%u"; + if ((gr = getgrgid(gid))) + printf("(%s)", gr->gr_name); + lastgid = gid; } - (void)printf("\n"); + printf("\n"); +#ifdef __APPLE__ + free(groups); +#endif } +#ifdef USE_BSM_AUDIT void -user(pw) - struct passwd *pw; +auditid(void) { - struct group *gr; - char *fmt; - int cnt, id, lastid, ngroups, groups[NGROUPS + 1]; + auditinfo_addr_t auditinfo; - id = pw->pw_uid; - (void)printf("uid=%u(%s)", id, pw->pw_name); - (void)printf(" gid=%u", pw->pw_gid); - if ((gr = getgrgid(pw->pw_gid)) != NULL) - (void)printf("(%s)", gr->gr_name); - ngroups = NGROUPS + 1; - (void) getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups); - fmt = " groups=%u"; - for (lastid = -1, cnt = 0; cnt < ngroups; ++cnt) { - if (lastid == (id = groups[cnt])) - continue; - (void)printf(fmt, id); - fmt = " %u"; - if ((gr = getgrgid(id)) != NULL) - (void)printf("(%s)", gr->gr_name); - lastid = id; + if (getaudit_addr(&auditinfo, sizeof(auditinfo)) < 0) + err(1, "getaudit"); + printf("auid=%d\n", auditinfo.ai_auid); + printf("mask.success=0x%08x\n", auditinfo.ai_mask.am_success); + printf("mask.failure=0x%08x\n", auditinfo.ai_mask.am_failure); + printf("termid.port=0x%08x\n", auditinfo.ai_termid.at_port); + printf("asid=%d\n", auditinfo.ai_asid); +} +#endif + +void +fullname(struct passwd *pw) +{ + + if (!pw) { + if ((pw = getpwuid(getuid())) == NULL) + err(1, "getpwuid"); } - (void)printf("\n"); + + (void)printf("%s\n", pw->pw_gecos); } void -group(pw, nflag) - struct passwd *pw; - int nflag; +group(struct passwd *pw, int nflag) { struct group *gr; int cnt, id, lastid, ngroups; +#ifdef __APPLE__ + gid_t *groups = NULL; +#else gid_t groups[NGROUPS + 1]; - char *fmt; +#endif + const char *fmt; + +#ifdef __APPLE__ + if (pw == NULL) { + pw = getpwuid(getuid()); + } +#endif if (pw) { +#ifdef __APPLE__ + // 5235093 + ngroups = getgrouplist_2(pw->pw_name, pw->pw_gid, &groups); +#else ngroups = NGROUPS + 1; (void) getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups); +#endif } else { +#ifdef __APPLE__ + groups = malloc((NGROUPS + 1) * sizeof(gid_t)); +#endif groups[0] = getgid(); ngroups = getgroups(NGROUPS, groups + 1) + 1; } @@ -297,7 +420,7 @@ group(pw, nflag) if (lastid == (id = groups[cnt])) continue; if (nflag) { - if ((gr = getgrgid(id)) != NULL) + if ((gr = getgrgid(id))) (void)printf(fmt, gr->gr_name); else (void)printf(*fmt == ' ' ? " %u" : "%u", @@ -310,11 +433,41 @@ group(pw, nflag) lastid = id; } (void)printf("\n"); +#ifdef __APPLE__ + free(groups); +#endif +} + +void +maclabel(void) +{ +#ifdef __APPLE__ + errx(1, "-M unsupported"); +#else /* !__APPLE__ */ + char *string; + mac_t label; + int error; + + error = mac_prepare_process_label(&label); + if (error == -1) + errx(1, "mac_prepare_type: %s", strerror(errno)); + + error = mac_get_proc(label); + if (error == -1) + errx(1, "mac_get_proc: %s", strerror(errno)); + + error = mac_to_text(label, &string); + if (error == -1) + errx(1, "mac_to_text: %s", strerror(errno)); + + (void)printf("%s\n", string); + mac_free(label); + free(string); +#endif /* __APPLE__ */ } struct passwd * -who(u) - char *u; +who(char *u) { struct passwd *pw; long id; @@ -324,22 +477,53 @@ who(u) * Translate user argument into a pw pointer. First, try to * get it as specified. If that fails, try it as a number. */ - if ((pw = getpwnam(u)) != NULL) + if ((pw = getpwnam(u))) return(pw); id = strtol(u, &ep, 10); if (*u && !*ep && (pw = getpwuid(id))) return(pw); - errx(1, "%s: No such user", u); + errx(1, "%s: no such user", u); /* NOTREACHED */ - return (NULL); } void -usage() +pline(struct passwd *pw) { - (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"); + + if (!pw) { + if ((pw = getpwuid(getuid())) == NULL) + err(1, "getpwuid"); + } + + (void)printf("%s:%s:%d:%d:%s:%ld:%ld:%s:%s:%s\n", pw->pw_name, + pw->pw_passwd, pw->pw_uid, pw->pw_gid, pw->pw_class, + (long)pw->pw_change, (long)pw->pw_expire, pw->pw_gecos, + pw->pw_dir, pw->pw_shell); +} + + +void +usage(void) +{ + + if (isgroups) + (void)fprintf(stderr, "usage: groups [user]\n"); + else if (iswhoami) + (void)fprintf(stderr, "usage: whoami\n"); + else + (void)fprintf(stderr, "%s\n%s%s\n%s\n%s\n%s\n%s\n%s\n%s\n", + "usage: id [user]", +#ifdef USE_BSM_AUDIT + " id -A\n", +#else + "", +#endif + " id -F [user]", + " id -G [-n] [user]", + " id -M", + " id -P [user]", + " id -g [-nr] [user]", + " id -p [user]", + " id -u [-nr] [user]"); exit(1); }