aboutsummaryrefslogtreecommitdiff
path: root/libbb/appletlib.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbb/appletlib.c')
-rw-r--r--libbb/appletlib.c53
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
105static int really_find_applet_by_name(const char *name); 105static 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
110unsigned FAST_FUNC string_array_len(char **argv) 110unsigned 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
200static int really_find_applet_by_name(const char *name) 200static int find_applet_by_name_internal(const char *name)
201#else 201#else
202int FAST_FUNC find_applet_by_name(const char *name) 202int 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
270int FAST_FUNC find_applet_by_name_with_path(const char *name, const char *path) 270int 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
276int FAST_FUNC find_applet_by_name(const char *name) 276int 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
281static int external_exists(const char *name, const char *path) 283static 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
292static int is_applet_preferred_by_var(const char *name, const char *path, 294static 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
331int FAST_FUNC is_applet_preferred(const char *name, const char *path) 333int 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 }