diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-04-01 17:43:03 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-04-01 17:43:03 +0000 |
commit | 0edbdd8ac8c0add7902d73a7ef921abba9f5752a (patch) | |
tree | 364657f4a4613a7cdaab1e7b43e058f75a73b45e | |
parent | c59d802a5aa70c0c8f1f9fb8478351c6cbc3f86d (diff) |
xfunc_die: resurrect (actually, it's "svn add" being forgotten again)
-rw-r--r-- | libbb/xfunc_die.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/libbb/xfunc_die.c b/libbb/xfunc_die.c new file mode 100644 index 000000000..357494d34 --- /dev/null +++ b/libbb/xfunc_die.c @@ -0,0 +1,40 @@ +/* vi: set sw=4 ts=4: */ +/* + * Utility routines. + * + * Copyright (C) 2008 by Denys Vlasenko <vda.linux@googlemail.com> + * + * Licensed under GPLv2, see file LICENSE in this tarball for details. + */ + +/* Keeping it separate allows to NOT suck in stdio for VERY small applets. + * Try building busybox with only "true" enabled... */ + +#include "libbb.h" + +int die_sleep; +#if ENABLE_FEATURE_PREFER_APPLETS || ENABLE_HUSH +jmp_buf die_jmp; +#endif + +void xfunc_die(void) +{ + if (die_sleep) { + if ((ENABLE_FEATURE_PREFER_APPLETS || ENABLE_HUSH) + && die_sleep < 0 + ) { + /* Special case. We arrive here if NOFORK applet + * calls xfunc, which then decides to die. + * We don't die, but jump instead back to caller. + * NOFORK applets still cannot carelessly call xfuncs: + * p = xmalloc(10); + * q = xmalloc(10); // BUG! if this dies, we leak p! + */ + /* -2222 means "zero" (longjmp can't pass 0) + * run_nofork_applet() catches -2222. */ + longjmp(die_jmp, xfunc_error_retval ? xfunc_error_retval : -2222); + } + sleep(die_sleep); + } + exit(xfunc_error_retval); +} |