OSDN Git Service

Add xgetpwnam() to lib/xwrap.c.
[android-x86/external-toybox.git] / toys / posix / id.c
1 /* id.c - print real and effective user and group IDs
2  *
3  * Copyright 2012 Sony Network Entertainment, Inc.
4  *
5  * by Tim Bird <tim.bird@am.sony.com>
6  *
7  * See http://opengroup.org/onlinepubs/9699919799/utilities/id.html
8
9 USE_ID(NEWTOY(id, ">1nGgru[!Ggu]", TOYFLAG_BIN))
10 USE_ID_GROUPS(OLDTOY(groups, id, NULL, TOYFLAG_USR|TOYFLAG_BIN))
11
12 config ID
13   bool "id"
14   default y
15   help
16     usage: id [-nGgru]
17
18     Print user and group ID.
19
20     -n  print names instead of numeric IDs (to be used with -Ggu)
21     -G  Show only the group IDs
22     -g  Show only the effective group ID
23     -r  Show real ID instead of effective ID
24     -u  Show only the effective user ID
25
26 config ID_GROUPS
27   bool "groups"
28   default y
29   depends on ID
30   help
31     usage: groups [user]
32
33     Print the groups a user is in.
34
35 */
36
37 #define FOR_id
38 #include "toys.h"
39
40 static void s_or_u(char *s, unsigned u, int done)
41 {
42   if (toys.optflags & FLAG_n) printf("%s", s);
43   else printf("%u", u);
44   if (done) {
45     xputc('\n');
46     exit(0);
47   }
48 }
49
50 static void showid(char *header, unsigned u, char *s)
51 {
52   printf("%s%u(%s)", header, u, s);
53 }
54
55 void do_id(char *username)
56 {
57   int flags, i, ngroups, cmd_groups = toys.which->name[0] == 'g';
58   struct passwd *pw;
59   struct group *grp;
60   uid_t uid = getuid(), euid = geteuid();
61   gid_t gid = getgid(), egid = getegid(), *groups;
62
63   if (cmd_groups)
64       toys.optflags |= FLAG_G | FLAG_n;
65
66   flags = toys.optflags;
67
68   // check if a username is given
69   if (username) {
70     pw = xgetpwnam(username);
71     uid = euid = pw->pw_uid;
72     gid = egid = pw->pw_gid;
73     if (cmd_groups) printf("%s : ", pw->pw_name);
74   }
75
76   i = flags & FLAG_r;
77   pw = xgetpwuid(i ? uid : euid);
78   if (flags & FLAG_u) s_or_u(pw->pw_name, pw->pw_uid, 1);
79
80   grp = xgetgrgid(i ? gid : egid);
81   if (flags & FLAG_g) s_or_u(grp->gr_name, grp->gr_gid, 1);
82
83   if (!(flags & FLAG_G)) {
84     showid("uid=", pw->pw_uid, pw->pw_name);
85     showid(" gid=", grp->gr_gid, grp->gr_name);
86
87     if (!i) {
88       if (uid != euid) {
89         pw = xgetpwuid(euid);
90         showid(" euid=", pw->pw_uid, pw->pw_name);
91       }
92       if (gid != egid) {
93         grp = xgetgrgid(egid);
94         showid(" egid=", grp->gr_gid, grp->gr_name);
95       }
96     }
97
98     showid(" groups=", grp->gr_gid, grp->gr_name);
99   }
100
101   groups = (gid_t *)toybuf;
102   i = sizeof(toybuf)/sizeof(gid_t);
103   ngroups = username ? getgrouplist(username, gid, groups, &i)
104     : getgroups(i, groups);
105   if (0 >= ngroups) perror_exit(0);
106
107   for (i = 0;;) {
108     if (!(grp = getgrgid(groups[i]))) perror_msg(0);
109     else if (flags & FLAG_G) s_or_u(grp->gr_name, grp->gr_gid, 0);
110     else if (grp->gr_gid != egid) showid("", grp->gr_gid, grp->gr_name);
111     if (++i >= ngroups) break;
112     xputc(' ');
113   }
114   xputc('\n');
115 }
116
117 void id_main(void)
118 {
119   if (toys.optc) while(*toys.optargs) do_id(*toys.optargs++);
120   else do_id(NULL);
121 }