id.c (2350B)
1 /* See LICENSE file for copyright and license details. */ 2 #include <sys/types.h> 3 4 #include <ctype.h> 5 #include <errno.h> 6 #include <grp.h> 7 #include <limits.h> 8 #include <pwd.h> 9 #include <stdio.h> 10 #include <stdlib.h> 11 #include <unistd.h> 12 13 #include "util.h" 14 15 static void groupid(struct passwd *pw); 16 static void user(struct passwd *pw); 17 static void userid(uid_t id); 18 static void usernam(const char *nam); 19 20 static void 21 usage(void) 22 { 23 eprintf("usage: %s [-g] [-u] [-G] [user | uid]\n", argv0); 24 } 25 26 static int Gflag = 0; 27 28 int 29 main(int argc, char *argv[]) 30 { 31 ARGBEGIN { 32 case 'g': 33 printf("%d\n", getegid()); 34 return 0; 35 case 'u': 36 printf("%d\n", geteuid()); 37 return 0; 38 case 'G': 39 Gflag = 1; 40 break; 41 default: 42 usage(); 43 } ARGEND; 44 45 switch (argc) { 46 case 0: 47 userid(getuid()); 48 break; 49 case 1: 50 /* user names can't begin [0-9] */ 51 if (isdigit(argv[0][0])) 52 userid(estrtol(argv[0], 0)); 53 else 54 usernam(argv[0]); 55 break; 56 default: 57 usage(); 58 } 59 60 return 0; 61 } 62 63 static void 64 groupid(struct passwd *pw) 65 { 66 gid_t gid, groups[NGROUPS_MAX]; 67 int ngroups; 68 int i; 69 70 ngroups = NGROUPS_MAX; 71 getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups); 72 for (i = 0; i < ngroups; i++) { 73 gid = groups[i]; 74 printf("%u", gid); 75 if (i < ngroups - 1) 76 putchar(' '); 77 } 78 putchar('\n'); 79 } 80 81 static void 82 usernam(const char *nam) 83 { 84 struct passwd *pw; 85 86 errno = 0; 87 pw = getpwnam(nam); 88 if (!pw) { 89 if (errno) 90 eprintf("getpwnam %s:", nam); 91 else 92 eprintf("getpwnam %s: no such user\n", nam); 93 } 94 if (Gflag) 95 groupid(pw); 96 else 97 user(pw); 98 } 99 100 static void 101 userid(uid_t id) 102 { 103 struct passwd *pw; 104 105 errno = 0; 106 pw = getpwuid(id); 107 if (!pw) { 108 if (errno) 109 eprintf("getpwuid %d:", id); 110 else 111 eprintf("getpwuid %d: no such user\n", id); 112 } 113 if (Gflag) 114 groupid(pw); 115 else 116 user(pw); 117 } 118 119 static void 120 user(struct passwd *pw) 121 { 122 struct group *gr; 123 gid_t gid, groups[NGROUPS_MAX]; 124 int ngroups; 125 int i; 126 127 printf("uid=%u(%s)", pw->pw_uid, pw->pw_name); 128 printf(" gid=%u", pw->pw_gid); 129 if (!(gr = getgrgid(pw->pw_gid))) 130 eprintf("getgrgid:"); 131 printf("(%s)", gr->gr_name); 132 133 ngroups = NGROUPS_MAX; 134 getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups); 135 for (i = 0; i < ngroups; i++) { 136 gid = groups[i]; 137 printf("%s%u", !i ? " groups=" : ",", gid); 138 if (!(gr = getgrgid(gid))) 139 eprintf("getgrgid:"); 140 printf("(%s)", gr->gr_name); 141 } 142 putchar('\n'); 143 }