OSDN Git Service

Reindent to two spaces per level. Remove vi: directives that haven't worked right...
[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, "nGgru", TOYFLAG_BIN))
10
11 config ID
12   bool "id"
13   default y
14   help
15     usage: id [-nGgru]
16
17     Print user and group ID.
18
19     -n  print names instead of numeric IDs (to be used with -Ggu)
20     -G  Show only the group IDs
21     -g  Show only the effective group ID
22     -r  Show real ID instead of effective ID
23     -u  Show only the effective user ID
24 */
25
26 #define FOR_id
27 #include "toys.h"
28
29 static void s_or_u(char *s, unsigned u, int done)
30 {
31   if (toys.optflags & FLAG_n) printf("%s", s);
32   else printf("%u", u);
33   if (done) {
34     xputc('\n');
35     exit(0);
36   }
37 }
38
39 static void showid(char *header, unsigned u, char *s)
40 {
41   printf("%s%u(%s)", header, u, s);
42 }
43
44 struct passwd *xgetpwuid(uid_t uid)
45 {
46   struct passwd *pwd = getpwuid(uid);
47   if (!pwd) error_exit(NULL);
48   return pwd;
49 }
50
51 struct group *xgetgrgid(gid_t gid)
52 {
53   struct group *group = getgrgid(gid);
54   if (!group) error_exit(NULL);
55   return group;
56 }
57
58 void id_main(void)
59 {
60   int flags = toys.optflags, i, ngroups;
61   struct passwd *pw;
62   struct group *grp;
63   uid_t uid = getuid(), euid = geteuid();
64   gid_t gid = getgid(), egid = getegid(), *groups;
65
66   // check if a username is given
67   if (*toys.optargs) {
68     if (!(pw = getpwnam(*toys.optargs)))
69       error_exit("no such user '%s'", *toys.optargs);
70     uid = euid = pw->pw_uid;
71     gid = egid = pw->pw_gid;
72   }
73
74   i = toys.optflags & FLAG_r;
75   pw = xgetpwuid(i ? uid : euid);
76   if (flags & FLAG_u) s_or_u(pw->pw_name, pw->pw_uid, 1);
77
78   grp = xgetgrgid(i ? gid : egid);
79   if (flags & FLAG_g) s_or_u(grp->gr_name, grp->gr_gid, 1);
80
81   if (!(flags & FLAG_G)) {
82     showid("uid=", pw->pw_uid, pw->pw_name);
83     showid(" gid=", grp->gr_gid, grp->gr_name);
84
85     if (!i) {
86       if (uid != euid) {
87         pw = xgetpwuid(euid);
88         showid(" euid=", pw->pw_uid, pw->pw_name);
89       }
90       if (gid != egid) {
91         grp = xgetgrgid(egid);
92         showid(" egid=", grp->gr_gid, grp->gr_name);
93       }
94     }
95
96     showid(" groups=", grp->gr_gid, grp->gr_name);
97   }
98
99   groups = (gid_t *)toybuf;
100   if (0 >= (ngroups = getgroups(sizeof(toybuf)/sizeof(gid_t), groups)))
101     perror_exit(0);
102
103   for (i = 0; i < ngroups; i++) {
104     xputc(' ');
105     if (!(grp = getgrgid(groups[i]))) perror_msg(0);
106     else if (flags & FLAG_G) s_or_u(grp->gr_name, grp->gr_gid, 0);
107     else if (grp->gr_gid != egid) showid("", grp->gr_gid, grp->gr_name);
108   }
109   xputc('\n');
110 }