aboutsummaryrefslogtreecommitdiff
path: root/libbb/fflush_stdout_and_exit.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbb/fflush_stdout_and_exit.c')
-rw-r--r--libbb/fflush_stdout_and_exit.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/libbb/fflush_stdout_and_exit.c b/libbb/fflush_stdout_and_exit.c
index ae68222b4..d79827f45 100644
--- a/libbb/fflush_stdout_and_exit.c
+++ b/libbb/fflush_stdout_and_exit.c
@@ -13,13 +13,17 @@
#include "libbb.h"
-// TODO: make it safe to call from NOFORK applets
-// Currently, it can exit(0). Even if it is made to do longjmp trick
-// (see sleep_and_die internals), zero cannot be passed thru this way!
-
void fflush_stdout_and_exit(int retval)
{
if (fflush(stdout))
- sleep_and_die();
+ xfunc_die();
+
+ if (ENABLE_FEATURE_EXEC_PREFER_APPLETS && die_sleep < 0) {
+ /* We are in NOFORK applet. Do not exit() directly,
+ * but use xfunc_die() */
+ xfunc_error_retval = retval;
+ xfunc_die();
+ }
+
exit(retval);
}