From 4921b54f37125a58d5ea1a8aac886ae781517bc1 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Sat, 3 Feb 2007 02:17:41 +0000 Subject: [PATCH] Add BB_EXEC[LV]P() which encapsulate FEATURE_EXEC_PREFER_APPLETS (patch from Gabriel L. Somlo ) --- include/libbb.h | 10 ++++++++++ init/init.c | 17 +++-------------- libbb/xfuncs.c | 6 +----- 3 files changed, 14 insertions(+), 19 deletions(-) diff --git a/include/libbb.h b/include/libbb.h index ed1c41a02..85afdf20a 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -551,6 +551,16 @@ int execable_file(const char *name); char *find_execable(const char *filename); int exists_execable(const char *filename); +#ifdef ENABLE_FEATURE_EXEC_PREFER_APPLETS +#define BB_EXECVP(prog,cmd) \ + execvp((find_applet_by_name(prog)) ? CONFIG_BUSYBOX_EXEC_PATH : prog, cmd) +#define BB_EXECLP(prog,cmd,...) \ + execlp((find_applet_by_name(prog)) ? CONFIG_BUSYBOX_EXEC_PATH : prog, cmd, __VA_ARGS__) +#else +#define BB_EXECVP(prog,cmd) execvp(prog,cmd) +#define BB_EXECLP(prog,cmd,...) execvp(prog,cmd, __VA_ARGS__) +#endif + USE_DESKTOP(long long) int uncompress(int fd_in, int fd_out); int inflate(int in, int out); diff --git a/init/init.c b/init/init.c index cb314003e..110af8566 100644 --- a/init/init.c +++ b/init/init.c @@ -389,7 +389,6 @@ static pid_t run(const struct init_action *a) #include CUSTOMIZED_BANNER #endif "\nPlease press Enter to activate this console. "; - const char *prog; /* Block sigchild while forking. */ sigemptyset(&nmask); @@ -561,10 +560,7 @@ static pid_t run(const struct init_action *a) /* Now run it. The new program will take over this PID, * so nothing further in init.c should be run. */ - prog = cmdpath; - if (ENABLE_FEATURE_EXEC_PREFER_APPLETS && find_applet_by_name(prog)) - prog = CONFIG_BUSYBOX_EXEC_PATH; - execvp(prog, cmd); + BB_EXECVP(cmdpath, cmd); /* We're still here? Some error happened. */ message(LOG | CONSOLE, "Bummer, cannot run '%s': %m", cmdpath); @@ -682,7 +678,6 @@ static void exec_signal(int sig ATTRIBUTE_UNUSED) { struct init_action *a, *tmp; sigset_t unblock_signals; - char *prog; for (a = init_action_list; a; a = tmp) { tmp = a->next; @@ -718,10 +713,7 @@ static void exec_signal(int sig ATTRIBUTE_UNUSED) dup(0); messageD(CONSOLE | LOG, "Trying to re-exec %s", a->command); - prog = a->command; - if (ENABLE_FEATURE_EXEC_PREFER_APPLETS && find_applet_by_name(prog)) - prog = CONFIG_BUSYBOX_EXEC_PATH; - execlp(prog, a->command, NULL); + BB_EXECLP(a->command, a->command, NULL); message(CONSOLE | LOG, "exec of '%s' failed: %m", a->command); @@ -1076,10 +1068,7 @@ int init_main(int argc, char **argv) putenv("SELINUX_INIT=YES"); if (selinux_init_load_policy(&enforce) == 0) { - char *prog = argv[0]; - if (ENABLE_FEATURE_EXEC_PREFER_APPLETS && find_applet_by_name(prog)) - prog = CONFIG_BUSYBOX_EXEC_PATH; - execvp(prog, argv); + BB_EXECVP(argv[0], argv); } else if (enforce > 0) { /* SELinux in enforcing mode but load_policy failed */ /* At this point, we probably can't open /dev/console, so log() won't work */ diff --git a/libbb/xfuncs.c b/libbb/xfuncs.c index 601ff3f7e..3cbb0d3eb 100644 --- a/libbb/xfuncs.c +++ b/libbb/xfuncs.c @@ -184,17 +184,13 @@ pid_t spawn(char **argv) /* Why static? */ static int failed; pid_t pid; - const char *prog; // Be nice to nommu machines. failed = 0; pid = vfork(); if (pid < 0) return pid; if (!pid) { - prog = argv[0]; - if (ENABLE_FEATURE_EXEC_PREFER_APPLETS && find_applet_by_name(prog)) - prog = CONFIG_BUSYBOX_EXEC_PATH; - execvp(prog, argv); + BB_EXECVP(argv[0], argv); // We're sharing a stack with blocked parent, let parent know we failed // and then exit to unblock parent (but don't run atexit() stuff, which