1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <sys/types.h>
5 #include <pwd.h>
6 #include <grp.h>
7
8 #ifdef HAVE_SELINUX
9 #include <selinux/selinux.h>
10 #endif
11
print_uid(uid_t uid)12 static void print_uid(uid_t uid)
13 {
14 struct passwd *pw = getpwuid(uid);
15
16 if (pw) {
17 printf("%d(%s)", uid, pw->pw_name);
18 } else {
19 printf("%d",uid);
20 }
21 }
22
print_gid(gid_t gid)23 static void print_gid(gid_t gid)
24 {
25 struct group *gr = getgrgid(gid);
26 if (gr) {
27 printf("%d(%s)", gid, gr->gr_name);
28 } else {
29 printf("%d",gid);
30 }
31 }
32
id_main(int argc,char ** argv)33 int id_main(int argc, char **argv)
34 {
35 gid_t list[64];
36 int n, max;
37 #ifdef HAVE_SELINUX
38 char *secctx;
39 #endif
40
41 max = getgroups(64, list);
42 if (max < 0) max = 0;
43
44 printf("uid=");
45 print_uid(getuid());
46 printf(" gid=");
47 print_gid(getgid());
48 if (max) {
49 printf(" groups=");
50 print_gid(list[0]);
51 for(n = 1; n < max; n++) {
52 printf(",");
53 print_gid(list[n]);
54 }
55 }
56 #ifdef HAVE_SELINUX
57 if (getcon(&secctx) == 0) {
58 printf(" context=%s", secctx);
59 free(secctx);
60 }
61 #endif
62 printf("\n");
63 return 0;
64 }
65