diff options
Diffstat (limited to 'src/commands/id.c')
-rw-r--r-- | src/commands/id.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/src/commands/id.c b/src/commands/id.c index 4bd7bca..3bef4f6 100644 --- a/src/commands/id.c +++ b/src/commands/id.c @@ -4,22 +4,28 @@ #include <pwd.h> COMMAND_EMPTY(user_id) { + + uid_t uid; + gid_t gid, *groups; + int ngroups, i; + struct passwd* pw; + struct group* ugr; - uid_t uid = getuid(); - gid_t gid = getgid(); + uid = getuid(); + gid = getgid(); - struct passwd* pw = getpwuid(uid); + pw = getpwuid(uid); if(pw == NULL){ error("failed to fetch groups: %s", strerror(errno)); } - int ngroups = 0; + ngroups = 0; getgrouplist(pw->pw_name, pw->pw_gid, NULL, &ngroups); - gid_t groups[ngroups]; + groups = malloc(sizeof(gid_t) * ngroups); getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups); - struct group* ugr = getgrgid(gid); + ugr = getgrgid(gid); printf("uid=%d(%s) gid=%d(%s) ", uid, ugr->gr_name, gid, ugr->gr_name); @@ -27,15 +33,21 @@ COMMAND_EMPTY(user_id) { printf("groups="); } - for (int i = 0; i < ngroups; i++){ + for (i = 0; i < ngroups; i++){ struct group* gr = getgrgid(groups[i]); - if(gr == NULL){ + if(gr == NULL) { + free(groups); error("failed to fetch groups: %s", strerror(errno)); } + printf("%d(%s)", gr->gr_gid, gr->gr_name); + if (i + 1 < ngroups) putchar(','); } + printf("\b\n"); + free(groups); + return EXIT_SUCCESS; } |