Mercurial > dovecot > core-2.2
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);