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);
#include CUSTOMIZED_BANNER
#endif
"\nPlease press Enter to activate this console. ";
- const char *prog;
/* Block sigchild while forking. */
sigemptyset(&nmask);
/* 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);
{
struct init_action *a, *tmp;
sigset_t unblock_signals;
- char *prog;
for (a = init_action_list; a; a = tmp) {
tmp = a->next;
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);
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 */
/* 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