id.c - ubase - suckless linux base utils
HTML git clone git://git.suckless.org/ubase
DIR Log
DIR Files
DIR Refs
DIR README
DIR LICENSE
---
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 }