]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: lib-signals - Add lib_signals_clear_handlers().
authorStephan Bosch <stephan.bosch@open-xchange.com>
Sat, 11 Apr 2020 17:19:16 +0000 (19:19 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Fri, 22 May 2020 08:42:33 +0000 (08:42 +0000)
src/lib/lib-signals.c
src/lib/lib-signals.h

index 6e5521b8ba56fdb2fed80dc126a7b1468a2fbd86..359e62fe5326ec527ad24e8ab50ab3e97d73f7a0 100644 (file)
@@ -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();
index 144e2b0abadbb0b673637b02b39ea53c9250fdbf..a03bd4015cdcfe21743c26338d3d406e7256c4bb 100644 (file)
@@ -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);