return ret;
}
-void default_fatal_handler(enum log_type type, int status,
- const char *format, va_list args)
+static void ATTR_NORETURN
+default_fatal_finish(enum log_type type, int status)
{
const char *backtrace;
- if (default_handler(failure_log_type_prefixes[type], log_fd, format,
- args) < 0 && status == FATAL_DEFAULT)
- status = FATAL_LOGWRITE;
-
if (type == LOG_TYPE_PANIC || status == FATAL_OUTOFMEM) {
if (backtrace_get(&backtrace) == 0)
i_error("Raw backtrace: %s", backtrace);
failure_exit(status);
}
+void default_fatal_handler(enum log_type type, int status,
+ const char *format, va_list args)
+{
+ if (default_handler(failure_log_type_prefixes[type], log_fd, format,
+ args) < 0 && status == FATAL_DEFAULT)
+ status = FATAL_LOGWRITE;
+
+ default_fatal_finish(type, status);
+}
+
void default_error_handler(enum log_type type, const char *format, va_list args)
{
int fd = type == LOG_TYPE_INFO ? log_info_fd : log_fd;
void i_syslog_fatal_handler(enum log_type type, int status,
const char *fmt, va_list args)
{
- const char *backtrace;
if (syslog_handler(LOG_CRIT, type, fmt, args) < 0 &&
status == FATAL_DEFAULT)
status = FATAL_LOGERROR;
- if (type == LOG_TYPE_PANIC) {
- if (backtrace_get(&backtrace) == 0)
- i_error("Raw backtrace: %s", backtrace);
- abort();
- } else {
- failure_exit(status);
- }
+ default_fatal_finish(type, status);
}
void i_syslog_error_handler(enum log_type type, const char *fmt, va_list args)
i_internal_fatal_handler(enum log_type type, int status,
const char *fmt, va_list args)
{
- const char *backtrace;
-
if (internal_handler(log_type_internal_chars[type], fmt, args) < 0 &&
status == FATAL_DEFAULT)
status = FATAL_LOGERROR;
- if (type == LOG_TYPE_PANIC) {
- if (backtrace_get(&backtrace) == 0)
- i_error("Raw backtrace: %s", backtrace);
- abort();
- } else {
- failure_exit(status);
- }
+ default_fatal_finish(type, status);
}
static void ATTR_FORMAT(2, 0)