From 0edbdd8ac8c0add7902d73a7ef921abba9f5752a Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Tue, 1 Apr 2008 17:43:03 +0000 Subject: xfunc_die: resurrect (actually, it's "svn add" being forgotten again) --- libbb/xfunc_die.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 libbb/xfunc_die.c (limited to 'libbb/xfunc_die.c') 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); +} -- cgit v1.2.3