id.c revision 4f6e8d7a00cbeda1e70cc15be9c4af1018bdad53
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
8static void print_uid(uid_t uid)
9{
10    struct passwd *pw = getpwuid(uid);
11
12    if (pw) {
13        printf("%d(%s)", uid, pw->pw_name);
14    } else {
15        printf("%d",uid);
16    }
17}
18
19static void print_gid(gid_t gid)
20{
21    struct group *gr = getgrgid(gid);
22    if (gr) {
23        printf("%d(%s)", gid, gr->gr_name);
24    } else {
25        printf("%d",gid);
26    }
27}
28
29int id_main(int argc, char **argv)
30{
31    gid_t list[64];
32    int n, max;
33
34    max = getgroups(64, list);
35    if (max < 0) max = 0;
36
37    printf("uid=");
38    print_uid(getuid());
39    printf(" gid=");
40    print_gid(getgid());
41    if (max) {
42        printf(" groups=");
43        print_gid(list[0]);
44        for(n = 1; n < max; n++) {
45            printf(",");
46            print_gid(list[n]);
47        }
48    }
49    printf("\n");
50    return 0;
51}
52