OSDN Git Service

Add BB_EXEC[LV]P() which encapsulate FEATURE_EXEC_PREFER_APPLETS
authorDenis Vlasenko <vda.linux@googlemail.com>
Sat, 3 Feb 2007 02:17:41 +0000 (02:17 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sat, 3 Feb 2007 02:17:41 +0000 (02:17 -0000)
(patch from Gabriel L. Somlo <somlo@cmu.edu>)

include/libbb.h
init/init.c
libbb/xfuncs.c

index ed1c41a..85afdf2 100644 (file)
@@ -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);
 
index cb31400..110af85 100644 (file)
@@ -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 */
index 601ff3f..3cbb0d3 100644 (file)
@@ -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