From: Denis Vlasenko Date: Tue, 1 Apr 2008 17:43:03 +0000 (-0000) Subject: xfunc_die: resurrect (actually, it's "svn add" being forgotten again) X-Git-Tag: 1_11_0~380 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=0edbdd8ac8c0add7902d73a7ef921abba9f5752a;p=oweals%2Fbusybox.git xfunc_die: resurrect (actually, it's "svn add" being forgotten again) --- 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 + * + * 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); +}