diff options
| author | Ron Yorston <rmy@pobox.com> | 2024-10-09 13:01:28 +0100 |
|---|---|---|
| committer | Ron Yorston <rmy@pobox.com> | 2024-10-09 13:01:28 +0100 |
| commit | c052d1180ec8a9d94a7bd6a64dd7b986ad1a5104 (patch) | |
| tree | 803dea78f2846e1686a3f7357e828422bc918c79 | |
| parent | 9b181bf263b9d7c71b347542d945fe2467a495c6 (diff) | |
| download | busybox-w32-c052d1180ec8a9d94a7bd6a64dd7b986ad1a5104.tar.gz busybox-w32-c052d1180ec8a9d94a7bd6a64dd7b986ad1a5104.tar.bz2 busybox-w32-c052d1180ec8a9d94a7bd6a64dd7b986ad1a5104.zip | |
id: code shrink
The bogus user/group ids we use on Windows are very limited.
Make these limitations explicit in the 'id' applet.
Saves 464 bytes.
| -rw-r--r-- | coreutils/id.c | 20 | ||||
| -rw-r--r-- | libbb/bb_getgroups.c | 2 | ||||
| -rw-r--r-- | win32/mingw.c | 2 |
3 files changed, 23 insertions, 1 deletions
diff --git a/coreutils/id.c b/coreutils/id.c index a4f178bda..0e1286294 100644 --- a/coreutils/id.c +++ b/coreutils/id.c | |||
| @@ -112,6 +112,7 @@ static int print_user(uid_t id, const char *prefix) | |||
| 112 | return print_common(id, uid2uname(id), prefix); | 112 | return print_common(id, uid2uname(id), prefix); |
| 113 | } | 113 | } |
| 114 | 114 | ||
| 115 | #if !ENABLE_PLATFORM_MINGW32 | ||
| 115 | /* On error set *n < 0 and return >= 0 | 116 | /* On error set *n < 0 and return >= 0 |
| 116 | * If *n is too small, update it and return < 0 | 117 | * If *n is too small, update it and return < 0 |
| 117 | * (ok to trash groups[] in both cases) | 118 | * (ok to trash groups[] in both cases) |
| @@ -142,6 +143,7 @@ static int get_groups(const char *username, gid_t rgid, gid_t *groups, int *n) | |||
| 142 | /* if *n >= 0, return -1 (got new *n), else return 0 (error): */ | 143 | /* if *n >= 0, return -1 (got new *n), else return 0 (error): */ |
| 143 | return -(*n >= 0); | 144 | return -(*n >= 0); |
| 144 | } | 145 | } |
| 146 | #endif | ||
| 145 | 147 | ||
| 146 | int id_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 148 | int id_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| 147 | int id_main(int argc UNUSED_PARAM, char **argv) | 149 | int id_main(int argc UNUSED_PARAM, char **argv) |
| @@ -184,16 +186,26 @@ int id_main(int argc UNUSED_PARAM, char **argv) | |||
| 184 | euid = ruid = p->pw_uid; | 186 | euid = ruid = p->pw_uid; |
| 185 | egid = rgid = p->pw_gid; | 187 | egid = rgid = p->pw_gid; |
| 186 | } else { | 188 | } else { |
| 189 | #if ENABLE_PLATFORM_MINGW32 | ||
| 190 | // We don't distinguish real/effective ids on Windows. | ||
| 191 | euid = ruid = getuid(); | ||
| 192 | egid = rgid = getegid(); | ||
| 193 | #else | ||
| 187 | egid = getegid(); | 194 | egid = getegid(); |
| 188 | rgid = getgid(); | 195 | rgid = getgid(); |
| 189 | euid = geteuid(); | 196 | euid = geteuid(); |
| 190 | ruid = getuid(); | 197 | ruid = getuid(); |
| 198 | #endif | ||
| 191 | } | 199 | } |
| 192 | /* JUST_ALL_GROUPS ignores -r PRINT_REAL flag even if man page for */ | 200 | /* JUST_ALL_GROUPS ignores -r PRINT_REAL flag even if man page for */ |
| 193 | /* id says: print the real ID instead of the effective ID, with -ugG */ | 201 | /* id says: print the real ID instead of the effective ID, with -ugG */ |
| 194 | /* in fact in this case egid is always printed if egid != rgid */ | 202 | /* in fact in this case egid is always printed if egid != rgid */ |
| 195 | if (!opt || (opt & JUST_ALL_GROUPS)) { | 203 | if (!opt || (opt & JUST_ALL_GROUPS)) { |
| 204 | #if ENABLE_PLATFORM_MINGW32 | ||
| 205 | gid_t groups[1]; | ||
| 206 | #else | ||
| 196 | gid_t *groups; | 207 | gid_t *groups; |
| 208 | #endif | ||
| 197 | int n; | 209 | int n; |
| 198 | 210 | ||
| 199 | if (!opt) { | 211 | if (!opt) { |
| @@ -210,6 +222,11 @@ int id_main(int argc UNUSED_PARAM, char **argv) | |||
| 210 | if (egid != rgid) | 222 | if (egid != rgid) |
| 211 | status |= print_group(egid, " "); | 223 | status |= print_group(egid, " "); |
| 212 | } | 224 | } |
| 225 | #if ENABLE_PLATFORM_MINGW32 | ||
| 226 | // We only admit to having one group id on Windows. | ||
| 227 | n = 1; | ||
| 228 | groups[0] = rgid; | ||
| 229 | #else | ||
| 213 | /* We are supplying largish buffer, trying | 230 | /* We are supplying largish buffer, trying |
| 214 | * to not run get_groups() twice. That might be slow | 231 | * to not run get_groups() twice. That might be slow |
| 215 | * ("user database in remote SQL server" case) */ | 232 | * ("user database in remote SQL server" case) */ |
| @@ -220,6 +237,7 @@ int id_main(int argc UNUSED_PARAM, char **argv) | |||
| 220 | groups = xrealloc(groups, n * sizeof(groups[0])); | 237 | groups = xrealloc(groups, n * sizeof(groups[0])); |
| 221 | get_groups(username, rgid, groups, &n); | 238 | get_groups(username, rgid, groups, &n); |
| 222 | } | 239 | } |
| 240 | #endif | ||
| 223 | if (n > 0) { | 241 | if (n > 0) { |
| 224 | /* Print the list */ | 242 | /* Print the list */ |
| 225 | prefix = " groups="; | 243 | prefix = " groups="; |
| @@ -234,7 +252,7 @@ int id_main(int argc UNUSED_PARAM, char **argv) | |||
| 234 | bb_simple_error_msg_and_die("can't get groups"); | 252 | bb_simple_error_msg_and_die("can't get groups"); |
| 235 | return EXIT_FAILURE; | 253 | return EXIT_FAILURE; |
| 236 | } | 254 | } |
| 237 | if (ENABLE_FEATURE_CLEAN_UP) | 255 | if (ENABLE_FEATURE_CLEAN_UP && !ENABLE_PLATFORM_MINGW32) |
| 238 | free(groups); | 256 | free(groups); |
| 239 | #if ENABLE_SELINUX | 257 | #if ENABLE_SELINUX |
| 240 | if (is_selinux_enabled()) { | 258 | if (is_selinux_enabled()) { |
diff --git a/libbb/bb_getgroups.c b/libbb/bb_getgroups.c index c255d4e4c..757b80be8 100644 --- a/libbb/bb_getgroups.c +++ b/libbb/bb_getgroups.c | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | 10 | ||
| 11 | #include "libbb.h" | 11 | #include "libbb.h" |
| 12 | 12 | ||
| 13 | #if !ENABLE_PLATFORM_MINGW32 | ||
| 13 | gid_t* FAST_FUNC bb_getgroups(int *ngroups, gid_t *group_array) | 14 | gid_t* FAST_FUNC bb_getgroups(int *ngroups, gid_t *group_array) |
| 14 | { | 15 | { |
| 15 | int n = ngroups ? *ngroups : 0; | 16 | int n = ngroups ? *ngroups : 0; |
| @@ -45,6 +46,7 @@ gid_t* FAST_FUNC bb_getgroups(int *ngroups, gid_t *group_array) | |||
| 45 | *ngroups = n; | 46 | *ngroups = n; |
| 46 | return group_array; | 47 | return group_array; |
| 47 | } | 48 | } |
| 49 | #endif | ||
| 48 | 50 | ||
| 49 | uid_t FAST_FUNC get_cached_euid(uid_t *euid) | 51 | uid_t FAST_FUNC get_cached_euid(uid_t *euid) |
| 50 | { | 52 | { |
diff --git a/win32/mingw.c b/win32/mingw.c index c14ad1f1f..d323014b7 100644 --- a/win32/mingw.c +++ b/win32/mingw.c | |||
| @@ -1273,6 +1273,7 @@ struct group *getgrgid(gid_t gid) | |||
| 1273 | return &g; | 1273 | return &g; |
| 1274 | } | 1274 | } |
| 1275 | 1275 | ||
| 1276 | #if 0 | ||
| 1276 | int getgrouplist(const char *user UNUSED_PARAM, gid_t group, | 1277 | int getgrouplist(const char *user UNUSED_PARAM, gid_t group, |
| 1277 | gid_t *groups, int *ngroups) | 1278 | gid_t *groups, int *ngroups) |
| 1278 | { | 1279 | { |
| @@ -1295,6 +1296,7 @@ int getgroups(int n, gid_t *groups) | |||
| 1295 | groups[0] = getgid(); | 1296 | groups[0] = getgid(); |
| 1296 | return 1; | 1297 | return 1; |
| 1297 | } | 1298 | } |
| 1299 | #endif | ||
| 1298 | 1300 | ||
| 1299 | int getlogin_r(char *buf, size_t len) | 1301 | int getlogin_r(char *buf, size_t len) |
| 1300 | { | 1302 | { |
