From 0d7d09c0169c74e09a061373707047980b43570d Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Tue, 2 May 2017 15:41:04 +0300 Subject: [PATCH] lib: Add lib_signals_syscall_error() --- src/lib/lib-signals.c | 22 ++++++++++++++++++++++ src/lib/lib-signals.h | 4 ++++ 2 files changed, 26 insertions(+) diff --git a/src/lib/lib-signals.c b/src/lib/lib-signals.c index 4903752662..7796a4f1a5 100644 --- a/src/lib/lib-signals.c +++ b/src/lib/lib-signals.c @@ -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 #include #include @@ -312,6 +314,26 @@ void lib_signals_reset_ioloop(void) } } +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; diff --git a/src/lib/lib-signals.h b/src/lib/lib-signals.h index e1eb18ef55..85b240fdfc 100644 --- a/src/lib/lib-signals.h +++ b/src/lib/lib-signals.h @@ -42,6 +42,10 @@ void lib_signals_unset_handler(int signo, 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);