EXEC_PREFER_APPLETS support by Gabriel L. Somlo <somlo@cmu.edu>
This commit is contained in:
parent
cc24419e98
commit
1d76f439da
@ -529,7 +529,7 @@ static int writeTarFile(const int tar_fd, const int verboseFlag,
|
|||||||
close(gzipStatusPipe[0]);
|
close(gzipStatusPipe[0]);
|
||||||
fcntl(gzipStatusPipe[1], F_SETFD, FD_CLOEXEC); /* close on exec shows success */
|
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;
|
vfork_exec_errno = errno;
|
||||||
|
|
||||||
close(gzipStatusPipe[1]);
|
close(gzipStatusPipe[1]);
|
||||||
|
@ -36,7 +36,7 @@ int openvt_main(int argc, char **argv)
|
|||||||
dup2(fd, STDERR_FILENO);
|
dup2(fd, STDERR_FILENO);
|
||||||
while (fd > 2) close(fd--);
|
while (fd > 2) close(fd--);
|
||||||
|
|
||||||
execvp(argv[2], &argv[2]);
|
BB_EXECVP(argv[2], &argv[2]);
|
||||||
_exit(1);
|
_exit(1);
|
||||||
}
|
}
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
|
@ -33,6 +33,6 @@ int chroot_main(int argc, char **argv)
|
|||||||
argv[1] = (char *) "-i";
|
argv[1] = (char *) "-i";
|
||||||
}
|
}
|
||||||
|
|
||||||
execvp(*argv, argv);
|
BB_EXECVP(*argv, argv);
|
||||||
bb_perror_msg_and_die("cannot execute %s", *argv);
|
bb_perror_msg_and_die("cannot execute %s", *argv);
|
||||||
}
|
}
|
||||||
|
@ -81,7 +81,7 @@ int env_main(int argc, char** argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (*argv) {
|
if (*argv) {
|
||||||
execvp(*argv, argv);
|
BB_EXECVP(*argv, argv);
|
||||||
/* SUSv3-mandated exit codes. */
|
/* SUSv3-mandated exit codes. */
|
||||||
xfunc_error_retval = (errno == ENOENT) ? 127 : 126;
|
xfunc_error_retval = (errno == ENOENT) ? 127 : 126;
|
||||||
bb_perror_msg_and_die("%s", *argv);
|
bb_perror_msg_and_die("%s", *argv);
|
||||||
|
@ -126,7 +126,7 @@ int install_main(int argc, char **argv)
|
|||||||
ret = EXIT_FAILURE;
|
ret = EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
if (flags & OPT_STRIP) {
|
if (flags & OPT_STRIP) {
|
||||||
if (execlp("strip", "strip", dest, NULL) == -1) {
|
if (BB_EXECLP("strip", "strip", dest, NULL) == -1) {
|
||||||
bb_perror_msg("strip");
|
bb_perror_msg("strip");
|
||||||
ret = EXIT_FAILURE;
|
ret = EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
@ -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... */
|
/* The exec failed... */
|
||||||
xfunc_error_retval = (errno == ENOENT) ? 127 : 126; /* SUSv3 */
|
xfunc_error_retval = (errno == ENOENT) ? 127 : 126; /* SUSv3 */
|
||||||
|
@ -53,7 +53,7 @@ int nohup_main(int argc, char **argv)
|
|||||||
close(nullfd);
|
close(nullfd);
|
||||||
signal(SIGHUP, SIG_IGN);
|
signal(SIGHUP, SIG_IGN);
|
||||||
|
|
||||||
execvp(argv[1], argv+1);
|
BB_EXECVP(argv[1], argv+1);
|
||||||
if (ENABLE_FEATURE_CLEAN_UP && home)
|
if (ENABLE_FEATURE_CLEAN_UP && home)
|
||||||
free((char*)nohupout);
|
free((char*)nohupout);
|
||||||
bb_perror_msg_and_die("%s", argv[1]);
|
bb_perror_msg_and_die("%s", argv[1]);
|
||||||
|
@ -677,7 +677,7 @@ static void execute(const char *type, const char *device, const char *mntpt,
|
|||||||
* Use "fsck -s" to avoid... */
|
* Use "fsck -s" to avoid... */
|
||||||
close(0);
|
close(0);
|
||||||
}
|
}
|
||||||
execvp(argv[0], argv);
|
BB_EXECVP(argv[0], argv);
|
||||||
bb_perror_msg_and_die("%s", argv[0]);
|
bb_perror_msg_and_die("%s", argv[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -60,7 +60,7 @@ static int xargs_exec(char *const *args)
|
|||||||
|
|
||||||
if (p == 0) {
|
if (p == 0) {
|
||||||
/* vfork -- child */
|
/* vfork -- child */
|
||||||
execvp(args[0], args);
|
BB_EXECVP(args[0], args);
|
||||||
exec_errno = errno; /* set error to shared stack */
|
exec_errno = errno; /* set error to shared stack */
|
||||||
_exit(1);
|
_exit(1);
|
||||||
}
|
}
|
||||||
|
@ -562,12 +562,13 @@ char *find_execable(const char *filename);
|
|||||||
int exists_execable(const char *filename);
|
int exists_execable(const char *filename);
|
||||||
|
|
||||||
#ifdef ENABLE_FEATURE_EXEC_PREFER_APPLETS
|
#ifdef ENABLE_FEATURE_EXEC_PREFER_APPLETS
|
||||||
#define BB_EXECVP(prog,cmd) \
|
int bb_execvp(const char *file, char *const argv[]);
|
||||||
execvp((find_applet_by_name(prog)) ? CONFIG_BUSYBOX_EXEC_PATH : prog, cmd)
|
#define BB_EXECVP(prog,cmd) bb_execvp(prog,cmd)
|
||||||
#define BB_EXECLP(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
|
#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__)
|
#define BB_EXECLP(prog,cmd,...) execlp(prog,cmd, __VA_ARGS__)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -59,3 +59,13 @@ int exists_execable(const char *filename)
|
|||||||
}
|
}
|
||||||
return 0;
|
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
|
||||||
|
@ -80,7 +80,7 @@ static void passwd_wrapper(const char *login) ATTRIBUTE_NORETURN;
|
|||||||
static void passwd_wrapper(const char *login)
|
static void passwd_wrapper(const char *login)
|
||||||
{
|
{
|
||||||
static const char prog[] = "passwd";
|
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);
|
bb_error_msg_and_die("failed to execute '%s', you must set the password for '%s' manually", prog, login);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -357,7 +357,7 @@ auth_failed:
|
|||||||
setenv("LOGIN_UID", utoa(pw->pw_uid), 1);
|
setenv("LOGIN_UID", utoa(pw->pw_uid), 1);
|
||||||
setenv("LOGIN_GID", utoa(pw->pw_gid), 1);
|
setenv("LOGIN_GID", utoa(pw->pw_gid), 1);
|
||||||
setenv("LOGIN_SHELL", pw->pw_shell, 1);
|
setenv("LOGIN_SHELL", pw->pw_shell, 1);
|
||||||
execvp(script, t_argv);
|
BB_EXECVP(script, t_argv);
|
||||||
exit(1);
|
exit(1);
|
||||||
default: /* parent */
|
default: /* parent */
|
||||||
wait(NULL);
|
wait(NULL);
|
||||||
|
@ -378,7 +378,7 @@ static void fork_and_execute(int die, char *arg0, char **arg )
|
|||||||
/* Child : if arg0 != NULL do execvp */
|
/* Child : if arg0 != NULL do execvp */
|
||||||
if(arg0 != NULL )
|
if(arg0 != NULL )
|
||||||
{
|
{
|
||||||
execvp (arg0, arg);
|
BB_EXECVP(arg0, arg);
|
||||||
msg_logger_and_die(LOG_ERR, "execvp");
|
msg_logger_and_die(LOG_ERR, "execvp");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -36,7 +36,7 @@ int setsid_main(int argc, char *argv[])
|
|||||||
|
|
||||||
setsid(); /* no error possible */
|
setsid(); /* no error possible */
|
||||||
|
|
||||||
execvp(argv[1], argv + 1);
|
BB_EXECVP(argv[1], argv + 1);
|
||||||
|
|
||||||
bb_perror_msg_and_die("%s", argv[1]);
|
bb_perror_msg_and_die("%s", argv[1]);
|
||||||
}
|
}
|
||||||
|
@ -91,7 +91,7 @@ int taskset_main(int argc, char** argv)
|
|||||||
goto print_aff;
|
goto print_aff;
|
||||||
}
|
}
|
||||||
++argv;
|
++argv;
|
||||||
execvp(*argv, argv);
|
BB_EXECVP(*argv, argv);
|
||||||
bb_perror_msg_and_die("%s", *argv);
|
bb_perror_msg_and_die("%s", *argv);
|
||||||
}
|
}
|
||||||
#undef OPT_p
|
#undef OPT_p
|
||||||
|
@ -410,7 +410,7 @@ static void run_command(char *const *cmd, resource_t * resp)
|
|||||||
else if (pid == 0) { /* If child. */
|
else if (pid == 0) { /* If child. */
|
||||||
/* Don't cast execvp arguments; that causes errors on some systems,
|
/* Don't cast execvp arguments; that causes errors on some systems,
|
||||||
versus merely warnings if the cast is left off. */
|
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]);
|
bb_error_msg("cannot run %s", cmd[0]);
|
||||||
_exit(errno == ENOENT ? 127 : 126);
|
_exit(errno == ENOENT ? 127 : 126);
|
||||||
}
|
}
|
||||||
|
@ -1004,7 +1004,7 @@ static int popen2(FILE **in, FILE **out, char *command, ...)
|
|||||||
close(infd[1]);
|
close(infd[1]);
|
||||||
close(outfd[0]);
|
close(outfd[0]);
|
||||||
close(outfd[1]);
|
close(outfd[1]);
|
||||||
execvp(command, argv);
|
BB_EXECVP(command, argv);
|
||||||
exit(127);
|
exit(127);
|
||||||
default: /* parent */
|
default: /* parent */
|
||||||
*in = fdopen(infd[1], "w");
|
*in = fdopen(infd[1], "w");
|
||||||
|
@ -149,7 +149,7 @@ int nc_main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
dup2(0, 1);
|
dup2(0, 1);
|
||||||
dup2(0, 2);
|
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.... */
|
/* Don't print stuff or it will go over the wire.... */
|
||||||
_exit(127);
|
_exit(127);
|
||||||
}
|
}
|
||||||
|
@ -310,7 +310,7 @@ int chpst_main(int argc, char **argv)
|
|||||||
if (OPT_nostdin) close(0);
|
if (OPT_nostdin) close(0);
|
||||||
if (OPT_nostdout) close(1);
|
if (OPT_nostdout) close(1);
|
||||||
if (OPT_nostderr) close(2);
|
if (OPT_nostderr) close(2);
|
||||||
execvp(argv[0], argv);
|
BB_EXECVP(argv[0], argv);
|
||||||
bb_perror_msg_and_die("exec %s", argv[0]);
|
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 (!account) bb_show_usage();
|
||||||
if (!*++argv) bb_show_usage();
|
if (!*++argv) bb_show_usage();
|
||||||
suidgid((char*)account);
|
suidgid((char*)account);
|
||||||
execvp(argv[0], argv);
|
BB_EXECVP(argv[0], argv);
|
||||||
bb_perror_msg_and_die("exec %s", argv[0]);
|
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 (!account) bb_show_usage();
|
||||||
if (!*++argv) bb_show_usage();
|
if (!*++argv) bb_show_usage();
|
||||||
euidgid((char*)account);
|
euidgid((char*)account);
|
||||||
execvp(argv[0], argv);
|
BB_EXECVP(argv[0], argv);
|
||||||
bb_perror_msg_and_die("exec %s", argv[0]);
|
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 (!dir) bb_show_usage();
|
||||||
if (!*++argv) bb_show_usage();
|
if (!*++argv) bb_show_usage();
|
||||||
edir(dir);
|
edir(dir);
|
||||||
execvp(argv[0], argv);
|
BB_EXECVP(argv[0], argv);
|
||||||
bb_perror_msg_and_die("exec %s", argv[0]);
|
bb_perror_msg_and_die("exec %s", argv[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -369,6 +369,6 @@ static void softlimit(int argc, char **argv)
|
|||||||
argv += optind;
|
argv += optind;
|
||||||
if (!argv[0]) bb_show_usage();
|
if (!argv[0]) bb_show_usage();
|
||||||
slimit();
|
slimit();
|
||||||
execvp(argv[0], argv);
|
BB_EXECVP(argv[0], argv);
|
||||||
bb_perror_msg_and_die("exec %s", argv[0]);
|
bb_perror_msg_and_die("exec %s", argv[0]);
|
||||||
}
|
}
|
||||||
|
@ -73,7 +73,7 @@ static void runsv(int no, const char *name)
|
|||||||
sig_uncatch(SIGHUP);
|
sig_uncatch(SIGHUP);
|
||||||
sig_uncatch(SIGTERM);
|
sig_uncatch(SIGTERM);
|
||||||
if (pgrp) setsid();
|
if (pgrp) setsid();
|
||||||
execvp(prog[0], prog);
|
BB_EXECVP(prog[0], prog);
|
||||||
//pathexec_run(*prog, prog, (char* const*)environ);
|
//pathexec_run(*prog, prog, (char* const*)environ);
|
||||||
fatal2_cannot("start runsv ", name);
|
fatal2_cannot("start runsv ", name);
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,7 @@ retry:
|
|||||||
if (personality(pers) >= 0) {
|
if (personality(pers) >= 0) {
|
||||||
|
|
||||||
/* Try to execute the program */
|
/* Try to execute the program */
|
||||||
execvp(argv[0], argv);
|
BB_EXECVP(argv[0], argv);
|
||||||
}
|
}
|
||||||
|
|
||||||
bb_perror_msg_and_die("%s", argv[0]);
|
bb_perror_msg_and_die("%s", argv[0]);
|
||||||
|
Loading…
Reference in New Issue
Block a user