* but it may exec busybox and call applet instead of searching PATH.
*/
#if ENABLE_FEATURE_PREFER_APPLETS
-int bb_execvp(const char *file, char *const argv[]) FAST_FUNC;
-#define BB_EXECVP(prog,cmd) bb_execvp(prog,cmd)
+int BB_EXECVP(const char *file, char *const argv[]) FAST_FUNC;
#define BB_EXECLP(prog,cmd,...) \
- execlp((find_applet_by_name(prog) >= 0) ? CONFIG_BUSYBOX_EXEC_PATH : prog, \
- cmd, __VA_ARGS__)
+ do { \
+ if (find_applet_by_name(prog) >= 0) \
+ execlp(bb_busybox_exec_path, cmd, __VA_ARGS__); \
+ execlp(prog, cmd, __VA_ARGS__); \
+ } while (0)
#else
#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
int BB_EXECVP_or_die(char **argv) NORETURN FAST_FUNC;
}
#if ENABLE_FEATURE_PREFER_APPLETS
-/* just like the real execvp, but try to launch an applet named 'file' first
- */
-int FAST_FUNC bb_execvp(const char *file, char *const argv[])
+/* just like the real execvp, but try to launch an applet named 'file' first */
+int FAST_FUNC BB_EXECVP(const char *file, char *const argv[])
{
- return execvp(find_applet_by_name(file) >= 0 ? bb_busybox_exec_path : file,
- argv);
+ if (find_applet_by_name(file) >= 0)
+ execvp(bb_busybox_exec_path, argv);
+ return execvp(file, argv);
}
#endif
int a = find_applet_by_name(argv[0]);
if (a >= 0 && (APPLET_IS_NOFORK(a)
-#if BB_MMU
+# if BB_MMU
|| APPLET_IS_NOEXEC(a) /* NOEXEC trick needs fork() */
-#endif
+# endif
)) {
-#if BB_MMU
+# if BB_MMU
if (APPLET_IS_NOFORK(a))
-#endif
+# endif
{
return run_nofork_applet(a, argv);
}
-#if BB_MMU
+# if BB_MMU
/* MMU only */
/* a->noexec is true */
rc = fork();
/* child */
xfunc_error_retval = EXIT_FAILURE;
run_applet_no_and_exit(a, argv);
-#endif
+# endif
}
#endif /* FEATURE_PREFER_APPLETS */
rc = spawn(argv);