EXEC_PREFER_APPLETS support by Gabriel L. Somlo
No binary (build failed)
—
(log yok)
| @@ -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]); | |
| @@ -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; | |
| @@ -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); | |
| } | |
| @@ -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); | |
| @@ -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; | |
| } | |
| @@ -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 */ | |
| @@ -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]); | |
| @@ -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]); | |
| } | |
| } | |
| @@ -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); | |
| } | |
| @@ -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 | |
| @@ -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 |
| @@ -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); | |
| } | |
| @@ -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); | |
| @@ -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"); | |
| } | |
| } | |
| @@ -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]); | |
| } | |
| @@ -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 | |
| @@ -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); | |
| } | |
| @@ -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"); | |
| @@ -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); | |
| } | |
| @@ -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]); | |
| } | |
| @@ -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); | |
| } | |
| @@ -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]); | |