1/* vi: set sw=4 ts=4: */ 2/* 3 * Utility routines. 4 * 5 * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org> 6 * 7 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. 8 */ 9 10#include "libbb.h" 11 12int die_sleep; 13#if ENABLE_FEATURE_PREFER_APPLETS || ENABLE_HUSH 14jmp_buf die_jmp; 15#endif 16 17void xfunc_die(void) 18{ 19 if (die_sleep) { 20 if ((ENABLE_FEATURE_PREFER_APPLETS || ENABLE_HUSH) 21 && die_sleep < 0 22 ) { 23 /* Special case. We arrive here if NOFORK applet 24 * calls xfunc, which then decides to die. 25 * We don't die, but jump instead back to caller. 26 * NOFORK applets still cannot carelessly call xfuncs: 27 * p = xmalloc(10); 28 * q = xmalloc(10); // BUG! if this dies, we leak p! 29 */ 30 /* -2222 means "zero" (longjmp can't pass 0) 31 * run_nofork_applet() catches -2222. */ 32 longjmp(die_jmp, xfunc_error_retval ? xfunc_error_retval : -2222); 33 } 34 sleep(die_sleep); 35 } 36 exit(xfunc_error_retval); 37} 38 39void bb_error_msg_and_die(const char *s, ...) 40{ 41 va_list p; 42 43 va_start(p, s); 44 bb_verror_msg(s, p, NULL); 45 va_end(p); 46 xfunc_die(); 47} 48