]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-test: test_subprocess_notify_signal_*() - Add signo parameter
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 2 Sep 2021 12:39:33 +0000 (15:39 +0300)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Thu, 2 Sep 2021 13:37:11 +0000 (13:37 +0000)
This allows using multiple notification signals.

src/lib-http/test-http-client-errors.c
src/lib-test/test-subprocess.c
src/lib-test/test-subprocess.h

index 9cb2401d325544d04dafc171204caa0b271551c1..7e6921809d42bc6af2a60d722c76d59a80964a7d 100644 (file)
@@ -18,6 +18,7 @@
 #include "http-client.h"
 
 #include <unistd.h>
+#include <sys/signal.h>
 
 #define CLIENT_PROGRESS_TIMEOUT     10
 #define SERVER_KILL_TIMEOUT_SECS    20
@@ -377,7 +378,7 @@ test_server_connection_refused(unsigned int index ATTR_UNUSED)
 {
        i_close_fd(&fd_listen);
 
-       test_subprocess_notify_signal_send_parent();
+       test_subprocess_notify_signal_send_parent(SIGUSR1);
 }
 
 /* client */
@@ -418,7 +419,7 @@ test_client_connection_refused(const struct http_client_settings *client_set)
        struct _connection_refused *ctx;
 
        /* wait for the server side to close the socket */
-       test_subprocess_notify_signal_wait(10000);
+       test_subprocess_notify_signal_wait(SIGUSR1, 10000);
 
        ctx = i_new(struct _connection_refused, 1);
        ctx->count = 2;
@@ -3838,7 +3839,7 @@ test_run_client_server(const struct http_client_settings *client_set,
 {
        unsigned int i;
 
-       test_subprocess_notify_signal_reset();
+       test_subprocess_notify_signal_reset(SIGHUP);
        test_server_init = NULL;
        test_server_deinit = NULL;
        test_server_input = NULL;
index bef12b1c453d8a8e258b6f63e1aa72fe52594660..584e7b3b70af233c59204e0bd43d81b7bbd6b7e2 100644 (file)
@@ -19,7 +19,7 @@ struct test_subprocess {
 
 volatile sig_atomic_t test_subprocess_is_child = 0;
 static bool test_subprocess_lib_init = FALSE;
-static volatile bool test_subprocess_notification_signal_received = FALSE;
+static volatile bool test_subprocess_notification_signal_received[SIGUSR1 + 1];
 static struct event *test_subprocess_event = NULL;
 static ARRAY(struct test_subprocess *) test_subprocesses = ARRAY_INIT;
 static void (*test_subprocess_cleanup_callback)(void) = NULL;
@@ -306,28 +306,30 @@ void test_subprocess_set_cleanup_callback(void (*callback)(void))
        test_subprocess_cleanup_callback = callback;
 }
 
-void test_subprocess_notify_signal_send(pid_t pid)
+void test_subprocess_notify_signal_send(int signo, pid_t pid)
 {
-       if (kill(pid, SIGHUP) < 0)
+       if (kill(pid, signo) < 0)
                i_fatal("kill(%ld, SIGHUP) failed: %m", (long)pid);
 }
 
-void test_subprocess_notify_signal_send_parent(void)
+void test_subprocess_notify_signal_send_parent(int signo)
 {
-       test_subprocess_notify_signal_send(getppid());
+       test_subprocess_notify_signal_send(signo, getppid());
 }
 
-void test_subprocess_notify_signal_reset(void)
+void test_subprocess_notify_signal_reset(int signo)
 {
-       test_subprocess_notification_signal_received = FALSE;
+       i_assert(signo >= 0 &&
+                (unsigned int)signo < N_ELEMENTS(test_subprocess_notification_signal_received));
+       test_subprocess_notification_signal_received[signo] = FALSE;
 }
 
-void test_subprocess_notify_signal_wait(unsigned int timeout_msecs)
+void test_subprocess_notify_signal_wait(int signo, unsigned int timeout_msecs)
 {
        unsigned int i, count = timeout_msecs / 10;
 
        for (i = 0; i < count; i++) {
-               if (test_subprocess_notification_signal_received)
+               if (test_subprocess_notification_signal_received[signo])
                        return;
                i_sleep_msecs(10);
        }
@@ -335,10 +337,14 @@ void test_subprocess_notify_signal_wait(unsigned int timeout_msecs)
 }
 
 static void
-test_subprocess_notification_signal(const siginfo_t *si ATTR_UNUSED,
+test_subprocess_notification_signal(const siginfo_t *si,
                                    void *context ATTR_UNUSED)
 {
-       test_subprocess_notification_signal_received = TRUE;
+       int signo = si->si_signo;
+
+       i_assert(signo >= 0 &&
+                (unsigned int)signo < N_ELEMENTS(test_subprocess_notification_signal_received));
+       test_subprocess_notification_signal_received[signo] = TRUE;
 }
 
 void test_subprocesses_init(bool debug)
@@ -359,6 +365,8 @@ void test_subprocesses_init(bool debug)
        lib_signals_set_handler(SIGABRT, 0, test_subprocess_terminate, NULL);
        lib_signals_set_handler(SIGHUP, LIBSIG_FLAG_RESTART,
                                test_subprocess_notification_signal, NULL);
+       lib_signals_set_handler(SIGUSR1, LIBSIG_FLAG_RESTART,
+                               test_subprocess_notification_signal, NULL);
 
        i_array_init(&test_subprocesses, 8);
 
index 35f630052635f2e7a1d99e3ff6fdd82b48945fab..1a8d174db28971d92a5864e6aa8648715b8003ab 100644 (file)
@@ -24,16 +24,16 @@ void test_subprocess_kill_all(unsigned int timeout_secs);
 void test_subprocess_set_cleanup_callback(void (*callback)(void));
 
 /* Send a notification signal (SIGHUP) to the given PID */
-void test_subprocess_notify_signal_send(pid_t pid);
+void test_subprocess_notify_signal_send(int signo, pid_t pid);
 /* Send a notificatino signal to the parent process. */
-void test_subprocess_notify_signal_send_parent(void);
+void test_subprocess_notify_signal_send_parent(int signo);
 /* Reset any previously sent notification signals. */
-void test_subprocess_notify_signal_reset(void);
+void test_subprocess_notify_signal_reset(int signo);
 /* Wait until a notification signal is sent, or return immediately if it was
    already sent. test_subprocess_notify_signal_reset() should be called before
    this to make sure it's not returning due to a previously sent signal.
    If the timeout is reached, i_fatal() is called. */
-void test_subprocess_notify_signal_wait(unsigned int timeout_msecs);
+void test_subprocess_notify_signal_wait(int signo, unsigned int timeout_msecs);
 
 void test_subprocesses_init(bool debug);
 void test_subprocesses_deinit(void);