id.c (2942B)
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 int gflag = 0; 21 static int uflag = 0; 22 static int Gflag = 0; 23 static int nflag = 0; 24 25 static void 26 groupid(struct passwd *pw) 27 { 28 gid_t gid, groups[NGROUPS_MAX]; 29 struct group *gr; 30 int ngroups; 31 int i; 32 33 ngroups = NGROUPS_MAX; 34 getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups); 35 for (i = 0; i < ngroups; i++) { 36 gid = groups[i]; 37 if (nflag) { 38 if (!(gr = getgrgid(gid))) 39 eprintf("getgrgid:"); 40 printf("%s", gr->gr_name); 41 } else 42 printf("%u", gid); 43 44 if (i < ngroups - 1) 45 putchar(' '); 46 } 47 putchar('\n'); 48 } 49 50 static void 51 user(struct passwd *pw) 52 { 53 struct group *gr; 54 gid_t gid, groups[NGROUPS_MAX]; 55 int ngroups; 56 int i; 57 58 if (uflag) { 59 if (nflag) 60 printf("%s\n", pw->pw_name); 61 else 62 printf("%u\n", pw->pw_uid); 63 return; 64 } else if (gflag) { 65 if (nflag) { 66 if (!(gr = getgrgid(pw->pw_gid))) 67 eprintf("getgrgid:"); 68 printf("%s\n", gr->gr_name); 69 } else 70 printf("%u\n", pw->pw_gid); 71 return; 72 } 73 74 printf("uid=%u(%s)", pw->pw_uid, pw->pw_name); 75 printf(" gid=%u", pw->pw_gid); 76 if (!(gr = getgrgid(pw->pw_gid))) 77 eprintf("getgrgid:"); 78 printf("(%s)", gr->gr_name); 79 80 ngroups = NGROUPS_MAX; 81 getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups); 82 for (i = 0; i < ngroups; i++) { 83 gid = groups[i]; 84 printf("%s%u", !i ? " groups=" : ",", gid); 85 if (!(gr = getgrgid(gid))) 86 eprintf("getgrgid:"); 87 printf("(%s)", gr->gr_name); 88 } 89 putchar('\n'); 90 } 91 92 static void 93 usernam(const char *nam) 94 { 95 struct passwd *pw; 96 97 errno = 0; 98 pw = getpwnam(nam); 99 if (!pw) { 100 if (errno) 101 eprintf("getpwnam %s:", nam); 102 else 103 eprintf("getpwnam %s: no such user\n", nam); 104 } 105 if (Gflag) 106 groupid(pw); 107 else 108 user(pw); 109 } 110 111 static void 112 userid(uid_t id) 113 { 114 struct passwd *pw; 115 116 errno = 0; 117 pw = getpwuid(id); 118 if (!pw) { 119 if (errno) 120 eprintf("getpwuid %d:", id); 121 else 122 eprintf("getpwuid %d: no such user\n", id); 123 } 124 if (Gflag) 125 groupid(pw); 126 else 127 user(pw); 128 } 129 130 static void 131 usage(void) 132 { 133 eprintf("usage: %s [-n] [-g | -u | -G] [user | uid]\n", argv0); 134 } 135 136 int 137 main(int argc, char *argv[]) 138 { 139 ARGBEGIN { 140 case 'g': 141 gflag = 1; 142 break; 143 case 'u': 144 uflag = 1; 145 break; 146 case 'G': 147 Gflag = 1; 148 break; 149 case 'n': 150 nflag = 1; 151 break; 152 default: 153 usage(); 154 } ARGEND; 155 156 /* ensure that only one of -g, -u, or -G was specified */ 157 if (gflag + uflag + Gflag > 1) 158 usage(); 159 160 switch (argc) { 161 case 0: 162 userid(getuid()); 163 break; 164 case 1: 165 /* user names can't begin [0-9] */ 166 if (isdigit(argv[0][0])) 167 userid(estrtol(argv[0], 0)); 168 else 169 usernam(argv[0]); 170 break; 171 default: 172 usage(); 173 } 174 175 return 0; 176 }