]> git.saurik.com Git - apple/shell_cmds.git/blobdiff - id/id.c
shell_cmds-116.tar.gz
[apple/shell_cmds.git] / id / id.c
diff --git a/id/id.c b/id/id.c
index 74434393c82d7c5e3e7ab78e05ca3bb9d2598d02..becc5912f1d40382d4d1a4efdb8529af7d465c3d 100644 (file)
--- a/id/id.c
+++ b/id/id.c
@@ -43,11 +43,19 @@ static char sccsid[] = "@(#)id.c    8.2 (Berkeley) 2/16/94";
 #endif
 #endif /* not lint */
 #include <sys/cdefs.h>
-__RCSID("$FreeBSD: src/usr.bin/id/id.c,v 1.19 2002/09/04 23:29:02 dwmalone Exp $");
+__FBSDID("$FreeBSD: src/usr.bin/id/id.c,v 1.33 2006/12/29 12:28:34 stefanf Exp $");
 
 #include <sys/param.h>
+#ifndef __APPLE__
+#include <sys/mac.h>
+#endif /* !__APPLE__ */
+
+#ifdef USE_BSM_AUDIT
+#include <bsm/audit.h>
+#endif
 
 #include <err.h>
+#include <errno.h>
 #include <grp.h>
 #include <pwd.h>
 #include <stdio.h>
@@ -55,26 +63,33 @@ __RCSID("$FreeBSD: src/usr.bin/id/id.c,v 1.19 2002/09/04 23:29:02 dwmalone Exp $
 #include <string.h>
 #include <unistd.h>
 
-void   current(void);
+void   id_print(struct passwd *, int, int, int);
 void   pline(struct passwd *);
 void   pretty(struct passwd *);
+void   auditid(void);
 void   group(struct passwd *, int);
+void   maclabel(void);
 void   usage(void);
-void   user(struct passwd *);
-struct passwd *
-       who(char *);
+struct passwd *who(char *);
 
 int isgroups, iswhoami;
 
+#ifdef __APPLE__
+// SPI for 5235093
+int32_t getgrouplist_2(const char *, gid_t, gid_t **);
+#endif
+
 int
 main(int argc, char *argv[])
 {
        struct group *gr;
        struct passwd *pw;
-       int Gflag, Pflag, ch, gflag, id, nflag, pflag, rflag, uflag;
+       int Gflag, Mflag, Pflag, ch, gflag, id, nflag, pflag, rflag, uflag;
+       int Aflag;
        const char *myname;
 
-       Gflag = Pflag = gflag = nflag = pflag = rflag = uflag = 0;
+       Gflag = Mflag = Pflag = gflag = nflag = pflag = rflag = uflag = 0;
+       Aflag = 0;
 
        myname = strrchr(argv[0], '/');
        myname = (myname != NULL) ? myname + 1 : argv[0];
@@ -88,14 +103,24 @@ main(int argc, char *argv[])
        }
 
        while ((ch = getopt(argc, argv,
-           (isgroups || iswhoami) ? "" : "PGgnpru")) != -1)
+           (isgroups || iswhoami) ? "" : "APGMagnpru")) != -1)
                switch(ch) {
+#ifdef USE_BSM_AUDIT
+               case 'A':
+                       Aflag = 1;
+                       break;
+#endif
                case 'G':
                        Gflag = 1;
                        break;
+               case 'M':
+                       Mflag = 1;
+                       break;
                case 'P':
                        Pflag = 1;
                        break;
+               case 'a':
+                       break;
                case 'g':
                        gflag = 1;
                        break;
@@ -121,7 +146,7 @@ main(int argc, char *argv[])
        if (iswhoami && argc > 0)
                usage();
 
-       switch(Gflag + Pflag + gflag + pflag + uflag) {
+       switch(Aflag + Gflag + Mflag + Pflag + gflag + pflag + uflag) {
        case 1:
                break;
        case 0:
@@ -134,6 +159,16 @@ main(int argc, char *argv[])
 
        pw = *argv ? who(*argv) : NULL;
 
+       if (Mflag && pw != NULL)
+               usage();
+
+#ifdef USE_BSM_AUDIT
+       if (Aflag) {
+               auditid();
+               exit(0);
+       }
+#endif
+
        if (gflag) {
                id = pw ? pw->pw_gid : rflag ? getgid() : getegid();
                if (nflag && (gr = getgrgid(id)))
@@ -157,6 +192,11 @@ main(int argc, char *argv[])
                exit(0);
        }
 
+       if (Mflag) {
+               maclabel();
+               exit(0);
+       }
+
        if (Pflag) {
                pline(pw);
                exit(0);
@@ -167,10 +207,14 @@ main(int argc, char *argv[])
                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);
 }
 
@@ -215,85 +259,131 @@ pretty(struct passwd *pw)
 }
 
 void
-current(void)
+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];
+       gid_t gid, egid, lastgid;
+       uid_t uid, euid;
+       int cnt, ngroups;
+#ifdef __APPLE__
+       gid_t *groups;
+#else
+       gid_t groups[NGROUPS + 1];
+#endif
        const char *fmt;
 
-       id = getuid();
-       (void)printf("uid=%u", id);
-       if ((pw = getpwuid(id)))
-               (void)printf("(%s)", pw->pw_name);
-       if ((eid = geteuid()) != id) {
-               (void)printf(" euid=%u", eid);
-               if ((pw = getpwuid(eid)))
-                       (void)printf("(%s)", pw->pw_name);
+#ifdef __APPLE__
+       if (pw == NULL) {
+               pw = getpwuid(getuid());
        }
-       id = getgid();
-       (void)printf(" gid=%u", id);
-       if ((gr = getgrgid(id)))
-               (void)printf("(%s)", gr->gr_name);
-       if ((eid = getegid()) != id) {
-               (void)printf(" egid=%u", eid);
-               if ((gr = getgrgid(eid)))
-                       (void)printf("(%s)", gr->gr_name);
+
+       use_ggl = 1;
+#endif
+
+       if (pw != NULL) {
+               uid = pw->pw_uid;
+               gid = pw->pw_gid;
        }
-       if ((ngroups = getgroups(NGROUPS, groups))) {
-               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)))
-                               (void)printf("(%s)", gr->gr_name);
-               }
+       else {
+               uid = getuid();
+               gid = getgid();
        }
-       (void)printf("\n");
-}
 
-void
-user(struct passwd *pw)
-{
-       struct group *gr;
-       const char *fmt;
-       int cnt, gid, lastgid, ngroups, groups[NGROUPS + 1];
+       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);
+#endif
+               ngroups = getgroups(NGROUPS + 1, groups);
+       }
 
-       (void)printf("uid=%u(%s)", pw->pw_uid, pw->pw_name);
-       gid = pw->pw_gid;
-       (void)printf(" gid=%u", gid);
+       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);
-       ngroups = NGROUPS + 1;
-       (void) getgrouplist(pw->pw_name, gid, groups, &ngroups);
+       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);
+       }
        fmt = " groups=%u";
        for (lastgid = -1, cnt = 0; cnt < ngroups; ++cnt) {
                if (lastgid == (gid = groups[cnt]))
                        continue;
-               (void)printf(fmt, gid);
-               fmt = ", %u";
+               printf(fmt, gid);
+               fmt = ",%u";
                if ((gr = getgrgid(gid)))
-                       (void)printf("(%s)", gr->gr_name);
+                       printf("(%s)", gr->gr_name);
                lastgid = gid;
        }
-       (void)printf("\n");
+       printf("\n");
+#ifdef __APPLE__
+       free(groups);
+#endif
 }
 
+#ifdef USE_BSM_AUDIT
+void
+auditid(void)
+{
+       auditinfo_t auditinfo;
+
+       if (getaudit(&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.port);
+       printf("asid=%d\n", auditinfo.ai_asid);
+}
+#endif
+
 void
 group(struct passwd *pw, int nflag)
 {
        struct group *gr;
        int cnt, id, lastid, ngroups;
+#ifdef __APPLE__
+       gid_t *groups;
+#else
        gid_t groups[NGROUPS + 1];
+#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);
+#endif
                groups[0] = getgid();
                ngroups = getgroups(NGROUPS, groups + 1) + 1;
        }
@@ -315,6 +405,37 @@ group(struct passwd *pw, int 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 *
@@ -340,10 +461,9 @@ who(char *u)
 void
 pline(struct passwd *pw)
 {
-       u_int rid;
 
        if (!pw) {
-               if ((pw = getpwuid(rid = getuid())) == NULL)
+               if ((pw = getpwuid(getuid())) == NULL)
                        err(1, "getpwuid");
        }
 
@@ -363,9 +483,15 @@ usage(void)
        else if (iswhoami)
                (void)fprintf(stderr, "usage: whoami\n");
        else
-               (void)fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n",
+               (void)fprintf(stderr, "%s\n%s%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 -G [-n] [user]",
+                   "       id -M",
                    "       id -P [user]",
                    "       id -g [-nr] [user]",
                    "       id -p [user]",