aboutsummaryrefslogtreecommitdiff
path: root/libbb
diff options
context:
space:
mode:
Diffstat (limited to 'libbb')
-rw-r--r--libbb/vfork_daemon_rexec.c25
1 files changed, 10 insertions, 15 deletions
diff --git a/libbb/vfork_daemon_rexec.c b/libbb/vfork_daemon_rexec.c
index 64952225d..281ead4dc 100644
--- a/libbb/vfork_daemon_rexec.c
+++ b/libbb/vfork_daemon_rexec.c
@@ -107,15 +107,15 @@ int spawn_and_wait(char **argv)
const struct bb_applet *a = find_applet_by_name(argv[0]);
if (a && (a->nofork
-#ifndef BB_NOMMU
- || a->noexec /* NOEXEC cannot be used on NOMMU */
+#if BB_MMU
+ || a->noexec /* NOEXEC trick needs fork() */
#endif
)) {
int argc = 1;
char **pp = argv;
while (*++pp)
argc++;
-#ifndef BB_NOMMU
+#if BB_MMU
if (a->nofork)
#endif
{
@@ -136,7 +136,7 @@ int spawn_and_wait(char **argv)
applet_name = a->name;
// what else should we save/restore?
// TODO: what if applet will mangle argv vector?
-// xargs needs argv untouched because it frees the vector!
+// xargs needs argv untouched because it frees argv[i]!
// shouldn't we pass a copy?
rc = a->main(argc, argv);
current_applet = old_a;
@@ -152,29 +152,25 @@ int spawn_and_wait(char **argv)
option_mask32 = old_m;
return rc;
}
-#ifndef BB_NOMMU /* MMU only */
+#if BB_MMU
+ /* MMU only */
/* a->noexec is true */
rc = fork();
- if (rc)
- goto w;
+ if (rc) /* parent or error */
+ return wait4pid(rc);
/* child */
xfunc_error_retval = EXIT_FAILURE;
current_applet = a;
run_current_applet_and_exit(argc, argv);
#endif
}
+#endif /* FEATURE_PREFER_APPLETS */
rc = spawn(argv);
-#ifndef BB_NOMMU
- w:
-#endif
return wait4pid(rc);
-#else /* !FEATURE_PREFER_APPLETS */
- return wait4pid(spawn(argv));
-#endif
}
-#ifdef BB_NOMMU
+#if !BB_MMU
void forkexit_or_rexec(char **argv)
{
pid_t pid;
@@ -210,7 +206,6 @@ void forkexit_or_rexec(void)
#define forkexit_or_rexec(argv) forkexit_or_rexec()
#endif
-
/* Due to a #define in libbb.h on MMU systems we actually have 1 argument -
* char **argv "vanishes" */
void bb_daemonize_or_rexec(int flags, char **argv)