1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h>
2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h>
3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <unistd.h>
4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/types.h>
5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <pwd.h>
6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <grp.h>
78290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley#include <selinux/selinux.h>
88290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley
9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void print_uid(uid_t uid)
10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    struct passwd *pw = getpwuid(uid);
12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (pw) {
14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        printf("%d(%s)", uid, pw->pw_name);
15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } else {
16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        printf("%d",uid);
17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void print_gid(gid_t gid)
21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    struct group *gr = getgrgid(gid);
23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (gr) {
24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        printf("%d(%s)", gid, gr->gr_name);
25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } else {
26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        printf("%d",gid);
27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint id_main(int argc, char **argv)
31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    gid_t list[64];
33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int n, max;
348290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley    char *secctx;
35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    max = getgroups(64, list);
37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (max < 0) max = 0;
38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    printf("uid=");
40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    print_uid(getuid());
41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    printf(" gid=");
42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    print_gid(getgid());
43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (max) {
44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        printf(" groups=");
45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        print_gid(list[0]);
46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        for(n = 1; n < max; n++) {
47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            printf(",");
48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            print_gid(list[n]);
49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
518290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley    if (getcon(&secctx) == 0) {
528290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley        printf(" context=%s", secctx);
538290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley        free(secctx);
548290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley    }
55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    printf("\n");
56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return 0;
57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
58