From: Timo Sirainen Date: Thu, 2 Sep 2021 12:39:33 +0000 (+0300) Subject: lib-test: test_subprocess_notify_signal_*() - Add signo parameter X-Git-Tag: 2.3.17~161 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8b883745d6063e26805e24c57a1317997b93ece9;p=thirdparty%2Fdovecot%2Fcore.git lib-test: test_subprocess_notify_signal_*() - Add signo parameter This allows using multiple notification signals. --- diff --git a/src/lib-http/test-http-client-errors.c b/src/lib-http/test-http-client-errors.c index 9cb2401d32..7e6921809d 100644 --- a/src/lib-http/test-http-client-errors.c +++ b/src/lib-http/test-http-client-errors.c @@ -18,6 +18,7 @@ #include "http-client.h" #include +#include #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; diff --git a/src/lib-test/test-subprocess.c b/src/lib-test/test-subprocess.c index bef12b1c45..584e7b3b70 100644 --- a/src/lib-test/test-subprocess.c +++ b/src/lib-test/test-subprocess.c @@ -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); diff --git a/src/lib-test/test-subprocess.h b/src/lib-test/test-subprocess.h index 35f6300526..1a8d174db2 100644 --- a/src/lib-test/test-subprocess.h +++ b/src/lib-test/test-subprocess.h @@ -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);