int FAST_FUNC spawn_and_wait(char **argv) { int rc; #if ENABLE_FEATURE_PREFER_APPLETS int a = find_applet_by_name(argv[0]); if (a >= 0 && (APPLET_IS_NOFORK(a) # if BB_MMU || APPLET_IS_NOEXEC(a) /* NOEXEC trick needs fork() */ # endif )) { # if BB_MMU if (APPLET_IS_NOFORK(a)) # endif { return run_nofork_applet(a, argv); } # if BB_MMU /* MMU only */ /* a->noexec is true */ rc = fork(); if (rc) /* parent or error */ return wait4pid(rc); /* child */ xfunc_error_retval = EXIT_FAILURE; run_applet_no_and_exit(a, argv); # endif } #endif /* FEATURE_PREFER_APPLETS */ rc = spawn(argv); return wait4pid(rc); }
int spawn_and_wait(char **argv) { int rc; #if ENABLE_FEATURE_PREFER_APPLETS const struct bb_applet *a = find_applet_by_name(argv[0]); if (a && (a->nofork #if BB_MMU || a->noexec /* NOEXEC trick needs fork() */ #endif )) { #if BB_MMU if (a->nofork) #endif { return run_nofork_applet(a, argv); } #if BB_MMU /* MMU only */ /* a->noexec is true */ rc = fork(); if (rc) /* parent or error */ return wait4pid(rc); /* child */ xfunc_error_retval = EXIT_FAILURE; current_applet = a; run_current_applet_and_exit(argv); #endif } #endif /* FEATURE_PREFER_APPLETS */ rc = spawn(argv); return wait4pid(rc); }
int FAST_FUNC bb_execv_applet(const char *name, char *const argv[], char *const envp[]) { const char **path = bb_busybox_exec_paths; errno = ENOENT; if (find_applet_by_name(name) < 0) return -1; for (; *path; ++path) execve(*path, argv, envp); return -1; }
void FAST_FUNC bb_show_usage(void) { if (ENABLE_SHOW_USAGE) { #ifdef SINGLE_APPLET_STR /* Imagine that this applet is "true". Dont suck in printf! */ const char *usage_string = unpack_usage_messages(); if (*usage_string == '\b') { full_write2_str("No help available.\n\n"); } else { full_write2_str("Usage: "SINGLE_APPLET_STR" "); full_write2_str(usage_string); full_write2_str("\n\n"); } if (ENABLE_FEATURE_CLEAN_UP) dealloc_usage_messages((char*)usage_string); #else const char *p; const char *usage_string = p = unpack_usage_messages(); int ap = find_applet_by_name(applet_name); if (ap < 0) /* never happens, paranoia */ xfunc_die(); while (ap) { while (*p++) continue; ap--; } full_write2_str(bb_banner); full_write2_str(" multi-call binary.\n"); if (*p == '\b') full_write2_str("\nNo help available.\n\n"); else { full_write2_str("\nUsage: "); full_write2_str(applet_name); full_write2_str(" "); full_write2_str(p); full_write2_str("\n\n"); } if (ENABLE_FEATURE_CLEAN_UP) dealloc_usage_messages((char*)usage_string); #endif } xfunc_die(); }
/* just like the real execvp, but try to launch an applet named 'file' first */ int FAST_FUNC BB_EXECVP(const char *file, char *const argv[]) { if (find_applet_by_name(file) >= 0) execvp(bb_busybox_exec_path, argv); return execvp(file, argv); }
/* just like the real execvp, but try to launch an applet named 'file' first */ int bb_execvp(const char *file, char *const argv[]) { return execvp(find_applet_by_name(file) ? CONFIG_BUSYBOX_EXEC_PATH : file, argv); }
/* just like the real execvp, but try to launch an applet named 'file' first */ int FAST_FUNC bb_execvp(const char *file, char *const argv[]) { return execvp(find_applet_by_name(file) >= 0 ? bb_busybox_exec_path : file, argv); }