From: Stephan Bosch Date: Sat, 11 Apr 2020 17:19:16 +0000 (+0200) Subject: lib: lib-signals - Add lib_signals_clear_handlers(). X-Git-Tag: 2.3.13~726 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2de186aff4d8bcef8970284d08c43afc5e714cd1;p=thirdparty%2Fdovecot%2Fcore.git lib: lib-signals - Add lib_signals_clear_handlers(). --- diff --git a/src/lib/lib-signals.c b/src/lib/lib-signals.c index 6e5521b8ba..359e62fe53 100644 --- a/src/lib/lib-signals.c +++ b/src/lib/lib-signals.c @@ -447,6 +447,26 @@ static void lib_signals_restore_system_default(int signo) i_fatal("sigaction(%d): %m", signo); } +void lib_signals_clear_handlers(int signo) +{ + struct signal_handler *h; + + if (signal_handlers[signo] == NULL) + return; + + lib_signals_restore_system_default(signo); + + h = signal_handlers[signo]; + signal_handlers[signo] = NULL; + + while (h != NULL) { + struct signal_handler *h_next = h->next; + + i_free(h); + h = h_next; + } +} + void lib_signals_unset_handler(int signo, signal_handler_t *handler, void *context) { @@ -530,23 +550,11 @@ void lib_signals_init(void) void lib_signals_deinit(void) { - struct signal_handler *handlers, *h; int i; for (i = 0; i < MAX_SIGNAL_VALUE; i++) { - if (signal_handlers[i] != NULL) { - lib_signals_restore_system_default(i); - - /* atomically remove from signal_handlers[] list */ - handlers = signal_handlers[i]; - signal_handlers[i] = NULL; - - while (handlers != NULL) { - h = handlers; - handlers = h->next; - i_free(h); - } - } + if (signal_handlers[i] != NULL) + lib_signals_clear_handlers(i); } lib_signals_ioloop_detach(); diff --git a/src/lib/lib-signals.h b/src/lib/lib-signals.h index 144e2b0aba..a03bd4015c 100644 --- a/src/lib/lib-signals.h +++ b/src/lib/lib-signals.h @@ -40,6 +40,10 @@ void lib_signals_set_handler(int signo, enum libsig_flags flags, ATTR_NULL(4); /* Ignore given signal. */ void lib_signals_ignore(int signo, bool restart_syscalls); +/* Clear all signal handlers for a specific signal and restore default system + handler. */ +void lib_signals_clear_handlers(int signo); +/* Unset specific signal handler for specific signal. */ void lib_signals_unset_handler(int signo, signal_handler_t *handler, void *context) ATTR_NULL(3);