1*cf5a6c84SAndroid Build Coastguard Worker /* id.c - print real and effective user and group IDs
2*cf5a6c84SAndroid Build Coastguard Worker *
3*cf5a6c84SAndroid Build Coastguard Worker * Copyright 2012 Sony Network Entertainment, Inc.
4*cf5a6c84SAndroid Build Coastguard Worker *
5*cf5a6c84SAndroid Build Coastguard Worker * by Tim Bird <[email protected]>
6*cf5a6c84SAndroid Build Coastguard Worker *
7*cf5a6c84SAndroid Build Coastguard Worker * See http://opengroup.org/onlinepubs/9699919799/utilities/id.html
8*cf5a6c84SAndroid Build Coastguard Worker
9*cf5a6c84SAndroid Build Coastguard Worker USE_ID(NEWTOY(id, ">1"USE_ID_Z("Z")"nGgru[!"USE_ID_Z("Z")"Ggu]", TOYFLAG_USR|TOYFLAG_BIN))
10*cf5a6c84SAndroid Build Coastguard Worker USE_GROUPS(NEWTOY(groups, NULL, TOYFLAG_USR|TOYFLAG_BIN))
11*cf5a6c84SAndroid Build Coastguard Worker USE_LOGNAME(NEWTOY(logname, ">0", TOYFLAG_USR|TOYFLAG_BIN))
12*cf5a6c84SAndroid Build Coastguard Worker USE_WHOAMI(OLDTOY(whoami, logname, TOYFLAG_USR|TOYFLAG_BIN))
13*cf5a6c84SAndroid Build Coastguard Worker
14*cf5a6c84SAndroid Build Coastguard Worker config ID
15*cf5a6c84SAndroid Build Coastguard Worker bool "id"
16*cf5a6c84SAndroid Build Coastguard Worker default y
17*cf5a6c84SAndroid Build Coastguard Worker help
18*cf5a6c84SAndroid Build Coastguard Worker usage: id [-Ggnru] [USER...]
19*cf5a6c84SAndroid Build Coastguard Worker
20*cf5a6c84SAndroid Build Coastguard Worker Print user and group ID.
21*cf5a6c84SAndroid Build Coastguard Worker
22*cf5a6c84SAndroid Build Coastguard Worker -G Show all group IDs
23*cf5a6c84SAndroid Build Coastguard Worker -g Show only the effective group ID
24*cf5a6c84SAndroid Build Coastguard Worker -n Print names instead of numeric IDs (to be used with -Ggu)
25*cf5a6c84SAndroid Build Coastguard Worker -r Show real ID instead of effective ID
26*cf5a6c84SAndroid Build Coastguard Worker -u Show only the effective user ID
27*cf5a6c84SAndroid Build Coastguard Worker
28*cf5a6c84SAndroid Build Coastguard Worker config ID_Z
29*cf5a6c84SAndroid Build Coastguard Worker bool
30*cf5a6c84SAndroid Build Coastguard Worker default y
31*cf5a6c84SAndroid Build Coastguard Worker depends on ID && !TOYBOX_LSM_NONE
32*cf5a6c84SAndroid Build Coastguard Worker help
33*cf5a6c84SAndroid Build Coastguard Worker usage: id [-Z]
34*cf5a6c84SAndroid Build Coastguard Worker
35*cf5a6c84SAndroid Build Coastguard Worker -Z Show only security context
36*cf5a6c84SAndroid Build Coastguard Worker
37*cf5a6c84SAndroid Build Coastguard Worker config GROUPS
38*cf5a6c84SAndroid Build Coastguard Worker bool "groups"
39*cf5a6c84SAndroid Build Coastguard Worker default y
40*cf5a6c84SAndroid Build Coastguard Worker help
41*cf5a6c84SAndroid Build Coastguard Worker usage: groups [user]
42*cf5a6c84SAndroid Build Coastguard Worker
43*cf5a6c84SAndroid Build Coastguard Worker Print the groups a user is in.
44*cf5a6c84SAndroid Build Coastguard Worker
45*cf5a6c84SAndroid Build Coastguard Worker config LOGNAME
46*cf5a6c84SAndroid Build Coastguard Worker bool "logname"
47*cf5a6c84SAndroid Build Coastguard Worker default y
48*cf5a6c84SAndroid Build Coastguard Worker help
49*cf5a6c84SAndroid Build Coastguard Worker usage: logname
50*cf5a6c84SAndroid Build Coastguard Worker
51*cf5a6c84SAndroid Build Coastguard Worker Print the current user name.
52*cf5a6c84SAndroid Build Coastguard Worker
53*cf5a6c84SAndroid Build Coastguard Worker config WHOAMI
54*cf5a6c84SAndroid Build Coastguard Worker bool "whoami"
55*cf5a6c84SAndroid Build Coastguard Worker default y
56*cf5a6c84SAndroid Build Coastguard Worker help
57*cf5a6c84SAndroid Build Coastguard Worker usage: whoami
58*cf5a6c84SAndroid Build Coastguard Worker
59*cf5a6c84SAndroid Build Coastguard Worker Print the current user name.
60*cf5a6c84SAndroid Build Coastguard Worker */
61*cf5a6c84SAndroid Build Coastguard Worker
62*cf5a6c84SAndroid Build Coastguard Worker #define FOR_id
63*cf5a6c84SAndroid Build Coastguard Worker #define FORCE_FLAGS
64*cf5a6c84SAndroid Build Coastguard Worker #include "toys.h"
65*cf5a6c84SAndroid Build Coastguard Worker
GLOBALS(int is_groups;)66*cf5a6c84SAndroid Build Coastguard Worker GLOBALS(
67*cf5a6c84SAndroid Build Coastguard Worker int is_groups;
68*cf5a6c84SAndroid Build Coastguard Worker )
69*cf5a6c84SAndroid Build Coastguard Worker
70*cf5a6c84SAndroid Build Coastguard Worker static void showone(char *prefix, char *s, unsigned u, int done)
71*cf5a6c84SAndroid Build Coastguard Worker {
72*cf5a6c84SAndroid Build Coastguard Worker if (FLAG(n)) printf("%s%s", prefix, s);
73*cf5a6c84SAndroid Build Coastguard Worker else printf("%s%u", prefix, u);
74*cf5a6c84SAndroid Build Coastguard Worker if (done) {
75*cf5a6c84SAndroid Build Coastguard Worker xputc('\n');
76*cf5a6c84SAndroid Build Coastguard Worker xexit();
77*cf5a6c84SAndroid Build Coastguard Worker }
78*cf5a6c84SAndroid Build Coastguard Worker }
79*cf5a6c84SAndroid Build Coastguard Worker
showid(char * prefix,unsigned u,char * s)80*cf5a6c84SAndroid Build Coastguard Worker static void showid(char *prefix, unsigned u, char *s)
81*cf5a6c84SAndroid Build Coastguard Worker {
82*cf5a6c84SAndroid Build Coastguard Worker printf("%s%u(%s)", prefix, u, s);
83*cf5a6c84SAndroid Build Coastguard Worker }
84*cf5a6c84SAndroid Build Coastguard Worker
do_id(char * username)85*cf5a6c84SAndroid Build Coastguard Worker static void do_id(char *username)
86*cf5a6c84SAndroid Build Coastguard Worker {
87*cf5a6c84SAndroid Build Coastguard Worker struct passwd *pw;
88*cf5a6c84SAndroid Build Coastguard Worker struct group *grp;
89*cf5a6c84SAndroid Build Coastguard Worker uid_t uid = getuid(), euid = geteuid();
90*cf5a6c84SAndroid Build Coastguard Worker gid_t gid = getgid(), egid = getegid();
91*cf5a6c84SAndroid Build Coastguard Worker gid_t *groups = (gid_t *)toybuf;
92*cf5a6c84SAndroid Build Coastguard Worker int i = sizeof(toybuf)/sizeof(gid_t), ngroups;
93*cf5a6c84SAndroid Build Coastguard Worker
94*cf5a6c84SAndroid Build Coastguard Worker // check if a username is given
95*cf5a6c84SAndroid Build Coastguard Worker if (username) {
96*cf5a6c84SAndroid Build Coastguard Worker pw = getpwnam(username);
97*cf5a6c84SAndroid Build Coastguard Worker if (!pw) {
98*cf5a6c84SAndroid Build Coastguard Worker uid = atolx_range(username, 0, INT_MAX);
99*cf5a6c84SAndroid Build Coastguard Worker if ((pw = bufgetpwuid(uid))) username = pw->pw_name;
100*cf5a6c84SAndroid Build Coastguard Worker }
101*cf5a6c84SAndroid Build Coastguard Worker if (!pw) error_exit("no such user '%s'", username);
102*cf5a6c84SAndroid Build Coastguard Worker uid = euid = pw->pw_uid;
103*cf5a6c84SAndroid Build Coastguard Worker gid = egid = pw->pw_gid;
104*cf5a6c84SAndroid Build Coastguard Worker if (TT.is_groups) printf("%s : ", pw->pw_name);
105*cf5a6c84SAndroid Build Coastguard Worker }
106*cf5a6c84SAndroid Build Coastguard Worker
107*cf5a6c84SAndroid Build Coastguard Worker pw = xgetpwuid(FLAG(r) ? uid : euid);
108*cf5a6c84SAndroid Build Coastguard Worker if (FLAG(u)) showone("", pw->pw_name, pw->pw_uid, 1);
109*cf5a6c84SAndroid Build Coastguard Worker
110*cf5a6c84SAndroid Build Coastguard Worker grp = xgetgrgid(FLAG(r) ? gid : egid);
111*cf5a6c84SAndroid Build Coastguard Worker if (FLAG(g)) showone("", grp->gr_name, grp->gr_gid, 1);
112*cf5a6c84SAndroid Build Coastguard Worker
113*cf5a6c84SAndroid Build Coastguard Worker ngroups = username ? getgrouplist(username, gid, groups, &i)
114*cf5a6c84SAndroid Build Coastguard Worker : getgroups(i, groups);
115*cf5a6c84SAndroid Build Coastguard Worker if (ngroups<0) perror_exit("getgroups");
116*cf5a6c84SAndroid Build Coastguard Worker
117*cf5a6c84SAndroid Build Coastguard Worker if (FLAG(G)) {
118*cf5a6c84SAndroid Build Coastguard Worker showone("", grp->gr_name, grp->gr_gid, 0);
119*cf5a6c84SAndroid Build Coastguard Worker for (i = 0; i<ngroups; i++) {
120*cf5a6c84SAndroid Build Coastguard Worker if (groups[i] != egid) {
121*cf5a6c84SAndroid Build Coastguard Worker if ((grp=getgrgid(groups[i]))) showone(" ",grp->gr_name,grp->gr_gid,0);
122*cf5a6c84SAndroid Build Coastguard Worker else printf(" %u", groups[i]);
123*cf5a6c84SAndroid Build Coastguard Worker }
124*cf5a6c84SAndroid Build Coastguard Worker }
125*cf5a6c84SAndroid Build Coastguard Worker xputc('\n');
126*cf5a6c84SAndroid Build Coastguard Worker return;
127*cf5a6c84SAndroid Build Coastguard Worker }
128*cf5a6c84SAndroid Build Coastguard Worker
129*cf5a6c84SAndroid Build Coastguard Worker if (!FLAG(Z)) {
130*cf5a6c84SAndroid Build Coastguard Worker showid("uid=", pw->pw_uid, pw->pw_name);
131*cf5a6c84SAndroid Build Coastguard Worker showid(" gid=", grp->gr_gid, grp->gr_name);
132*cf5a6c84SAndroid Build Coastguard Worker
133*cf5a6c84SAndroid Build Coastguard Worker if (!FLAG(r)) {
134*cf5a6c84SAndroid Build Coastguard Worker if (uid != euid) {
135*cf5a6c84SAndroid Build Coastguard Worker pw = xgetpwuid(euid);
136*cf5a6c84SAndroid Build Coastguard Worker showid(" euid=", pw->pw_uid, pw->pw_name);
137*cf5a6c84SAndroid Build Coastguard Worker }
138*cf5a6c84SAndroid Build Coastguard Worker if (gid != egid) {
139*cf5a6c84SAndroid Build Coastguard Worker grp = xgetgrgid(egid);
140*cf5a6c84SAndroid Build Coastguard Worker showid(" egid=", grp->gr_gid, grp->gr_name);
141*cf5a6c84SAndroid Build Coastguard Worker }
142*cf5a6c84SAndroid Build Coastguard Worker }
143*cf5a6c84SAndroid Build Coastguard Worker
144*cf5a6c84SAndroid Build Coastguard Worker showid(" groups=", gid, grp->gr_name);
145*cf5a6c84SAndroid Build Coastguard Worker for (i = 0; i<ngroups; i++) {
146*cf5a6c84SAndroid Build Coastguard Worker if (groups[i] != egid) {
147*cf5a6c84SAndroid Build Coastguard Worker if ((grp=getgrgid(groups[i]))) showid(",", grp->gr_gid, grp->gr_name);
148*cf5a6c84SAndroid Build Coastguard Worker else printf(",%u", groups[i]);
149*cf5a6c84SAndroid Build Coastguard Worker }
150*cf5a6c84SAndroid Build Coastguard Worker }
151*cf5a6c84SAndroid Build Coastguard Worker }
152*cf5a6c84SAndroid Build Coastguard Worker
153*cf5a6c84SAndroid Build Coastguard Worker if (!CFG_TOYBOX_LSM_NONE) {
154*cf5a6c84SAndroid Build Coastguard Worker if (lsm_enabled()) {
155*cf5a6c84SAndroid Build Coastguard Worker char *context = lsm_context();
156*cf5a6c84SAndroid Build Coastguard Worker
157*cf5a6c84SAndroid Build Coastguard Worker printf("%s%s", FLAG(Z) ? "" : " context=", context);
158*cf5a6c84SAndroid Build Coastguard Worker if (CFG_TOYBOX_FREE) free(context);
159*cf5a6c84SAndroid Build Coastguard Worker } else if (FLAG(Z)) error_exit("%s disabled", lsm_name());
160*cf5a6c84SAndroid Build Coastguard Worker }
161*cf5a6c84SAndroid Build Coastguard Worker
162*cf5a6c84SAndroid Build Coastguard Worker xputc('\n');
163*cf5a6c84SAndroid Build Coastguard Worker }
164*cf5a6c84SAndroid Build Coastguard Worker
id_main(void)165*cf5a6c84SAndroid Build Coastguard Worker void id_main(void)
166*cf5a6c84SAndroid Build Coastguard Worker {
167*cf5a6c84SAndroid Build Coastguard Worker if (toys.optc) while(*toys.optargs) do_id(*toys.optargs++);
168*cf5a6c84SAndroid Build Coastguard Worker else do_id(NULL);
169*cf5a6c84SAndroid Build Coastguard Worker }
170*cf5a6c84SAndroid Build Coastguard Worker
groups_main(void)171*cf5a6c84SAndroid Build Coastguard Worker void groups_main(void)
172*cf5a6c84SAndroid Build Coastguard Worker {
173*cf5a6c84SAndroid Build Coastguard Worker TT.is_groups = 1;
174*cf5a6c84SAndroid Build Coastguard Worker toys.optflags = FLAG_G|FLAG_n;
175*cf5a6c84SAndroid Build Coastguard Worker id_main();
176*cf5a6c84SAndroid Build Coastguard Worker }
177*cf5a6c84SAndroid Build Coastguard Worker
logname_main(void)178*cf5a6c84SAndroid Build Coastguard Worker void logname_main(void)
179*cf5a6c84SAndroid Build Coastguard Worker {
180*cf5a6c84SAndroid Build Coastguard Worker toys.optflags = FLAG_u|FLAG_n;
181*cf5a6c84SAndroid Build Coastguard Worker id_main();
182*cf5a6c84SAndroid Build Coastguard Worker }
183