/* 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 FAST_FUNC 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); }