diff options
| author | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2008-09-12 09:58:11 +0000 |
|---|---|---|
| committer | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2008-09-12 09:58:11 +0000 |
| commit | 0ee1cb00849355126eb59e8f3fccb02b4db2f5ed (patch) | |
| tree | 20e523022664ca62557912e6622affde7a02d8fd /coreutils | |
| parent | 70de57f60a39d167870f3f59f2fa3f606e965239 (diff) | |
| download | busybox-w32-0ee1cb00849355126eb59e8f3fccb02b4db2f5ed.tar.gz busybox-w32-0ee1cb00849355126eb59e8f3fccb02b4db2f5ed.tar.bz2 busybox-w32-0ee1cb00849355126eb59e8f3fccb02b4db2f5ed.zip | |
- implement id -G (Tito Ragusa)
Diffstat (limited to 'coreutils')
| -rw-r--r-- | coreutils/id.c | 47 |
1 files changed, 37 insertions, 10 deletions
diff --git a/coreutils/id.c b/coreutils/id.c index 0fadd98d3..b2f3b20e1 100644 --- a/coreutils/id.c +++ b/coreutils/id.c | |||
| @@ -7,10 +7,11 @@ | |||
| 7 | * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. | 7 | * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. |
| 8 | */ | 8 | */ |
| 9 | 9 | ||
| 10 | /* BB_AUDIT SUSv3 _NOT_ compliant -- option -G is not currently supported. */ | 10 | /* BB_AUDIT SUSv3 compliant. */ |
| 11 | /* Hacked by Tito Ragusa (C) 2004 to handle usernames of whatever length and to | 11 | /* Hacked by Tito Ragusa (C) 2004 to handle usernames of whatever length and to |
| 12 | * be more similar to GNU id. | 12 | * be more similar to GNU id. |
| 13 | * -Z option support: by Yuichi Nakamura <ynakam@hitachisoft.jp> | 13 | * -Z option support: by Yuichi Nakamura <ynakam@hitachisoft.jp> |
| 14 | * Added -G option Tito Ragusa (C) 2008 for SUSv3. | ||
| 14 | */ | 15 | */ |
| 15 | 16 | ||
| 16 | #include "libbb.h" | 17 | #include "libbb.h" |
| @@ -19,17 +20,18 @@ | |||
| 19 | #define NAME_NOT_NUMBER 2 | 20 | #define NAME_NOT_NUMBER 2 |
| 20 | #define JUST_USER 4 | 21 | #define JUST_USER 4 |
| 21 | #define JUST_GROUP 8 | 22 | #define JUST_GROUP 8 |
| 23 | #define JUST_ALL_GROUPS 16 | ||
| 22 | #if ENABLE_SELINUX | 24 | #if ENABLE_SELINUX |
| 23 | #define JUST_CONTEXT 16 | 25 | #define JUST_CONTEXT 32 |
| 24 | #endif | 26 | #endif |
| 25 | 27 | ||
| 26 | static int printf_full(unsigned int id, const char *arg, const char prefix) | 28 | static int printf_full(unsigned int id, const char *arg, const char *prefix) |
| 27 | { | 29 | { |
| 28 | const char *fmt = "%cid=%u"; | 30 | const char *fmt = "%s%u"; |
| 29 | int status = EXIT_FAILURE; | 31 | int status = EXIT_FAILURE; |
| 30 | 32 | ||
| 31 | if (arg) { | 33 | if (arg) { |
| 32 | fmt = "%cid=%u(%s)"; | 34 | fmt = "%s%u(%s)"; |
| 33 | status = EXIT_SUCCESS; | 35 | status = EXIT_SUCCESS; |
| 34 | } | 36 | } |
| 35 | printf(fmt, prefix, id, arg); | 37 | printf(fmt, prefix, id, arg); |
| @@ -42,6 +44,8 @@ int id_main(int argc UNUSED_PARAM, char **argv) | |||
| 42 | struct passwd *p; | 44 | struct passwd *p; |
| 43 | uid_t uid; | 45 | uid_t uid; |
| 44 | gid_t gid; | 46 | gid_t gid; |
| 47 | gid_t *groups; | ||
| 48 | int grp; | ||
| 45 | unsigned long flags; | 49 | unsigned long flags; |
| 46 | short status; | 50 | short status; |
| 47 | #if ENABLE_SELINUX | 51 | #if ENABLE_SELINUX |
| @@ -49,8 +53,8 @@ int id_main(int argc UNUSED_PARAM, char **argv) | |||
| 49 | #endif | 53 | #endif |
| 50 | /* Don't allow -n -r -nr -ug -rug -nug -rnug */ | 54 | /* Don't allow -n -r -nr -ug -rug -nug -rnug */ |
| 51 | /* Don't allow more than one username */ | 55 | /* Don't allow more than one username */ |
| 52 | opt_complementary = "?1:u--g:g--u:r?ug:n?ug" USE_SELINUX(":u--Z:Z--u:g--Z:Z--g"); | 56 | opt_complementary = "?1:u--g:g--u:G--u:u--G:g--G:G--g:r?ugG:n?ugG" USE_SELINUX(":u--Z:Z--u:g--Z:Z--g"); |
| 53 | flags = getopt32(argv, "rnug" USE_SELINUX("Z")); | 57 | flags = getopt32(argv, "rnugG" USE_SELINUX("Z")); |
| 54 | 58 | ||
| 55 | /* This values could be overwritten later */ | 59 | /* This values could be overwritten later */ |
| 56 | uid = geteuid(); | 60 | uid = geteuid(); |
| @@ -68,6 +72,22 @@ int id_main(int argc UNUSED_PARAM, char **argv) | |||
| 68 | /* in this case PRINT_REAL is the same */ | 72 | /* in this case PRINT_REAL is the same */ |
| 69 | } | 73 | } |
| 70 | 74 | ||
| 75 | grp = getgroups(0, 0); | ||
| 76 | groups = (gid_t *)xmalloc(sizeof(gid_t) * grp); | ||
| 77 | getgroups(grp, (gid_t *)groups); | ||
| 78 | |||
| 79 | if (flags & (JUST_ALL_GROUPS)) { | ||
| 80 | while (grp--) { | ||
| 81 | if (flags & NAME_NOT_NUMBER) | ||
| 82 | printf("%s", bb_getgrgid(NULL, 0, *groups++)); | ||
| 83 | else | ||
| 84 | printf("%d", *groups++); | ||
| 85 | bb_putchar((grp > 0) ? ' ' : '\n'); | ||
| 86 | } | ||
| 87 | /* exit */ | ||
| 88 | fflush_stdout_and_exit(EXIT_SUCCESS); | ||
| 89 | } | ||
| 90 | |||
| 71 | if (flags & (JUST_GROUP | JUST_USER USE_SELINUX(| JUST_CONTEXT))) { | 91 | if (flags & (JUST_GROUP | JUST_USER USE_SELINUX(| JUST_CONTEXT))) { |
| 72 | /* JUST_GROUP and JUST_USER are mutually exclusive */ | 92 | /* JUST_GROUP and JUST_USER are mutually exclusive */ |
| 73 | if (flags & NAME_NOT_NUMBER) { | 93 | if (flags & NAME_NOT_NUMBER) { |
| @@ -101,10 +121,17 @@ int id_main(int argc UNUSED_PARAM, char **argv) | |||
| 101 | 121 | ||
| 102 | /* Print full info like GNU id */ | 122 | /* Print full info like GNU id */ |
| 103 | /* bb_getpwuid(0) doesn't exit on failure (returns NULL) */ | 123 | /* bb_getpwuid(0) doesn't exit on failure (returns NULL) */ |
| 104 | status = printf_full(uid, bb_getpwuid(NULL, 0, uid), 'u'); | 124 | status = printf_full(uid, bb_getpwuid(NULL, 0, uid), "uid="); |
| 105 | bb_putchar(' '); | 125 | bb_putchar(' '); |
| 106 | status |= printf_full(gid, bb_getgrgid(NULL, 0, gid), 'g'); | 126 | status |= printf_full(gid, bb_getgrgid(NULL, 0, gid), "gid="); |
| 107 | 127 | printf(" groups="); | |
| 128 | while (grp--) { | ||
| 129 | status |= printf_full(*groups, bb_getgrgid(NULL, 0, *groups), ""); | ||
| 130 | if (grp > 0) | ||
| 131 | bb_putchar(','); | ||
| 132 | groups++; | ||
| 133 | } | ||
| 134 | /* Don't free groups */ | ||
| 108 | #if ENABLE_SELINUX | 135 | #if ENABLE_SELINUX |
| 109 | if (is_selinux_enabled()) { | 136 | if (is_selinux_enabled()) { |
| 110 | security_context_t mysid; | 137 | security_context_t mysid; |
