dovecot: Changed failure callbacks to take failure type paramete...

dovecot at dovecot.org dovecot at dovecot.org
Tue Oct 9 17:23:17 EEST 2007


details:   http://hg.dovecot.org/dovecot/rev/a93a7738c0ec
changeset: 6539:a93a7738c0ec
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Oct 09 17:10:10 2007 +0300
description:
Changed failure callbacks to take failure type parameter, so it's no longer
necessary to have separate panic and warning callbacks. Added i_log_type()
function to log a message with any type (even fatal/panic without dying
ourself).

diffstat:

2 files changed, 141 insertions(+), 163 deletions(-)
src/lib/failures.c |  270 +++++++++++++++++++++++-----------------------------
src/lib/failures.h |   34 +++---

diffs (truncated from 484 to 300 lines):

diff -r 1b7d91f7b151 -r a93a7738c0ec src/lib/failures.c
--- a/src/lib/failures.c	Sat Oct 06 03:18:19 2007 +0300
+++ b/src/lib/failures.c	Tue Oct 09 17:10:10 2007 +0300
@@ -13,28 +13,30 @@
 #include <syslog.h>
 #include <time.h>
 
+static const char *log_type_prefixes[] = {
+	"Info: ",
+	"Warning: ",
+	"Error: ",
+	"Fatal: ",
+	"Panic: "
+};
+static char log_type_internal_chars[] = {
+	'I', 'W', 'E', 'F', 'P'
+};
+
 static void failure_exit(int status) ATTR_NORETURN;
 
-static void default_panic_handler(const char *format, va_list args)
-	ATTR_NORETURN ATTR_FORMAT(1, 0);
-static void default_fatal_handler(int status, const char *format, va_list args)
-	ATTR_NORETURN ATTR_FORMAT(2, 0);
-
-static void default_error_handler(const char *format, va_list args)
-	ATTR_FORMAT(1, 0);
-static void default_warning_handler(const char *format, va_list args)
-	ATTR_FORMAT(1, 0);
-static void default_info_handler(const char *format, va_list args)
-	ATTR_FORMAT(1, 0);
+static void default_fatal_handler(enum log_type type, int status,
+				  const char *format, va_list args)
+	ATTR_NORETURN ATTR_FORMAT(3, 0);
+static void default_error_handler(enum log_type type, const char *format,
+				  va_list args) ATTR_FORMAT(2, 0);
 
 /* Initialize working defaults */
-static failure_callback_t *panic_handler ATTR_NORETURN =
-	default_panic_handler;
 static fatal_failure_callback_t *fatal_handler ATTR_NORETURN =
 	default_fatal_handler;
 static failure_callback_t *error_handler = default_error_handler;
-static failure_callback_t *warning_handler = default_warning_handler;
-static failure_callback_t *info_handler = default_info_handler;
+static failure_callback_t *info_handler = default_error_handler;
 static void (*failure_exit_callback)(int *) = NULL;
 
 static FILE *log_fd = NULL, *log_info_fd = NULL;
@@ -125,17 +127,6 @@ default_handler(const char *prefix, FILE
 	return 0;
 }
 
-static void ATTR_FORMAT(1, 0)
-default_panic_handler(const char *format, va_list args)
-{
-	const char *backtrace;
-
-	(void)default_handler("Panic: ", log_fd, format, args);
-	if (backtrace_get(&backtrace) == 0)
-		i_error("Raw backtrace: %s", backtrace);
-	abort();
-}
-
 static void log_fd_flush_stop(struct ioloop *ioloop)
 {
 	io_loop_stop(ioloop);
@@ -155,7 +146,7 @@ static int log_fd_flush(FILE *fd)
 		/* wait until we can write more. this can happen at least
 		   when writing to terminal, even if fd is blocking. */
 		ioloop = io_loop_create();
-		io = io_add(IO_WRITE, fileno(log_fd),
+		io = io_add(IO_WRITE, fileno(fd),
 			    log_fd_flush_stop, ioloop);
 		io_loop_run(ioloop);
 		io_remove(&io);
@@ -164,45 +155,52 @@ static int log_fd_flush(FILE *fd)
 	return 0;
 }
 
-static void ATTR_FORMAT(2, 0)
-default_fatal_handler(int status, const char *format, va_list args)
-{
-	if (default_handler("Fatal: ", log_fd, format, args) < 0 &&
-	    status == FATAL_DEFAULT)
+static void ATTR_FORMAT(3, 0)
+default_fatal_handler(enum log_type type, int status,
+		      const char *format, va_list args)
+{
+	const char *backtrace;
+
+	if (default_handler(log_type_prefixes[type], log_fd, format,
+			    args) < 0 && status == FATAL_DEFAULT)
 		status = FATAL_LOGERROR;
+
+	if (type == LOG_TYPE_PANIC) {
+		if (backtrace_get(&backtrace) == 0)
+			i_error("Raw backtrace: %s", backtrace);
+	}
 
 	if (log_fd_flush(log_fd) < 0 && status == FATAL_DEFAULT)
 		status = FATAL_LOGWRITE;
 
-	failure_exit(status);
-}
-
-static void ATTR_FORMAT(1, 0)
-default_error_handler(const char *format, va_list args)
-{
-	if (default_handler("Error: ", log_fd, format, args) < 0)
+	if (type == LOG_TYPE_PANIC)
+		abort();
+	else
+		failure_exit(status);
+}
+
+static void ATTR_FORMAT(2, 0)
+default_error_handler(enum log_type type, const char *format, va_list args)
+{
+	FILE *fd = type == LOG_TYPE_INFO ? log_info_fd : log_fd;
+
+	if (default_handler(log_type_prefixes[type], fd, format, args) < 0)
 		failure_exit(FATAL_LOGERROR);
 
-	if (log_fd_flush(log_fd) < 0)
+	if (log_fd_flush(fd) < 0)
 		failure_exit(FATAL_LOGWRITE);
 }
 
-static void ATTR_FORMAT(1, 0)
-default_warning_handler(const char *format, va_list args)
-{
-	(void)default_handler("Warning: ", log_fd, format, args);
-
-	if (log_fd_flush(log_fd) < 0)
-		failure_exit(FATAL_LOGWRITE);
-}
-
-static void ATTR_FORMAT(1, 0)
-default_info_handler(const char *format, va_list args)
-{
-	(void)default_handler("Info: ", log_info_fd, format, args);
-
-	if (log_fd_flush(log_info_fd) < 0)
-		failure_exit(FATAL_LOGWRITE);
+void i_log_type(enum log_type type, const char *format, ...)
+{
+	va_list args;
+
+	va_start(args, format);
+	if (type == LOG_TYPE_INFO)
+		info_handler(type, format, args);
+	else
+		error_handler(type, format, args);
+	va_end(args);
 }
 
 void i_panic(const char *format, ...)
@@ -210,7 +208,7 @@ void i_panic(const char *format, ...)
 	va_list args;
 
 	va_start(args, format);
-	panic_handler(format, args);
+	fatal_handler(LOG_TYPE_PANIC, 0, format, args);
 	va_end(args);
 }
 
@@ -219,7 +217,7 @@ void i_fatal(const char *format, ...)
 	va_list args;
 
 	va_start(args, format);
-	fatal_handler(FATAL_DEFAULT, format, args);
+	fatal_handler(LOG_TYPE_FATAL, FATAL_DEFAULT, format, args);
 	va_end(args);
 }
 
@@ -228,7 +226,7 @@ void i_fatal_status(int status, const ch
 	va_list args;
 
 	va_start(args, format);
-	fatal_handler(status, format, args);
+	fatal_handler(LOG_TYPE_FATAL, status, format, args);
 	va_end(args);
 }
 
@@ -238,7 +236,7 @@ void i_error(const char *format, ...)
 	va_list args;
 
 	va_start(args, format);
-	error_handler(format, args);
+	error_handler(LOG_TYPE_ERROR, format, args);
 	va_end(args);
 
 	errno = old_errno;
@@ -250,7 +248,7 @@ void i_warning(const char *format, ...)
 	va_list args;
 
 	va_start(args, format);
-	warning_handler(format, args);
+	error_handler(LOG_TYPE_WARNING, format, args);
 	va_end(args);
 
 	errno = old_errno;
@@ -262,17 +260,10 @@ void i_info(const char *format, ...)
 	va_list args;
 
 	va_start(args, format);
-	info_handler(format, args);
+	info_handler(LOG_TYPE_INFO, format, args);
 	va_end(args);
 
 	errno = old_errno;
-}
-
-void i_set_panic_handler(failure_callback_t *callback ATTR_NORETURN)
-{
-	if (callback == NULL)
-		callback = default_panic_handler;
-        panic_handler = callback;
 }
 
 void i_set_fatal_handler(fatal_failure_callback_t *callback ATTR_NORETURN)
@@ -286,21 +277,14 @@ void i_set_error_handler(failure_callbac
 {
 	if (callback == NULL)
 		callback = default_error_handler;
-        error_handler = callback;
-}
-
-void i_set_warning_handler(failure_callback_t *callback)
+	error_handler = callback;
+}
+
+void i_set_info_handler(failure_callback_t *callback)
 {
 	if (callback == NULL)
-		callback = default_warning_handler;
-        warning_handler = callback;
-}
-
-void i_set_info_handler(failure_callback_t *callback)
-{
-	if (callback == NULL)
-		callback = default_info_handler;
-        info_handler = callback;
+		callback = default_error_handler;
+	info_handler = callback;
 }
 
 static int ATTR_FORMAT(2, 0)
@@ -321,48 +305,53 @@ syslog_handler(int level, const char *fo
 	return 0;
 }
 
-void i_syslog_panic_handler(const char *fmt, va_list args)
+void i_syslog_fatal_handler(enum log_type type, int status,
+			    const char *fmt, va_list args)
 {
 	const char *backtrace;
-
-	(void)syslog_handler(LOG_CRIT, fmt, args);
-	if (backtrace_get(&backtrace) == 0)
-		i_error("Raw backtrace: %s", backtrace);
-	abort();
-}
-
-void i_syslog_fatal_handler(int status, const char *fmt, va_list args)
-{
 	if (syslog_handler(LOG_CRIT, fmt, args) < 0 && status == FATAL_DEFAULT)
 		status = FATAL_LOGERROR;
-	failure_exit(status);
-}
-
-void i_syslog_error_handler(const char *fmt, va_list args)
-{
-	if (syslog_handler(LOG_ERR, fmt, args) < 0)
+
+	if (type == LOG_TYPE_PANIC) {
+		if (backtrace_get(&backtrace) == 0)
+			i_error("Raw backtrace: %s", backtrace);
+		abort();
+	} else {
+		failure_exit(status);
+	}
+}
+
+void i_syslog_error_handler(enum log_type type, const char *fmt, va_list args)
+{
+	int level = LOG_ERR;
+
+	switch (type) {
+	case LOG_TYPE_INFO:
+		level = LOG_INFO;
+		break;
+	case LOG_TYPE_WARNING:
+		level = LOG_WARNING;
+		break;
+	case LOG_TYPE_ERROR:
+		level = LOG_ERR;
+		break;


More information about the dovecot-cvs mailing list