changeset 22023:b3897f959cb4

lib: Add lib_signals_syscall_error()
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Tue, 02 May 2017 15:41:04 +0300
parents e552f75d51b2
children cc3d5de90348
files src/lib/lib-signals.c src/lib/lib-signals.h
diffstat 2 files changed, 26 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib/lib-signals.c	Tue May 09 13:15:42 2017 +0300
+++ b/src/lib/lib-signals.c	Tue May 02 15:41:04 2017 +0300
@@ -4,8 +4,10 @@
 #include "ioloop.h"
 #include "fd-close-on-exec.h"
 #include "fd-set-nonblock.h"
+#include "write-full.h"
 #include "lib-signals.h"
 
+#include <stdio.h>
 #include <signal.h>
 #include <unistd.h>
 
@@ -312,6 +314,26 @@
 	}
 }
 
+void lib_signals_syscall_error(const char *prefix)
+{
+	/* @UNSAFE: We're in a signal handler. It's very limited what is
+	   allowed in here. Especially strerror() isn't at least officially
+	   allowed. */
+	char errno_buf[MAX_INT_STRLEN], *errno_str;
+	errno_str = dec2str_buf(errno_buf, errno);
+
+	size_t prefix_len = strlen(prefix);
+	size_t errno_str_len = strlen(errno_str);
+	char buf[prefix_len + errno_str_len + 1];
+
+	memcpy(buf, prefix, prefix_len);
+	memcpy(buf + prefix_len, errno_str, errno_str_len);
+	buf[prefix_len + errno_str_len] = '\n';
+	if (write_full(STDERR_FILENO, buf, prefix_len + errno_str_len + 1) < 0) {
+		/* can't really do anything */
+	}
+}
+
 void lib_signals_init(void)
 {
 	int i;
--- a/src/lib/lib-signals.h	Tue May 09 13:15:42 2017 +0300
+++ b/src/lib/lib-signals.h	Tue May 02 15:41:04 2017 +0300
@@ -42,6 +42,10 @@
    the delayed signals to work when using multiple I/O loops. */
 void lib_signals_reset_ioloop(void);
 
+/* Log a syscall error inside a (non-delayed) signal handler where i_error() is
+   unsafe. errno number will be appended to the prefix. */
+void lib_signals_syscall_error(const char *prefix);
+
 void lib_signals_init(void);
 void lib_signals_deinit(void);