diff options
Diffstat (limited to 'libbb/appletlib.c')
-rw-r--r-- | libbb/appletlib.c | 53 |
1 files changed, 28 insertions, 25 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 | } |