aboutsummaryrefslogtreecommitdiff
path: root/libbb/xfuncs.c
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2007-01-21 00:41:04 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2007-01-21 00:41:04 +0000
commit2f0c0d0b8829b8aea97bc09833e172c59b55cd94 (patch)
tree3e82c2dd94d674a723f3d7df350f32dc8892adc1 /libbb/xfuncs.c
parentb3f3c23f786a2486a8545ef0d904061ac83e6453 (diff)
downloadbusybox-2f0c0d0b8829b8aea97bc09833e172c59b55cd94.tar.gz
Introduce FEATURE_EXEC_PREFER_APPLETS = "re-execute our own
executable if we asked to exec someting with argv[0] == known_applet" Use it in init. Also respect PATH in init, remove explicit "/sbin" etc from exec. Patch by Gabriel L. Somlo <somlo@cmu.edu>
Diffstat (limited to 'libbb/xfuncs.c')
-rw-r--r--libbb/xfuncs.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/libbb/xfuncs.c b/libbb/xfuncs.c
index 240ac5d3d..4252e7646 100644
--- a/libbb/xfuncs.c
+++ b/libbb/xfuncs.c
@@ -183,14 +183,17 @@ pid_t spawn(char **argv)
/* Why static? */
static int failed;
pid_t pid;
- void *app = ENABLE_FEATURE_SH_STANDALONE_SHELL ? find_applet_by_name(argv[0]) : 0;
+ char *prog;
// Be nice to nommu machines.
failed = 0;
pid = vfork();
if (pid < 0) return pid;
if (!pid) {
- execvp(app ? CONFIG_BUSYBOX_EXEC_PATH : *argv, argv);
+ prog = argv[0];
+ if (ENABLE_FEATURE_EXEC_PREFER_APPLETS && find_applet_by_name(prog))
+ prog = CONFIG_BUSYBOX_EXEC_PATH;
+ execvp(prog, 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