diff options
author | Ron Yorston <rmy@pobox.com> | 2024-02-02 11:43:15 +0000 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2024-02-02 11:43:15 +0000 |
commit | 8dee37d53a47b8f96ba609d65d85438ef4e14fea (patch) | |
tree | 7fbf1e4c0994651703457364ba86dd7a4fc3450e /libbb | |
parent | e960b0d69d3f954d50e814a6bc4d6e206bde7f66 (diff) | |
download | busybox-w32-8dee37d53a47b8f96ba609d65d85438ef4e14fea.tar.gz busybox-w32-8dee37d53a47b8f96ba609d65d85438ef4e14fea.tar.bz2 busybox-w32-8dee37d53a47b8f96ba609d65d85438ef4e14fea.zip |
win32: rearrange applet override handling
- Rename some functions to be more meaningful.
- Adjust conditional compilation to clarify which code is required
for 'standalone shell' and 'exec prefers applets' settings.
This shouldn't result in any change to the behaviour or size of
default builds.
Diffstat (limited to 'libbb')
-rw-r--r-- | libbb/appletlib.c | 53 | ||||
-rw-r--r-- | libbb/lineedit.c | 3 |
2 files changed, 29 insertions, 27 deletions
diff --git a/libbb/appletlib.c b/libbb/appletlib.c index 5b42a9091..1232d97c9 100644 --- a/libbb/appletlib.c +++ b/libbb/appletlib.c | |||
@@ -101,10 +101,10 @@ static const char packed_scripts[] ALIGN1 = { PACKED_SCRIPTS }; | |||
101 | #endif | 101 | #endif |
102 | 102 | ||
103 | #if ENABLE_PLATFORM_MINGW32 && NUM_APPLETS > 1 && \ | 103 | #if ENABLE_PLATFORM_MINGW32 && NUM_APPLETS > 1 && \ |
104 | (ENABLE_FEATURE_PREFER_APPLETS || ENABLE_FEATURE_SH_STANDALONE) | 104 | ENABLE_FEATURE_SH_STANDALONE |
105 | static int really_find_applet_by_name(const char *name); | 105 | static int find_applet_by_name_internal(const char *name); |
106 | #else | 106 | #else |
107 | #define really_find_applet_by_name(n) find_applet_by_name(n) | 107 | # define find_applet_by_name_internal(n) find_applet_by_name(n) |
108 | #endif | 108 | #endif |
109 | 109 | ||
110 | unsigned FAST_FUNC string_array_len(char **argv) | 110 | unsigned FAST_FUNC string_array_len(char **argv) |
@@ -162,7 +162,7 @@ void FAST_FUNC bb_show_usage(void) | |||
162 | #else | 162 | #else |
163 | const char *p; | 163 | const char *p; |
164 | const char *usage_string = p = unpack_usage_messages(); | 164 | const char *usage_string = p = unpack_usage_messages(); |
165 | int ap = really_find_applet_by_name(applet_name); | 165 | int ap = find_applet_by_name_internal(applet_name); |
166 | 166 | ||
167 | if (ap < 0 || usage_string == NULL) | 167 | if (ap < 0 || usage_string == NULL) |
168 | xfunc_die(); | 168 | xfunc_die(); |
@@ -196,8 +196,8 @@ void FAST_FUNC bb_show_usage(void) | |||
196 | } | 196 | } |
197 | 197 | ||
198 | #if ENABLE_PLATFORM_MINGW32 && NUM_APPLETS > 1 && \ | 198 | #if ENABLE_PLATFORM_MINGW32 && NUM_APPLETS > 1 && \ |
199 | (ENABLE_FEATURE_PREFER_APPLETS || ENABLE_FEATURE_SH_STANDALONE) | 199 | ENABLE_FEATURE_SH_STANDALONE |
200 | static int really_find_applet_by_name(const char *name) | 200 | static int find_applet_by_name_internal(const char *name) |
201 | #else | 201 | #else |
202 | int FAST_FUNC find_applet_by_name(const char *name) | 202 | int FAST_FUNC find_applet_by_name(const char *name) |
203 | #endif | 203 | #endif |
@@ -265,19 +265,21 @@ int FAST_FUNC find_applet_by_name(const char *name) | |||
265 | return -1; | 265 | return -1; |
266 | } | 266 | } |
267 | 267 | ||
268 | #if ENABLE_PLATFORM_MINGW32 && NUM_APPLETS > 1 && \ | 268 | #if ENABLE_PLATFORM_MINGW32 && NUM_APPLETS > 1 |
269 | (ENABLE_FEATURE_PREFER_APPLETS || ENABLE_FEATURE_SH_STANDALONE) | 269 | # if ENABLE_FEATURE_SH_STANDALONE |
270 | int FAST_FUNC find_applet_by_name_with_path(const char *name, const char *path) | 270 | int FAST_FUNC find_applet_by_name_for_sh(const char *name, const char *path) |
271 | { | 271 | { |
272 | int applet_no = really_find_applet_by_name(name); | 272 | int applet_no = find_applet_by_name_internal(name); |
273 | return applet_no >= 0 && is_applet_preferred(name, path) ? applet_no : -1; | 273 | return applet_no >= 0 && prefer_applet(name, path) ? applet_no : -1; |
274 | } | 274 | } |
275 | 275 | ||
276 | int FAST_FUNC find_applet_by_name(const char *name) | 276 | int FAST_FUNC find_applet_by_name(const char *name) |
277 | { | 277 | { |
278 | return find_applet_by_name_with_path(name, NULL); | 278 | return find_applet_by_name_for_sh(name, NULL); |
279 | } | 279 | } |
280 | # endif | ||
280 | 281 | ||
282 | # if ENABLE_FEATURE_SH_STANDALONE || ENABLE_FEATURE_PREFER_APPLETS | ||
281 | static int external_exists(const char *name, const char *path) | 283 | static int external_exists(const char *name, const char *path) |
282 | { | 284 | { |
283 | char *path0, *path1, *ret; | 285 | char *path0, *path1, *ret; |
@@ -289,34 +291,34 @@ static int external_exists(const char *name, const char *path) | |||
289 | return ret != NULL; | 291 | return ret != NULL; |
290 | } | 292 | } |
291 | 293 | ||
292 | static int is_applet_preferred_by_var(const char *name, const char *path, | 294 | static int prefer_applet_internal(const char *name, const char *path, |
293 | const char *var) | 295 | const char *override) |
294 | { | 296 | { |
295 | const char *s, *sep; | 297 | const char *s, *sep; |
296 | size_t len; | 298 | size_t len; |
297 | 299 | ||
298 | if (var && *var) { | 300 | if (override && *override) { |
299 | /* '-' disables all applets */ | 301 | /* '-' disables all applets */ |
300 | if (var[0] == '-' && var[1] == '\0') | 302 | if (override[0] == '-' && override[1] == '\0') |
301 | return FALSE; | 303 | return FALSE; |
302 | 304 | ||
303 | /* '+' each applet is overridden if an external command exists */ | 305 | /* '+' each applet is overridden if an external command exists */ |
304 | if (var[0] == '+' && var[1] == '\0') | 306 | if (override[0] == '+' && override[1] == '\0') |
305 | return !external_exists(name, path); | 307 | return !external_exists(name, path); |
306 | 308 | ||
307 | /* Handle applets from a list separated by spaces, commas or | 309 | /* Handle applets from a list separated by spaces, commas or |
308 | * semicolons. Applets before the first semicolon are disabled. | 310 | * semicolons. Applets before the first semicolon are disabled. |
309 | * Applets after the first semicolon are overridden if a | 311 | * Applets after the first semicolon are overridden if a |
310 | * corresponding external command exists. */ | 312 | * corresponding external command exists. */ |
311 | sep = strchr(var, ';'); | 313 | sep = strchr(override, ';'); |
312 | len = strlen(name); | 314 | len = strlen(name); |
313 | s = var - 1; | 315 | s = override - 1; |
314 | while (1) { | 316 | while (1) { |
315 | s = strstr(s + 1, name); | 317 | s = strstr(s + 1, name); |
316 | if (!s) | 318 | if (!s) |
317 | break; | 319 | break; |
318 | /* neither "name.." nor "xxx,name.."? */ | 320 | /* neither "name.." nor "xxx,name.."? */ |
319 | if (s != var && !strchr(" ,;", s[-1])) | 321 | if (s != override && !strchr(" ,;", s[-1])) |
320 | continue; | 322 | continue; |
321 | /* neither "..name" nor "..name,xxx"? */ | 323 | /* neither "..name" nor "..name,xxx"? */ |
322 | if (s[len] != '\0' && !strchr(" ,;", s[len])) | 324 | if (s[len] != '\0' && !strchr(" ,;", s[len])) |
@@ -328,15 +330,16 @@ static int is_applet_preferred_by_var(const char *name, const char *path, | |||
328 | return TRUE; | 330 | return TRUE; |
329 | } | 331 | } |
330 | 332 | ||
331 | int FAST_FUNC is_applet_preferred(const char *name, const char *path) | 333 | int FAST_FUNC prefer_applet(const char *name, const char *path) |
332 | { | 334 | { |
333 | int ret; | 335 | int ret; |
334 | 336 | ||
335 | ret = is_applet_preferred_by_var(name, path, getenv(BB_OVERRIDE_APPLETS)); | 337 | ret = prefer_applet_internal(name, path, getenv(BB_OVERRIDE_APPLETS)); |
336 | if (sizeof(CONFIG_OVERRIDE_APPLETS) > 1 && ret) | 338 | if (sizeof(CONFIG_OVERRIDE_APPLETS) > 1 && ret) |
337 | ret = is_applet_preferred_by_var(name, path, CONFIG_OVERRIDE_APPLETS); | 339 | ret = prefer_applet_internal(name, path, CONFIG_OVERRIDE_APPLETS); |
338 | return ret; | 340 | return ret; |
339 | } | 341 | } |
342 | # endif | ||
340 | #endif | 343 | #endif |
341 | 344 | ||
342 | 345 | ||
@@ -1120,7 +1123,7 @@ int busybox_main(int argc UNUSED_PARAM, char **argv) | |||
1120 | /* convert to "<applet> --help" */ | 1123 | /* convert to "<applet> --help" */ |
1121 | applet_name = argv[0] = argv[2]; | 1124 | applet_name = argv[0] = argv[2]; |
1122 | argv[2] = NULL; | 1125 | argv[2] = NULL; |
1123 | if (really_find_applet_by_name(applet_name) >= 0) { | 1126 | if (find_applet_by_name_internal(applet_name) >= 0) { |
1124 | /* Make "--help foo" exit with 0: */ | 1127 | /* Make "--help foo" exit with 0: */ |
1125 | xfunc_error_retval = 0; | 1128 | xfunc_error_retval = 0; |
1126 | bb_show_usage(); | 1129 | bb_show_usage(); |
@@ -1233,7 +1236,7 @@ static NORETURN void run_applet_and_exit(const char *name, char **argv) | |||
1233 | # if NUM_APPLETS > 0 | 1236 | # if NUM_APPLETS > 0 |
1234 | /* find_applet_by_name() search is more expensive, so goes second */ | 1237 | /* find_applet_by_name() search is more expensive, so goes second */ |
1235 | { | 1238 | { |
1236 | int applet = really_find_applet_by_name(name); | 1239 | int applet = find_applet_by_name_internal(name); |
1237 | if (applet >= 0) | 1240 | if (applet >= 0) |
1238 | run_applet_no_and_exit(applet, name, argv); | 1241 | run_applet_no_and_exit(applet, name, argv); |
1239 | } | 1242 | } |
diff --git a/libbb/lineedit.c b/libbb/lineedit.c index 13cbb3229..ee494e013 100644 --- a/libbb/lineedit.c +++ b/libbb/lineedit.c | |||
@@ -979,8 +979,7 @@ static NOINLINE unsigned complete_cmd_dir_file(const char *command, int type) | |||
979 | state->path_lookup : NULL; | 979 | state->path_lookup : NULL; |
980 | # endif | 980 | # endif |
981 | while (*p) { | 981 | while (*p) { |
982 | if (strncmp(basecmd, p, baselen) == 0 && | 982 | if (strncmp(basecmd, p, baselen) == 0 && prefer_applet(p, shpath)) |
983 | is_applet_preferred(p, shpath)) | ||
984 | add_match(xstrdup(p), TRUE); | 983 | add_match(xstrdup(p), TRUE); |
985 | while (*p++ != '\0') | 984 | while (*p++ != '\0') |
986 | continue; | 985 | continue; |