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