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
12static 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
23static 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
33int 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