failures.c revision a9e73c0ed3ad73c6d2eb0c25fe4f84f595b61762
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen/* Copyright (c) 2002-2003 Timo Sirainen */
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenstatic void default_panic_handler(const char *format, va_list args)
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenstatic void default_fatal_handler(int status, const char *format, va_list args)
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenstatic void default_error_handler(const char *format, va_list args);
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainenstatic void default_warning_handler(const char *format, va_list args);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenstatic void default_info_handler(const char *format, va_list args);
252db51b6c0a605163326b3ea5d09e9936ca3b29Timo Sirainen/* Initialize working defaults */
a94936bafd127680184da114c6a177b37ff656e5Timo Sirainenstatic failure_callback_t *panic_handler __attr_noreturn__ =
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenstatic fatal_failure_callback_t *fatal_handler __attr_noreturn__ =
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenstatic failure_callback_t *error_handler = default_error_handler;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenstatic failure_callback_t *warning_handler = default_warning_handler;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenstatic failure_callback_t *info_handler = default_info_handler;
a94936bafd127680184da114c6a177b37ff656e5Timo Sirainenstatic FILE *log_fd = NULL, *log_info_fd = NULL;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenstatic char *log_prefix = NULL, *log_stamp_format = NULL;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen/* kludgy .. we want to trust log_stamp_format with -Wformat-nonliteral */
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenstatic const char *get_log_stamp_format(const char *unused)
601f5f14c6cde28f0e0c6ca7c5d735315d3d48dfTimo Sirainenstatic const char *get_log_stamp_format(const char *unused __attr_unused__)
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenstatic int default_handler(const char *prefix, FILE *f,
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen static int recursed = 0;
1117aa7adc2909c750031fd7551a58a486d100d8Timo Sirainen /* we're being called from some signal handler, or
e50c7afe297ab10e07a8acc816c76ce9d45ef409Timo Sirainen printf_string_upper_bound() killed us again */
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen /* printf_string_upper_bound() probably killed us last time,
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen just write the format now. */
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen /* write may have failed, restore errno so %m works. although
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen it probably can't write the error then anyway. */
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen /* make sure there's no %n in there and fix %m */
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen (void)printf_string_upper_bound(&format, args);
fe363b433b8038a69b55169da9dca27892ad7d18Timo Sirainenstatic void default_panic_handler(const char *format, va_list args)
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen (void)default_handler("Panic: ", log_fd, format, args);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenstatic void default_fatal_handler(int status, const char *format, va_list args)
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen if (default_handler("Fatal: ", log_fd, format, args) < 0 &&
a94936bafd127680184da114c6a177b37ff656e5Timo Sirainen if (fflush(log_fd) < 0 && status == FATAL_DEFAULT)
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainenstatic void default_error_handler(const char *format, va_list args)
252db51b6c0a605163326b3ea5d09e9936ca3b29Timo Sirainen if (default_handler("Error: ", log_fd, format, args) < 0)
static int recursed = 0;
if (recursed != 0)
recursed++;
recursed--;
abort();
int ret;
t_push();
t_pop();
return ret;
abort();
void i_set_failure_internal(void)
void failures_deinit(void)