]> git.saurik.com Git - apple/shell_cmds.git/blobdiff - id/id.c
shell_cmds-198.tar.gz
[apple/shell_cmds.git] / id / id.c
diff --git a/id/id.c b/id/id.c
index 9ef13b475b2cf54a4e8d60e47065efd8cb5a1d0a..2567770fdb8efce1ceb9ed243fe70934708abaaa 100644 (file)
--- a/id/id.c
+++ b/id/id.c
  * SUCH DAMAGE.
  */
 
  * SUCH DAMAGE.
  */
 
-#include <sys/cdefs.h>
 #ifndef lint
 #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
 #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 */
 #endif
 #endif /* not lint */
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: src/usr.bin/id/id.c,v 1.33 2006/12/29 12:28:34 stefanf Exp $");
 
 #include <sys/param.h>
 
 #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 <err.h>
 #include <errno.h>
@@ -56,45 +63,70 @@ __RCSID("$NetBSD: id.c,v 1.10 1998/08/25 20:59:37 ross Exp $");
 #include <string.h>
 #include <unistd.h>
 
 #include <string.h>
 #include <unistd.h>
 
-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__
 
 #ifdef __APPLE__
-extern char *__progname;
+// SPI for 5235093
+int32_t getgrouplist_2(const char *, gid_t, gid_t **);
 #endif
 
 int
 #endif
 
 int
-main(argc, argv)
-       int argc;
-       char *argv[];
+main(int argc, char *argv[])
 {
        struct group *gr;
        struct passwd *pw;
 {
        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) {
                switch(ch) {
+#ifdef USE_BSM_AUDIT
+               case 'A':
+                       Aflag = 1;
+                       break;
+#endif
+               case 'F':
+                       Fflag = 1;
+                       break;
                case 'G':
                        Gflag = 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;
                case 'g':
                        gflag = 1;
                        break;
@@ -117,7 +149,10 @@ main(argc, argv)
        argc -= optind;
        argv += optind;
 
        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:
        case 1:
                break;
        case 0:
@@ -130,6 +165,21 @@ main(argc, argv)
 
        pw = *argv ? who(*argv) : NULL;
 
 
        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)))
        if (gflag) {
                id = pw ? pw->pw_gid : rflag ? getgid() : getegid();
                if (nflag && (gr = getgrgid(id)))
@@ -153,21 +203,34 @@ main(argc, argv)
                exit(0);
        }
 
                exit(0);
        }
 
+       if (Mflag) {
+               maclabel();
+               exit(0);
+       }
+
+       if (Pflag) {
+               pline(pw);
+               exit(0);
+       }
+
        if (pflag) {
                pretty(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
        exit(0);
 }
 
 void
-pretty(pw)
-       struct passwd *pw;
+pretty(struct passwd *pw)
 {
        struct group *gr;
        u_int eid, rid;
 {
        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);
                        (void)printf("uid\t%s\n", pw->pw_name);
                else
                        (void)printf("uid\t%u\n", rid);
-               
+
                if ((eid = geteuid()) != rid) {
                if ((eid = geteuid()) != rid) {
-                       if ((pw = getpwuid(eid)) != NULL)
+                       if ((pw = getpwuid(eid)))
                                (void)printf("euid\t%s\n", pw->pw_name);
                        else
                                (void)printf("euid\t%u\n", eid);
                }
                if ((rid = getgid()) != (eid = getegid())) {
                                (void)printf("euid\t%s\n", pw->pw_name);
                        else
                                (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);
                                (void)printf("rgid\t%s\n", gr->gr_name);
                        else
                                (void)printf("rgid\t%u\n", rid);
@@ -207,88 +270,148 @@ pretty(pw)
 }
 
 void
 }
 
 void
-current()
+id_print(struct passwd *pw, int use_ggl, int p_euid, int p_egid)
 {
        struct group *gr;
 {
        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);
                (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);
        }
                        (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
 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
 }
 
 void
-group(pw, nflag)
-       struct passwd *pw;
-       int nflag;
+group(struct passwd *pw, int nflag)
 {
        struct group *gr;
        int cnt, id, lastid, ngroups;
 {
        struct group *gr;
        int cnt, id, lastid, ngroups;
+#ifdef __APPLE__
+       gid_t *groups = NULL;
+#else
        gid_t groups[NGROUPS + 1];
        gid_t groups[NGROUPS + 1];
-       char *fmt;
+#endif
+       const char *fmt;
+
+#ifdef __APPLE__
+       if (pw == NULL) {
+               pw = getpwuid(getuid());
+       }
+#endif
 
        if (pw) {
 
        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);
                ngroups = NGROUPS + 1;
                (void) getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups);
+#endif
        } else {
        } else {
+#ifdef __APPLE__
+               groups = malloc((NGROUPS + 1) * sizeof(gid_t));
+#endif
                groups[0] = getgid();
                ngroups = getgroups(NGROUPS, groups + 1) + 1;
        }
                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 (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",
                                (void)printf(fmt, gr->gr_name);
                        else
                                (void)printf(*fmt == ' ' ? " %u" : "%u",
@@ -310,11 +433,41 @@ group(pw, nflag)
                lastid = id;
        }
        (void)printf("\n");
                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 *
 }
 
 struct passwd *
-who(u)
-       char *u;
+who(char *u)
 {
        struct passwd *pw;
        long id;
 {
        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.
         */
         * 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);
                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 */
        /* NOTREACHED */
-       return (NULL);
 }
 
 void
 }
 
 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);
 }
        exit(1);
 }