2 * Copyright (c) 2004-2005, 2010-2013 Todd C. Miller <Todd.Miller@courtesan.com>
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 #include <sys/types.h>
28 # include "compat/stdbool.h"
29 #endif /* HAVE_STDBOOL_H */
34 #include "sudo_plugin.h"
36 #define DEFAULT_TEXT_DOMAIN "sudo"
40 static bool setjmp_enabled = false;
41 static struct sudo_fatal_callback {
43 struct sudo_fatal_callback *next;
46 static void _warning(int, const char *, va_list);
51 struct sudo_fatal_callback *cb;
53 /* Run callbacks, removing them from the list as we go. */
54 while ((cb = callbacks) != NULL) {
62 fatal2(const char *fmt, ...)
71 siglongjmp(fatal_jmp, 1);
77 fatalx2(const char *fmt, ...)
86 siglongjmp(fatal_jmp, 1);
92 vfatal2(const char *fmt, va_list ap)
97 siglongjmp(fatal_jmp, 1);
103 vfatalx2(const char *fmt, va_list ap)
105 _warning(0, fmt, ap);
108 siglongjmp(fatal_jmp, 1);
114 warning2(const char *fmt, ...)
119 _warning(1, fmt, ap);
124 warningx2(const char *fmt, ...)
128 _warning(0, fmt, ap);
133 vwarning2(const char *fmt, va_list ap)
135 _warning(1, fmt, ap);
139 vwarningx2(const char *fmt, va_list ap)
141 _warning(0, fmt, ap);
145 _warning(int use_errno, const char *fmt, va_list ap)
150 evasprintf(&str, fmt, ap);
153 sudo_printf(SUDO_CONV_ERROR_MSG,
154 _("%s: %s: %s\n"), getprogname(), str, strerror(serrno));
156 sudo_printf(SUDO_CONV_ERROR_MSG,
157 _("%s: %s\n"), getprogname(), strerror(serrno));
160 sudo_printf(SUDO_CONV_ERROR_MSG,
161 _("%s: %s\n"), getprogname(), str ? str : "(null)");
168 fatal_callback_register(void (*func)(void))
170 struct sudo_fatal_callback *cb;
172 cb = malloc(sizeof(*cb));
176 cb->next = callbacks;
183 fatal_disable_setjmp(void)
185 setjmp_enabled = false;
189 fatal_enable_setjmp(void)
191 setjmp_enabled = true;