failures.c revision 6a058aa8c986a8fbec5ddd72c141db9df0b64b2d
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2002-2003 Timo Sirainen */
fa2a11210f20fb8998ed656f75e163191c8047e6Timo Sirainenstatic void default_panic_handler(const char *format, va_list args)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic void default_fatal_handler(int status, const char *format, va_list args)
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainenstatic void default_error_handler(const char *format, va_list args)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic void default_warning_handler(const char *format, va_list args)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic void default_info_handler(const char *format, va_list args)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen/* Initialize working defaults */
542e28b384a6b26695f3e8de38fd5727d06f3333Timo Sirainenstatic failure_callback_t *panic_handler __attr_noreturn__ =
542e28b384a6b26695f3e8de38fd5727d06f3333Timo Sirainenstatic fatal_failure_callback_t *fatal_handler __attr_noreturn__ =
542e28b384a6b26695f3e8de38fd5727d06f3333Timo Sirainenstatic failure_callback_t *error_handler = default_error_handler;
542e28b384a6b26695f3e8de38fd5727d06f3333Timo Sirainenstatic failure_callback_t *warning_handler = default_warning_handler;
542e28b384a6b26695f3e8de38fd5727d06f3333Timo Sirainenstatic failure_callback_t *info_handler = default_info_handler;
c3a636e4c9ae776e0eed06b6d7ad1ccfb6003afdTimo Sirainenstatic FILE *log_fd = NULL, *log_info_fd = NULL;
c3a636e4c9ae776e0eed06b6d7ad1ccfb6003afdTimo Sirainenstatic char *log_prefix = NULL, *log_stamp_format = NULL;
3b22894b8805b186c73d8b754001e8d7e944be85Timo Sirainen/* kludgy .. we want to trust log_stamp_format with -Wformat-nonliteral */
3b22894b8805b186c73d8b754001e8d7e944be85Timo Sirainenstatic const char *get_log_stamp_format(const char *unused)
13b063ba3ea51256fd97d7fa883f14cb08842b0dTimo Sirainenstatic const char *get_log_stamp_format(const char *unused __attr_unused__)
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainenstatic int default_handler(const char *prefix, FILE *f,
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen static int recursed = 0;
d1fff80640050631b06bfab904a34b2ad24601e8Timo Sirainen /* we're being called from some signal handler, or
b9b841558c5f91db7f5fc71c0ac62aad1bbf6418Timo Sirainen printf_string_upper_bound() killed us again */
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen /* printf_string_upper_bound() probably killed us last time,
0f5dc4da3982053036be65190e44bf28a67b1ca2Timo Sirainen just write the format now. */
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen /* write may have failed, restore errno so %m works. although
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen it probably can't write the error then anyway. */
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen /* make sure there's no %n in there and fix %m */
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen (void)printf_string_upper_bound(&format, args);
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainenstatic void default_panic_handler(const char *format, va_list args)
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen (void)default_handler("Panic: ", log_fd, format, args);
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainenstatic void default_fatal_handler(int status, const char *format, va_list args)
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen if (default_handler("Fatal: ", log_fd, format, args) < 0 &&
367e28a16854ee9f7247b2518f36f5e9163fcc10Timo Sirainen if (fflush(log_fd) < 0 && status == FATAL_DEFAULT)
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainenstatic void default_error_handler(const char *format, va_list args)
1f5597beba229acd914e30a6da3c0e62d83b6e8fTimo Sirainen if (default_handler("Error: ", log_fd, format, args) < 0)
47569a4b2b4d3cc55e786177798c922c3c44233dTimo Sirainenstatic void default_warning_handler(const char *format, va_list args)
7af5f78e9fee296e42430d94ef252ff0333d8024Timo Sirainen (void)default_handler("Warning: ", log_fd, format, args);
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainenstatic void default_info_handler(const char *format, va_list args)
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen (void)default_handler("Info: ", log_info_fd, format, args);
417642ddac19708bea6dd2c2bbeaf6a9578d521bTimo Sirainenvoid i_fatal_status(int status, const char *format, ...)
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainenvoid i_set_panic_handler(failure_callback_t *callback __attr_noreturn__)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenvoid i_set_fatal_handler(fatal_failure_callback_t *callback __attr_noreturn__)
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainenvoid i_set_error_handler(failure_callback_t *callback)
002179a890bf4f1942cad6463787719eaa9fd6c0Timo Sirainenvoid i_set_warning_handler(failure_callback_t *callback)
002179a890bf4f1942cad6463787719eaa9fd6c0Timo Sirainenvoid i_set_info_handler(failure_callback_t *callback)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic int syslog_handler(int level, const char *format, va_list args)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen static int recursed = 0;
4c261fb48e6e36570a0841aa51ca483024d6a0a6Timo Sirainen /* make sure there's no %n in there */
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen (void)printf_string_upper_bound(&format, args);
c93aca832ee532010ead91b85fa9f614132e1be2Stephan Boschvoid i_syslog_panic_handler(const char *fmt, va_list args)
ab90f702ceedb7ba445a9a592be0b213b27cbafaStephan Boschvoid i_syslog_fatal_handler(int status, const char *fmt, va_list args)
2f90189c6ee66a17f7bf838a8eb8a69868630fb8Timo Sirainen if (syslog_handler(LOG_CRIT, fmt, args) < 0 && status == FATAL_DEFAULT)
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainenvoid i_syslog_error_handler(const char *fmt, va_list args)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenvoid i_syslog_warning_handler(const char *fmt, va_list args)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenvoid i_syslog_info_handler(const char *fmt, va_list args)
fc464e5b2b2ab4d415a5d5b90ce4475d34620a75Timo Sirainenvoid i_set_failure_syslog(const char *ident, int options, int facility)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen i_set_warning_handler(i_syslog_warning_handler);
b9dc21a94401638c00e40b695998875e1563ce77Timo Sirainenstatic void open_log_file(FILE **file, const char *path)
11120acd01d43973cd504952d691a2ae1c546ee2Timo Sirainen if (path == NULL || strcmp(path, "/dev/stderr") == 0)
3b22894b8805b186c73d8b754001e8d7e944be85Timo Sirainenvoid i_set_failure_file(const char *path, const char *prefix)
3b22894b8805b186c73d8b754001e8d7e944be85Timo Sirainen if (log_info_fd != NULL && log_info_fd != log_fd &&
70afae43cc78ea6ecca83f6c587072c442a15ec1Timo Sirainenstatic int internal_handler(char log_type, const char *format, va_list args)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen ret = write_full(2, str_data(str), str_len(str));
9261dbf0675204898c6557591c7aa376e23a52b2Timo Sirainenstatic void i_internal_panic_handler(const char *fmt, va_list args)
70afae43cc78ea6ecca83f6c587072c442a15ec1Timo Sirainenstatic void i_internal_panic_handler(const char *fmt, va_list args)
70afae43cc78ea6ecca83f6c587072c442a15ec1Timo Sirainenstatic void i_internal_fatal_handler(int status, const char *fmt, va_list args)
70afae43cc78ea6ecca83f6c587072c442a15ec1Timo Sirainenstatic void i_internal_fatal_handler(int status, const char *fmt, va_list args)
70afae43cc78ea6ecca83f6c587072c442a15ec1Timo Sirainen if (internal_handler('F', fmt, args) < 0 && status == FATAL_DEFAULT)
2f90189c6ee66a17f7bf838a8eb8a69868630fb8Timo Sirainenstatic void i_internal_error_handler(const char *fmt, va_list args)
acfda38b75d0f0e899ef692fef01593bd56ed85eTimo Sirainenstatic void i_internal_warning_handler(const char *fmt, va_list args)
acfda38b75d0f0e899ef692fef01593bd56ed85eTimo Sirainenstatic void i_internal_info_handler(const char *fmt, va_list args)
acfda38b75d0f0e899ef692fef01593bd56ed85eTimo Sirainen i_set_panic_handler(i_internal_panic_handler);
acfda38b75d0f0e899ef692fef01593bd56ed85eTimo Sirainen i_set_fatal_handler(i_internal_fatal_handler);
2f90189c6ee66a17f7bf838a8eb8a69868630fb8Timo Sirainen i_set_error_handler(i_internal_error_handler);
acfda38b75d0f0e899ef692fef01593bd56ed85eTimo Sirainen i_set_warning_handler(i_internal_warning_handler);
acfda38b75d0f0e899ef692fef01593bd56ed85eTimo Sirainenvoid i_set_failure_timestamp_format(const char *fmt)