failures.c revision 647d32fa263de5e03a7a38898777fb49b5774762
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter/* Copyright (c) 2002-2003 Timo Sirainen */
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterstatic void default_panic_handler(const char *format, va_list args)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterstatic void default_fatal_handler(int status, const char *format, va_list args)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterstatic void default_error_handler(const char *format, va_list args);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterstatic void default_warning_handler(const char *format, va_list args);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterstatic void default_info_handler(const char *format, va_list args);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter/* Initialize working defaults */
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterstatic failure_callback_t *panic_handler __attr_noreturn__ =
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterstatic fatal_failure_callback_t *fatal_handler __attr_noreturn__ =
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterstatic failure_callback_t *error_handler = default_error_handler;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterstatic failure_callback_t *warning_handler = default_warning_handler;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterstatic failure_callback_t *info_handler = default_info_handler;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterstatic char *log_prefix = NULL, *log_stamp_format = NULL;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter/* kludgy .. we want to trust log_stamp_format with -Wformat-nonliteral */
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekstatic const char *get_log_stamp_format(const char *unused)
1a94716209e40a9ccaedc7e70f9de961d1cced48Lukas Slebodnikstatic const char *get_log_stamp_format(const char *unused __attr_unused__)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterstatic int default_handler(const char *prefix, FILE *f,
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter static int recursed = 0;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter /* we're being called from some signal handler, or
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter printf_string_upper_bound() killed us again */
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter /* printf_string_upper_bound() probably killed us last time,
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter just write the format now. */
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter /* make sure there's no %n in there and fix %m */
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterstatic void default_panic_handler(const char *format, va_list args)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter (void)default_handler("Panic: ", log_fd, format, args);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterstatic void default_fatal_handler(int status, const char *format, va_list args)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (default_handler("Fatal: ", log_fd, format, args) < 0 &&
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (fflush(log_fd) < 0 && status == FATAL_DEFAULT)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterstatic void default_error_handler(const char *format, va_list args)
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter if (default_handler("Error: ", log_fd, format, args) < 0)
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walterstatic void default_warning_handler(const char *format, va_list args)
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter (void)default_handler("Warning: ", log_fd, format, args);
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walterstatic void default_info_handler(const char *format, va_list args)
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter (void)default_handler("Info: ", log_info_fd, format, args);
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Waltervoid i_fatal_status(int status, const char *format, ...)
1203e462650f035b0df2304075d60b9a99e36715Stef Waltervoid i_set_panic_handler(failure_callback_t *callback __attr_noreturn__)
1203e462650f035b0df2304075d60b9a99e36715Stef Waltervoid i_set_fatal_handler(fatal_failure_callback_t *callback __attr_noreturn__)
1203e462650f035b0df2304075d60b9a99e36715Stef Waltervoid i_set_error_handler(failure_callback_t *callback)
1203e462650f035b0df2304075d60b9a99e36715Stef Waltervoid i_set_warning_handler(failure_callback_t *callback)
1203e462650f035b0df2304075d60b9a99e36715Stef Waltervoid i_set_info_handler(failure_callback_t *callback)
1203e462650f035b0df2304075d60b9a99e36715Stef Walterstatic int syslog_handler(int level, const char *format, va_list args)
1203e462650f035b0df2304075d60b9a99e36715Stef Walter static int recursed = 0;
1203e462650f035b0df2304075d60b9a99e36715Stef Walter /* make sure there's no %n in there */
1203e462650f035b0df2304075d60b9a99e36715Stef Waltervoid i_syslog_panic_handler(const char *fmt, va_list args)
1203e462650f035b0df2304075d60b9a99e36715Stef Waltervoid i_syslog_fatal_handler(int status, const char *fmt, va_list args)
1203e462650f035b0df2304075d60b9a99e36715Stef Walter if (syslog_handler(LOG_CRIT, fmt, args) < 0 && status == FATAL_DEFAULT)
1203e462650f035b0df2304075d60b9a99e36715Stef Waltervoid i_syslog_error_handler(const char *fmt, va_list args)
1203e462650f035b0df2304075d60b9a99e36715Stef Waltervoid i_syslog_warning_handler(const char *fmt, va_list args)
1203e462650f035b0df2304075d60b9a99e36715Stef Waltervoid i_syslog_info_handler(const char *fmt, va_list args)
1203e462650f035b0df2304075d60b9a99e36715Stef Waltervoid i_set_failure_syslog(const char *ident, int options, int facility)
1203e462650f035b0df2304075d60b9a99e36715Stef Walter i_set_warning_handler(i_syslog_warning_handler);
1203e462650f035b0df2304075d60b9a99e36715Stef Walterstatic void open_log_file(FILE **file, const char *path)
1203e462650f035b0df2304075d60b9a99e36715Stef Walter if (path == NULL || strcmp(path, "/dev/stderr") == 0)
1203e462650f035b0df2304075d60b9a99e36715Stef Waltervoid i_set_failure_file(const char *path, const char *prefix)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek if (log_info_fd != NULL && log_info_fd != stderr)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekstatic int internal_handler(char log_type, const char *format, va_list args)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek ret = write_full(2, str_data(str), str_len(str));
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekstatic void i_internal_panic_handler(const char *fmt, va_list args)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekstatic void i_internal_panic_handler(const char *fmt, va_list args)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekstatic void i_internal_fatal_handler(int status, const char *fmt, va_list args)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekstatic void i_internal_fatal_handler(int status, const char *fmt, va_list args)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek if (internal_handler('F', fmt, args) < 0 && status == FATAL_DEFAULT)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekstatic void i_internal_error_handler(const char *fmt, va_list args)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekstatic void i_internal_warning_handler(const char *fmt, va_list args)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekstatic void i_internal_info_handler(const char *fmt, va_list args)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek i_set_warning_handler(i_internal_warning_handler);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekvoid i_set_failure_timestamp_format(const char *fmt)