From ad6fe8d66382c24238948bee6c39cd1a245f02fa Mon Sep 17 00:00:00 2001 From: Igor Baranov Date: Fri, 11 Sep 2026 12:53:00 -0700 Subject: [PATCH] Exit jackdbus cleanly on termination signals --- dbus/jackdbus.c | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/dbus/jackdbus.c b/dbus/jackdbus.c index 5f2000a37..bd1b91677 100644 --- a/dbus/jackdbus.c +++ b/dbus/jackdbus.c @@ -52,6 +52,28 @@ char *g_jackdbus_log_dir; size_t g_jackdbus_log_dir_len; /* without terminating '\0' char */ int g_exit_command; DBusConnection *g_connection; +static volatile sig_atomic_t g_exit_signal; + +static void +jack_dbus_exit_signal_handler(int signal) +{ + g_exit_signal = signal; +} + +static bool +jack_dbus_setup_signals(void) +{ + struct sigaction action; + + memset(&action, 0, sizeof(action)); + sigemptyset(&action.sa_mask); + action.sa_handler = jack_dbus_exit_signal_handler; + + return sigaction(SIGHUP, &action, NULL) == 0 && + sigaction(SIGINT, &action, NULL) == 0 && + sigaction(SIGQUIT, &action, NULL) == 0 && + sigaction(SIGTERM, &action, NULL) == 0; +} void jack_dbus_send_signal( @@ -889,7 +911,12 @@ main (int argc, char **argv) } #if !defined(DISABLE_SIGNAL_MAGIC) - jackctl_setup_signals(0); + g_exit_signal = 0; + if (!jack_dbus_setup_signals()) + { + ret = 1; + goto fail_uninit_log; + } #endif jack_set_error_function(jack_dbus_error_callback); @@ -947,11 +974,16 @@ main (int argc, char **argv) jack_info("Listening for D-Bus messages"); g_exit_command = FALSE; - while (!g_exit_command && dbus_connection_read_write_dispatch (g_connection, 200)) + while (!g_exit_command && !g_exit_signal && dbus_connection_read_write_dispatch (g_connection, 200)) { jack_controller_run(controller_ptr); } + if (g_exit_signal) + { + jack_info("Controller received signal %d.", g_exit_signal); + } + jack_controller_destroy(controller_ptr); jack_info("Controller deactivated.");