failures.c revision b461f35f91cb6ecdb673092cc30406360d528d8b
2e37d45867d081db150ab78dad303b9077aea24fTimo Sirainen/* Copyright (c) 2002-2003 Timo Sirainen */
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainenstatic void default_panic_handler(const char *format, va_list args)
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainenstatic void default_fatal_handler(int status, const char *format, va_list args)
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainenstatic void default_error_handler(const char *format, va_list args);
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainenstatic void default_warning_handler(const char *format, va_list args);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenstatic void default_info_handler(const char *format, va_list args);
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen/* Initialize working defaults */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenstatic failure_callback_t *panic_handler __attr_noreturn__ =
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenstatic fatal_failure_callback_t *fatal_handler __attr_noreturn__ =
a0c453a8edaec90fb0d945c874de0b1845bc7d7eTimo Sirainenstatic failure_callback_t *error_handler = default_error_handler;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenstatic failure_callback_t *warning_handler = default_warning_handler;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenstatic failure_callback_t *info_handler = default_info_handler;
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainenstatic FILE *log_fd = NULL, *log_info_fd = NULL;
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainenstatic char *log_prefix = NULL, *log_stamp_format = NULL;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen/* kludgy .. we want to trust log_stamp_format with -Wformat-nonliteral */
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainenstatic const char *get_log_stamp_format(const char *unused)
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainenstatic const char *get_log_stamp_format(const char *unused __attr_unused__)
f4616f1875297fb2f583d913c0f01b075bdecd5bTimo Sirainenstatic int default_handler(const char *prefix, FILE *f,
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen static int recursed = 0;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* we're being called from some signal handler, or
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen printf_string_upper_bound() killed us again */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* printf_string_upper_bound() probably killed us last time,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen just write the format now. */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* make sure there's no %n in there and fix %m */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen (void)printf_string_upper_bound(&format, args);
eef4ba0cc3e78f8c26804c1c9251a76580a41f0cTimo Sirainenstatic void default_panic_handler(const char *format, va_list args)
eef4ba0cc3e78f8c26804c1c9251a76580a41f0cTimo Sirainen (void)default_handler("Panic: ", log_fd, format, args);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenstatic void default_fatal_handler(int status, const char *format, va_list args)
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainen if (default_handler("Fatal: ", log_fd, format, args) < 0 &&
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainen if (fflush(log_fd) < 0 && status == FATAL_DEFAULT)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenstatic void default_error_handler(const char *format, va_list args)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen if (default_handler("Error: ", log_fd, format, args) < 0)
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainenstatic void default_warning_handler(const char *format, va_list args)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen (void)default_handler("Warning: ", log_fd, format, args);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenstatic void default_info_handler(const char *format, va_list args)
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen (void)default_handler("Info: ", log_info_fd, format, args);
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainenvoid i_fatal_status(int status, const char *format, ...)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenvoid i_set_panic_handler(failure_callback_t *callback __attr_noreturn__)
f4616f1875297fb2f583d913c0f01b075bdecd5bTimo Sirainenvoid i_set_fatal_handler(fatal_failure_callback_t *callback __attr_noreturn__)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenvoid i_set_error_handler(failure_callback_t *callback)
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainenvoid i_set_warning_handler(failure_callback_t *callback)
ecdce39e5ef4b62eefa9f5818f17d153fd5d710aTimo Sirainenvoid i_set_info_handler(failure_callback_t *callback)
ecdce39e5ef4b62eefa9f5818f17d153fd5d710aTimo Sirainenstatic int syslog_handler(int level, const char *format, va_list args)
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen static int recursed = 0;
a0c453a8edaec90fb0d945c874de0b1845bc7d7eTimo Sirainen /* make sure there's no %n in there */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen (void)printf_string_upper_bound(&format, args);
fde0b1793a2842da00eaa105d5e13fec465f0443Timo Sirainenvoid i_syslog_panic_handler(const char *fmt, va_list args)
a0c453a8edaec90fb0d945c874de0b1845bc7d7eTimo Sirainenvoid i_syslog_fatal_handler(int status, const char *fmt, va_list args)
a0c453a8edaec90fb0d945c874de0b1845bc7d7eTimo Sirainen if (syslog_handler(LOG_CRIT, fmt, args) < 0 && status == FATAL_DEFAULT)
a0c453a8edaec90fb0d945c874de0b1845bc7d7eTimo Sirainenvoid i_syslog_error_handler(const char *fmt, va_list args)
a0c453a8edaec90fb0d945c874de0b1845bc7d7eTimo Sirainenvoid i_syslog_warning_handler(const char *fmt, va_list args)
a0c453a8edaec90fb0d945c874de0b1845bc7d7eTimo Sirainenvoid i_syslog_info_handler(const char *fmt, va_list args)
fda168427e1950518acd6d600f1a10a29a5baef0Timo Sirainenvoid i_set_failure_syslog(const char *ident, int options, int facility)
a0c453a8edaec90fb0d945c874de0b1845bc7d7eTimo Sirainen i_set_warning_handler(i_syslog_warning_handler);
85a4ae7e8df7ea45a7665828e5edf48a5fc85730Timo Sirainenstatic void open_log_file(FILE **file, const char *path)
539977f9257bd8985be5a8093658da266ae9cd19Timo Sirainen if (path == NULL || strcmp(path, "/dev/stderr") == 0)
85a4ae7e8df7ea45a7665828e5edf48a5fc85730Timo Sirainenvoid i_set_failure_file(const char *path, const char *prefix)
85a4ae7e8df7ea45a7665828e5edf48a5fc85730Timo Sirainen if (log_info_fd != NULL && log_info_fd != log_fd &&
96308127e006bb3b1108093bcf4cc1fd9481cb7aTimo Sirainenstatic int internal_handler(char log_type, const char *format, va_list args)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen ret = write_full(2, str_data(str), str_len(str));
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenstatic void i_internal_panic_handler(const char *fmt, va_list args)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenstatic void i_internal_panic_handler(const char *fmt, va_list args)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenstatic void i_internal_fatal_handler(int status, const char *fmt, va_list args)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenstatic void i_internal_fatal_handler(int status, const char *fmt, va_list args)
85a4ae7e8df7ea45a7665828e5edf48a5fc85730Timo Sirainen if (internal_handler('F', fmt, args) < 0 && status == FATAL_DEFAULT)
083c67ac280fb4930a280ce1f76fb27a1637e818Timo Sirainenstatic void i_internal_error_handler(const char *fmt, va_list args)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenstatic void i_internal_warning_handler(const char *fmt, va_list args)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenstatic void i_internal_info_handler(const char *fmt, va_list args)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen i_set_panic_handler(i_internal_panic_handler);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen i_set_fatal_handler(i_internal_fatal_handler);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen i_set_error_handler(i_internal_error_handler);
64b61cd24d630223478ccbe1934b9f60f0881f59Timo Sirainen i_set_warning_handler(i_internal_warning_handler);
64b61cd24d630223478ccbe1934b9f60f0881f59Timo Sirainenvoid i_set_failure_timestamp_format(const char *fmt)