| #include <stdio.h> | 
 | #include <stdlib.h> | 
 | #include <unistd.h> | 
 | #include <sys/types.h> | 
 | #include <pwd.h> | 
 | #include <grp.h> | 
 | #include <selinux/selinux.h> | 
 |  | 
 | static void print_uid(uid_t uid) | 
 | { | 
 |     struct passwd *pw = getpwuid(uid); | 
 |  | 
 |     if (pw) { | 
 |         printf("%d(%s)", uid, pw->pw_name); | 
 |     } else { | 
 |         printf("%d",uid); | 
 |     } | 
 | } | 
 |  | 
 | static void print_gid(gid_t gid) | 
 | { | 
 |     struct group *gr = getgrgid(gid); | 
 |     if (gr) { | 
 |         printf("%d(%s)", gid, gr->gr_name); | 
 |     } else { | 
 |         printf("%d",gid); | 
 |     } | 
 | } | 
 |  | 
 | int id_main(int argc, char **argv) | 
 | { | 
 |     gid_t list[64]; | 
 |     int n, max; | 
 |     char *secctx; | 
 |  | 
 |     max = getgroups(64, list); | 
 |     if (max < 0) max = 0; | 
 |  | 
 |     printf("uid="); | 
 |     print_uid(getuid()); | 
 |     printf(" gid="); | 
 |     print_gid(getgid()); | 
 |     if (max) { | 
 |         printf(" groups="); | 
 |         print_gid(list[0]); | 
 |         for(n = 1; n < max; n++) { | 
 |             printf(","); | 
 |             print_gid(list[n]); | 
 |         } | 
 |     } | 
 |     if (getcon(&secctx) == 0) { | 
 |         printf(" context=%s", secctx); | 
 |         free(secctx); | 
 |     } | 
 |     printf("\n"); | 
 |     return 0; | 
 | } |