summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko2007-02-06 01:20:12 +0000
committerDenis Vlasenko2007-02-06 01:20:12 +0000
commit1d76f439da81d3a05f0e0fdde3f81ec56fb20836 (patch)
treef3e2e2185d092f87843fe4bbc9d1098185a5bdbd
parentcc24419e98853aede7c652edb3c1c79a9865bdda (diff)
downloadbusybox-1d76f439da81d3a05f0e0fdde3f81ec56fb20836.zip
busybox-1d76f439da81d3a05f0e0fdde3f81ec56fb20836.tar.gz
EXEC_PREFER_APPLETS support by Gabriel L. Somlo <somlo@cmu.edu>
-rw-r--r--archival/tar.c2
-rw-r--r--console-tools/openvt.c2
-rw-r--r--coreutils/chroot.c2
-rw-r--r--coreutils/env.c2
-rw-r--r--coreutils/install.c2
-rw-r--r--coreutils/nice.c2
-rw-r--r--coreutils/nohup.c2
-rw-r--r--e2fsprogs/fsck.c2
-rw-r--r--findutils/xargs.c2
-rw-r--r--include/libbb.h9
-rw-r--r--libbb/execable.c10
-rw-r--r--loginutils/adduser.c2
-rw-r--r--loginutils/login.c2
-rw-r--r--miscutils/devfsd.c2
-rw-r--r--miscutils/setsid.c2
-rw-r--r--miscutils/taskset.c2
-rw-r--r--miscutils/time.c2
-rw-r--r--networking/ifupdown.c2
-rw-r--r--networking/nc.c2
-rw-r--r--runit/chpst.c10
-rw-r--r--runit/runsvdir.c2
-rw-r--r--util-linux/setarch.c2
22 files changed, 39 insertions, 28 deletions
diff --git a/archival/tar.c b/archival/tar.c
index 48c4f3f..d8e3674 100644
--- a/archival/tar.c
+++ b/archival/tar.c
@@ -529,7 +529,7 @@ static int writeTarFile(const int tar_fd, const int verboseFlag,
close(gzipStatusPipe[0]);
fcntl(gzipStatusPipe[1], F_SETFD, FD_CLOEXEC); /* close on exec shows success */
- execlp(zip_exec, zip_exec, "-f", NULL);
+ BB_EXECLP(zip_exec, zip_exec, "-f", NULL);
vfork_exec_errno = errno;
close(gzipStatusPipe[1]);
diff --git a/console-tools/openvt.c b/console-tools/openvt.c
index 9296219..eb9f49f 100644
--- a/console-tools/openvt.c
+++ b/console-tools/openvt.c
@@ -36,7 +36,7 @@ int openvt_main(int argc, char **argv)
dup2(fd, STDERR_FILENO);
while (fd > 2) close(fd--);
- execvp(argv[2], &argv[2]);
+ BB_EXECVP(argv[2], &argv[2]);
_exit(1);
}
return EXIT_SUCCESS;
diff --git a/coreutils/chroot.c b/coreutils/chroot.c
index 16c743f..fcd70f2 100644
--- a/coreutils/chroot.c
+++ b/coreutils/chroot.c
@@ -33,6 +33,6 @@ int chroot_main(int argc, char **argv)
argv[1] = (char *) "-i";
}
- execvp(*argv, argv);
+ BB_EXECVP(*argv, argv);
bb_perror_msg_and_die("cannot execute %s", *argv);
}
diff --git a/coreutils/env.c b/coreutils/env.c
index 04279f3..7be0c63 100644
--- a/coreutils/env.c
+++ b/coreutils/env.c
@@ -81,7 +81,7 @@ int env_main(int argc, char** argv)
}
if (*argv) {
- execvp(*argv, argv);
+ BB_EXECVP(*argv, argv);
/* SUSv3-mandated exit codes. */
xfunc_error_retval = (errno == ENOENT) ? 127 : 126;
bb_perror_msg_and_die("%s", *argv);
diff --git a/coreutils/install.c b/coreutils/install.c
index dd73fb6..c105add 100644
--- a/coreutils/install.c
+++ b/coreutils/install.c
@@ -126,7 +126,7 @@ int install_main(int argc, char **argv)
ret = EXIT_FAILURE;
}
if (flags & OPT_STRIP) {
- if (execlp("strip", "strip", dest, NULL) == -1) {
+ if (BB_EXECLP("strip", "strip", dest, NULL) == -1) {
bb_perror_msg("strip");
ret = EXIT_FAILURE;
}
diff --git a/coreutils/nice.c b/coreutils/nice.c
index b7bff6a..3285315 100644
--- a/coreutils/nice.c
+++ b/coreutils/nice.c
@@ -47,7 +47,7 @@ int nice_main(int argc, char **argv)
}
}
- execvp(*argv, argv); /* Now exec the desired program. */
+ BB_EXECVP(*argv, argv); /* Now exec the desired program. */
/* The exec failed... */
xfunc_error_retval = (errno == ENOENT) ? 127 : 126; /* SUSv3 */
diff --git a/coreutils/nohup.c b/coreutils/nohup.c
index a9944b7..6a6c70e 100644
--- a/coreutils/nohup.c
+++ b/coreutils/nohup.c
@@ -53,7 +53,7 @@ int nohup_main(int argc, char **argv)
close(nullfd);
signal(SIGHUP, SIG_IGN);
- execvp(argv[1], argv+1);
+ BB_EXECVP(argv[1], argv+1);
if (ENABLE_FEATURE_CLEAN_UP && home)
free((char*)nohupout);
bb_perror_msg_and_die("%s", argv[1]);
diff --git a/e2fsprogs/fsck.c b/e2fsprogs/fsck.c
index 9ec31d2..ad22fcd 100644
--- a/e2fsprogs/fsck.c
+++ b/e2fsprogs/fsck.c
@@ -677,7 +677,7 @@ static void execute(const char *type, const char *device, const char *mntpt,
* Use "fsck -s" to avoid... */
close(0);
}
- execvp(argv[0], argv);
+ BB_EXECVP(argv[0], argv);
bb_perror_msg_and_die("%s", argv[0]);
}
}
diff --git a/findutils/xargs.c b/findutils/xargs.c
index c2060f8..44dbcda 100644
--- a/findutils/xargs.c
+++ b/findutils/xargs.c
@@ -60,7 +60,7 @@ static int xargs_exec(char *const *args)
if (p == 0) {
/* vfork -- child */
- execvp(args[0], args);
+ BB_EXECVP(args[0], args);
exec_errno = errno; /* set error to shared stack */
_exit(1);
}
diff --git a/include/libbb.h b/include/libbb.h
index 7342f89..babb39b 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -562,12 +562,13 @@ 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)
+int bb_execvp(const char *file, char *const argv[]);
+#define BB_EXECVP(prog,cmd) bb_execvp(prog,cmd)
#define BB_EXECLP(prog,cmd,...) \
- execlp((find_applet_by_name(prog)) ? CONFIG_BUSYBOX_EXEC_PATH : prog, cmd, __VA_ARGS__)
+ 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_EXECVP(prog,cmd) execvp(prog,cmd)
#define BB_EXECLP(prog,cmd,...) execlp(prog,cmd, __VA_ARGS__)
#endif
diff --git a/libbb/execable.c b/libbb/execable.c
index 817c067..601c753 100644
--- a/libbb/execable.c
+++ b/libbb/execable.c
@@ -59,3 +59,13 @@ int exists_execable(const char *filename)
}
return 0;
}
+
+#ifdef ENABLE_FEATURE_EXEC_PREFER_APPLETS
+/* 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);
+}
+#endif
diff --git a/loginutils/adduser.c b/loginutils/adduser.c
index 8193aea..b6d0c62 100644
--- a/loginutils/adduser.c
+++ b/loginutils/adduser.c
@@ -80,7 +80,7 @@ static void passwd_wrapper(const char *login) ATTRIBUTE_NORETURN;
static void passwd_wrapper(const char *login)
{
static const char prog[] = "passwd";
- execlp(prog, prog, login, NULL);
+ BB_EXECLP(prog, prog, login, NULL);
bb_error_msg_and_die("failed to execute '%s', you must set the password for '%s' manually", prog, login);
}
diff --git a/loginutils/login.c b/loginutils/login.c
index a19191b..830df0a 100644
--- a/loginutils/login.c
+++ b/loginutils/login.c
@@ -357,7 +357,7 @@ auth_failed:
setenv("LOGIN_UID", utoa(pw->pw_uid), 1);
setenv("LOGIN_GID", utoa(pw->pw_gid), 1);
setenv("LOGIN_SHELL", pw->pw_shell, 1);
- execvp(script, t_argv);
+ BB_EXECVP(script, t_argv);
exit(1);
default: /* parent */
wait(NULL);
diff --git a/miscutils/devfsd.c b/miscutils/devfsd.c
index 69c6987..96c172c 100644
--- a/miscutils/devfsd.c
+++ b/miscutils/devfsd.c
@@ -378,7 +378,7 @@ static void fork_and_execute(int die, char *arg0, char **arg )
/* Child : if arg0 != NULL do execvp */
if(arg0 != NULL )
{
- execvp (arg0, arg);
+ BB_EXECVP(arg0, arg);
msg_logger_and_die(LOG_ERR, "execvp");
}
}
diff --git a/miscutils/setsid.c b/miscutils/setsid.c
index b4d5ced..6db07be 100644
--- a/miscutils/setsid.c
+++ b/miscutils/setsid.c
@@ -36,7 +36,7 @@ int setsid_main(int argc, char *argv[])
setsid(); /* no error possible */
- execvp(argv[1], argv + 1);
+ BB_EXECVP(argv[1], argv + 1);
bb_perror_msg_and_die("%s", argv[1]);
}
diff --git a/miscutils/taskset.c b/miscutils/taskset.c
index cf6a8be..b3bf490 100644
--- a/miscutils/taskset.c
+++ b/miscutils/taskset.c
@@ -91,7 +91,7 @@ int taskset_main(int argc, char** argv)
goto print_aff;
}
++argv;
- execvp(*argv, argv);
+ BB_EXECVP(*argv, argv);
bb_perror_msg_and_die("%s", *argv);
}
#undef OPT_p
diff --git a/miscutils/time.c b/miscutils/time.c
index 56f1d4a..a459195 100644
--- a/miscutils/time.c
+++ b/miscutils/time.c
@@ -410,7 +410,7 @@ static void run_command(char *const *cmd, resource_t * resp)
else if (pid == 0) { /* If child. */
/* Don't cast execvp arguments; that causes errors on some systems,
versus merely warnings if the cast is left off. */
- execvp(cmd[0], cmd);
+ BB_EXECVP(cmd[0], cmd);
bb_error_msg("cannot run %s", cmd[0]);
_exit(errno == ENOENT ? 127 : 126);
}
diff --git a/networking/ifupdown.c b/networking/ifupdown.c
index ce3b9ba..ccebecd 100644
--- a/networking/ifupdown.c
+++ b/networking/ifupdown.c
@@ -1004,7 +1004,7 @@ static int popen2(FILE **in, FILE **out, char *command, ...)
close(infd[1]);
close(outfd[0]);
close(outfd[1]);
- execvp(command, argv);
+ BB_EXECVP(command, argv);
exit(127);
default: /* parent */
*in = fdopen(infd[1], "w");
diff --git a/networking/nc.c b/networking/nc.c
index c1e8811..1bdecaf 100644
--- a/networking/nc.c
+++ b/networking/nc.c
@@ -149,7 +149,7 @@ int nc_main(int argc, char **argv)
}
dup2(0, 1);
dup2(0, 2);
- USE_NC_EXTRA(execvp(execparam[0], execparam);)
+ USE_NC_EXTRA(BB_EXECVP(execparam[0], execparam);)
/* Don't print stuff or it will go over the wire.... */
_exit(127);
}
diff --git a/runit/chpst.c b/runit/chpst.c
index 053051d..7b90784 100644
--- a/runit/chpst.c
+++ b/runit/chpst.c
@@ -310,7 +310,7 @@ int chpst_main(int argc, char **argv)
if (OPT_nostdin) close(0);
if (OPT_nostdout) close(1);
if (OPT_nostderr) close(2);
- execvp(argv[0], argv);
+ BB_EXECVP(argv[0], argv);
bb_perror_msg_and_die("exec %s", argv[0]);
}
@@ -322,7 +322,7 @@ static void setuidgid(int argc, char **argv)
if (!account) bb_show_usage();
if (!*++argv) bb_show_usage();
suidgid((char*)account);
- execvp(argv[0], argv);
+ BB_EXECVP(argv[0], argv);
bb_perror_msg_and_die("exec %s", argv[0]);
}
@@ -334,7 +334,7 @@ static void envuidgid(int argc, char **argv)
if (!account) bb_show_usage();
if (!*++argv) bb_show_usage();
euidgid((char*)account);
- execvp(argv[0], argv);
+ BB_EXECVP(argv[0], argv);
bb_perror_msg_and_die("exec %s", argv[0]);
}
@@ -346,7 +346,7 @@ static void envdir(int argc, char **argv)
if (!dir) bb_show_usage();
if (!*++argv) bb_show_usage();
edir(dir);
- execvp(argv[0], argv);
+ BB_EXECVP(argv[0], argv);
bb_perror_msg_and_die("exec %s", argv[0]);
}
@@ -369,6 +369,6 @@ static void softlimit(int argc, char **argv)
argv += optind;
if (!argv[0]) bb_show_usage();
slimit();
- execvp(argv[0], argv);
+ BB_EXECVP(argv[0], argv);
bb_perror_msg_and_die("exec %s", argv[0]);
}
diff --git a/runit/runsvdir.c b/runit/runsvdir.c
index d9053ad..2d2b5db 100644
--- a/runit/runsvdir.c
+++ b/runit/runsvdir.c
@@ -73,7 +73,7 @@ static void runsv(int no, const char *name)
sig_uncatch(SIGHUP);
sig_uncatch(SIGTERM);
if (pgrp) setsid();
- execvp(prog[0], prog);
+ BB_EXECVP(prog[0], prog);
//pathexec_run(*prog, prog, (char* const*)environ);
fatal2_cannot("start runsv ", name);
}
diff --git a/util-linux/setarch.c b/util-linux/setarch.c
index 8f4e308..a7a45ec 100644
--- a/util-linux/setarch.c
+++ b/util-linux/setarch.c
@@ -46,7 +46,7 @@ retry:
if (personality(pers) >= 0) {
/* Try to execute the program */
- execvp(argv[0], argv);
+ BB_EXECVP(argv[0], argv);
}
bb_perror_msg_and_die("%s", argv[0]);