make a few struct bb_applet members conditional

rename sllep_and_die -> xfunc_die
make fflush_stdout_and_exit NOFORK-safe
fix some buglets found by randomconfig
This commit is contained in:
Denis Vlasenko
2007-04-10 21:38:30 +00:00
parent 07c394e69b
commit 335b63d8d1
18 changed files with 114 additions and 83 deletions

View File

@@ -16,7 +16,7 @@
*/
#include <paths.h>
#include "busybox.h" /* for struct BB_applet */
#include "busybox.h" /* for struct bb_applet */
/* This does a fork/exec in one call, using vfork(). Returns PID of new child,
* -1 for failure. Runs argv[0], searching path if that has no / in it. */
@@ -104,8 +104,9 @@ int spawn_and_wait(char **argv)
{
int rc;
if (ENABLE_FEATURE_EXEC_PREFER_APPLETS) {
const struct BB_applet *a = find_applet_by_name(argv[0]);
#if ENABLE_FEATURE_EXEC_PREFER_APPLETS
{
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 */
@@ -120,19 +121,27 @@ int spawn_and_wait(char **argv)
#endif
{
int old_sleep = die_sleep;
int old_x = xfunc_error_retval;
die_sleep = -1; /* special flag */
/* sleep_and_die() checks for it */
/* xfunc_die() checks for it */
rc = setjmp(die_jmp);
if (!rc) {
const struct BB_applet *old_a = current_applet;
const struct bb_applet *old_a = current_applet;
current_applet = a;
applet_name = a->name;
// what else should we save/restore?
rc = a->main(argc, argv);
current_applet = old_a;
applet_name = old_a->name;
} else {
/* xfunc died in NOFORK applet */
if (rc == -111)
rc = 0;
}
die_sleep = old_sleep;
xfunc_error_retval = old_x;
return rc;
}
#ifndef BB_NOMMU /* MMU only */
@@ -145,9 +154,13 @@ int spawn_and_wait(char **argv)
run_current_applet_and_exit(argc, argv);
#endif
}
}
rc = spawn(argv);
w:
#else /* !FEATURE_EXEC_PREFER_APPLETS */
rc = spawn(argv);
#endif /* FEATURE_EXEC_PREFER_APPLETS */
return wait4pid(rc);
}