failures.c revision 41062ccab36f31f345e9b9f3198547c4c2096314
89a126810703c666309310d0f3189e9834d70b5bTimo Sirainen/* Copyright (c) 2002-2003 Timo Sirainen */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic void default_panic_handler(const char *format, va_list args)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic void default_fatal_handler(int status, const char *format, va_list args)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic void default_error_handler(const char *format, va_list args);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic void default_warning_handler(const char *format, va_list args);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic void default_info_handler(const char *format, va_list args);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen/* Initialize working defaults */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic failure_callback_t *panic_handler __attr_noreturn__ =
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic fatal_failure_callback_t *fatal_handler __attr_noreturn__ =
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic failure_callback_t *error_handler = default_error_handler;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic failure_callback_t *warning_handler = default_warning_handler;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic failure_callback_t *info_handler = default_info_handler;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic FILE *log_fd = NULL, *log_info_fd = NULL;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic char *log_prefix = NULL, *log_stamp_format = NULL;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen/* kludgy .. we want to trust log_stamp_format with -Wformat-nonliteral */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic const char *get_log_stamp_format(const char *unused)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic const char *get_log_stamp_format(const char *unused __attr_unused__)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic int default_handler(const char *prefix, FILE *f,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen static int recursed = 0;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* we're being called from some signal handler, or
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen printf_string_upper_bound() killed us again */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* printf_string_upper_bound() probably killed us last time,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen just write the format now. */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* make sure there's no %n in there and fix %m */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen (void)printf_string_upper_bound(&format, args);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic void default_panic_handler(const char *format, va_list args)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen (void)default_handler("Panic: ", log_fd, format, args);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic void default_fatal_handler(int status, const char *format, va_list args)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if (default_handler("Fatal: ", log_fd, format, args) < 0 &&
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if (fflush(log_fd) < 0 && status == FATAL_DEFAULT)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic void default_error_handler(const char *format, va_list args)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if (default_handler("Error: ", log_fd, format, args) < 0)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic void default_warning_handler(const char *format, va_list args)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen (void)default_handler("Warning: ", log_fd, format, args);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic void default_info_handler(const char *format, va_list args)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen (void)default_handler("Info: ", log_info_fd, format, args);
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainenvoid i_fatal_status(int status, const char *format, ...)
9c7e765845357342923e16351181091028e5930fTimo Sirainenvoid i_set_panic_handler(failure_callback_t *callback __attr_noreturn__)
6bf1543bb7af03324c04e8f9ac8e430f395989aeTimo Sirainenvoid i_set_fatal_handler(fatal_failure_callback_t *callback __attr_noreturn__)
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainenvoid i_set_error_handler(failure_callback_t *callback)
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainenvoid i_set_warning_handler(failure_callback_t *callback)
e30b748edcef3cf3352478bf21fa8f785bdc773aTimo Sirainenvoid i_set_info_handler(failure_callback_t *callback)
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainenstatic int syslog_handler(int level, const char *format, va_list args)
e30b748edcef3cf3352478bf21fa8f785bdc773aTimo Sirainen static int recursed = 0;
e05181d973025627ba08b631c12c07c3bbc99528Timo Sirainen /* make sure there's no %n in there */
0b3662995e9fa0d0d857ec5350ce2b1ee6d3b94fTimo Sirainen (void)printf_string_upper_bound(&format, args);
6925fd9cd70c30884406d50f1d85efb6561e776cTimo Sirainenvoid i_syslog_panic_handler(const char *fmt, va_list args)
6925fd9cd70c30884406d50f1d85efb6561e776cTimo Sirainenvoid i_syslog_fatal_handler(int status, const char *fmt, va_list args)
6925fd9cd70c30884406d50f1d85efb6561e776cTimo Sirainen if (syslog_handler(LOG_CRIT, fmt, args) < 0 && status == FATAL_DEFAULT)
4b43f50117630aa12b3cfd0cbd05ae22ba27fec1Timo Sirainenvoid i_syslog_error_handler(const char *fmt, va_list args)
992a9e2d6c6ee45d87089ac54267e0198a7802c3Timo Sirainenvoid i_syslog_warning_handler(const char *fmt, va_list args)
992a9e2d6c6ee45d87089ac54267e0198a7802c3Timo Sirainenvoid i_syslog_info_handler(const char *fmt, va_list args)
992a9e2d6c6ee45d87089ac54267e0198a7802c3Timo Sirainenvoid i_set_failure_syslog(const char *ident, int options, int facility)
992a9e2d6c6ee45d87089ac54267e0198a7802c3Timo Sirainen i_set_warning_handler(i_syslog_warning_handler);
992a9e2d6c6ee45d87089ac54267e0198a7802c3Timo Sirainenstatic void open_log_file(FILE **file, const char *path)
6925fd9cd70c30884406d50f1d85efb6561e776cTimo Sirainen if (path == NULL || strcmp(path, "/dev/stderr") == 0)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid i_set_failure_file(const char *path, const char *prefix)
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen if (log_info_fd != NULL && log_info_fd != stderr)
8e5fedd9ada47735be8ac0f8af2a66e8528bd776Timo Sirainenstatic int internal_handler(char log_type, const char *format, va_list args)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ret = write_full(2, str_data(str), str_len(str));
d61a5e0e4ff58d1aa613f0d51161e5bb0f092514Timo Sirainenstatic void i_internal_panic_handler(const char *fmt, va_list args)
d61a5e0e4ff58d1aa613f0d51161e5bb0f092514Timo Sirainenstatic void i_internal_panic_handler(const char *fmt, va_list args)
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainenstatic void i_internal_fatal_handler(int status, const char *fmt, va_list args)
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainenstatic void i_internal_fatal_handler(int status, const char *fmt, va_list args)
8e5fedd9ada47735be8ac0f8af2a66e8528bd776Timo Sirainen if (internal_handler('F', fmt, args) < 0 && status == FATAL_DEFAULT)
d61a5e0e4ff58d1aa613f0d51161e5bb0f092514Timo Sirainenstatic void i_internal_error_handler(const char *fmt, va_list args)
d61a5e0e4ff58d1aa613f0d51161e5bb0f092514Timo Sirainenstatic void i_internal_warning_handler(const char *fmt, va_list args)
d61a5e0e4ff58d1aa613f0d51161e5bb0f092514Timo Sirainenstatic void i_internal_info_handler(const char *fmt, va_list args)
d61a5e0e4ff58d1aa613f0d51161e5bb0f092514Timo Sirainen i_set_panic_handler(i_internal_panic_handler);
d61a5e0e4ff58d1aa613f0d51161e5bb0f092514Timo Sirainen i_set_fatal_handler(i_internal_fatal_handler);
d61a5e0e4ff58d1aa613f0d51161e5bb0f092514Timo Sirainen i_set_error_handler(i_internal_error_handler);
d61a5e0e4ff58d1aa613f0d51161e5bb0f092514Timo Sirainen i_set_warning_handler(i_internal_warning_handler);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid i_set_failure_timestamp_format(const char *fmt)