From: Lennart Poettering Date: Fri, 13 Sep 2024 08:36:59 +0000 (+0200) Subject: tree-wide: make sigprocmask() changes more automatic X-Git-Tag: v257-rc1~447^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d7a6bb9891ecc38a1bedef9689d00671bb0001ff;p=thirdparty%2Fsystemd.git tree-wide: make sigprocmask() changes more automatic This tries to get rid of most manual sigprocmask() changes, in favour of: 1. The SD_EVENT_SIGNAL_PROCMASK flag to sd_event_add_signal() 2. The sd_event_set_signal_exit() call for handling SIGTERM/SIGINT 3. Move masking of SIGWINCH into ptyfwd, out of nspawn/vmspawn/run And while we are at it get rid of a bunch of event source fields whose lifetime is bound to the sd_event object they belong to anyway, and make use of the "floating" event source feature of sd-event instead. --- diff --git a/src/basic/signal-util.h b/src/basic/signal-util.h index 814aa1a380e..633993ca00e 100644 --- a/src/basic/signal-util.h +++ b/src/basic/signal-util.h @@ -28,7 +28,7 @@ int sigaction_many_internal(const struct sigaction *sa, ...); int sigset_add_many_internal(sigset_t *ss, ...); #define sigset_add_many(...) sigset_add_many_internal(__VA_ARGS__, -1) -int sigprocmask_many_internal(int how, sigset_t *old, ...); +int sigprocmask_many_internal(int how, sigset_t *ret_old_mask, ...); #define sigprocmask_many(...) sigprocmask_many_internal(__VA_ARGS__, -1) const char* signal_to_string(int i) _const_; diff --git a/src/home/homed-manager.c b/src/home/homed-manager.c index cb26ed530b5..8a4544b269a 100644 --- a/src/home/homed-manager.c +++ b/src/home/homed-manager.c @@ -222,20 +222,16 @@ int manager_new(Manager **ret) { if (r < 0) return r; - r = sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL); + r = sd_event_set_signal_exit(m->event, true); if (r < 0) return r; - r = sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL); - if (r < 0) - return r; - - r = sd_event_add_memory_pressure(m->event, NULL, NULL, NULL); + r = sd_event_add_memory_pressure(m->event, /* ret_event_source= */ NULL, /* callback= */ NULL, /* userdata= */ NULL); if (r < 0) log_full_errno(ERRNO_IS_NOT_SUPPORTED(r) || ERRNO_IS_PRIVILEGE(r) || (r == -EHOSTDOWN) ? LOG_DEBUG : LOG_WARNING, r, "Failed to allocate memory pressure watch, ignoring: %m"); - r = sd_event_add_signal(m->event, NULL, SIGRTMIN+18, sigrtmin18_handler, NULL); + r = sd_event_add_signal(m->event, /* ret_event_source= */ NULL, (SIGRTMIN+18)|SD_EVENT_SIGNAL_PROCMASK, sigrtmin18_handler, /* userdata = */ NULL); if (r < 0) return r; diff --git a/src/home/homed.c b/src/home/homed.c index cfb498e47f9..bb9d3360d0d 100644 --- a/src/home/homed.c +++ b/src/home/homed.c @@ -29,7 +29,7 @@ static int run(int argc, char *argv[]) { umask(0022); - assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, SIGTERM, SIGINT, SIGRTMIN+18) >= 0); + assert_se(sigprocmask_many(SIG_BLOCK, /* ret_old_mask= */ NULL, SIGCHLD) >= 0); r = manager_new(&m); if (r < 0) diff --git a/src/journal/journald-server.c b/src/journal/journald-server.c index 6198454bd57..859e5366d0d 100644 --- a/src/journal/journald-server.c +++ b/src/journal/journald-server.c @@ -1787,17 +1787,15 @@ static int server_setup_signals(Server *s) { assert(s); - assert_se(sigprocmask_many(SIG_SETMASK, NULL, SIGINT, SIGTERM, SIGUSR1, SIGUSR2, SIGRTMIN+1, SIGRTMIN+18) >= 0); - - r = sd_event_add_signal(s->event, &s->sigusr1_event_source, SIGUSR1, dispatch_sigusr1, s); + r = sd_event_add_signal(s->event, &s->sigusr1_event_source, SIGUSR1|SD_EVENT_SIGNAL_PROCMASK, dispatch_sigusr1, s); if (r < 0) return r; - r = sd_event_add_signal(s->event, &s->sigusr2_event_source, SIGUSR2, dispatch_sigusr2, s); + r = sd_event_add_signal(s->event, &s->sigusr2_event_source, SIGUSR2|SD_EVENT_SIGNAL_PROCMASK, dispatch_sigusr2, s); if (r < 0) return r; - r = sd_event_add_signal(s->event, &s->sigterm_event_source, SIGTERM, dispatch_sigterm, s); + r = sd_event_add_signal(s->event, &s->sigterm_event_source, SIGTERM|SD_EVENT_SIGNAL_PROCMASK, dispatch_sigterm, s); if (r < 0) return r; @@ -1808,7 +1806,7 @@ static int server_setup_signals(Server *s) { /* When journald is invoked on the terminal (when debugging), it's useful if C-c is handled * equivalent to SIGTERM. */ - r = sd_event_add_signal(s->event, &s->sigint_event_source, SIGINT, dispatch_sigterm, s); + r = sd_event_add_signal(s->event, &s->sigint_event_source, SIGINT|SD_EVENT_SIGNAL_PROCMASK, dispatch_sigterm, s); if (r < 0) return r; @@ -1819,7 +1817,7 @@ static int server_setup_signals(Server *s) { /* SIGRTMIN+1 causes an immediate sync. We process this very late, so that everything else queued at * this point is really written to disk. Clients can watch /run/systemd/journal/synced with inotify * until its mtime changes to see when a sync happened. */ - r = sd_event_add_signal(s->event, &s->sigrtmin1_event_source, SIGRTMIN+1, dispatch_sigrtmin1, s); + r = sd_event_add_signal(s->event, &s->sigrtmin1_event_source, (SIGRTMIN+1)|SD_EVENT_SIGNAL_PROCMASK, dispatch_sigrtmin1, s); if (r < 0) return r; @@ -1827,7 +1825,7 @@ static int server_setup_signals(Server *s) { if (r < 0) return r; - r = sd_event_add_signal(s->event, NULL, SIGRTMIN+18, sigrtmin18_handler, &s->sigrtmin18_info); + r = sd_event_add_signal(s->event, /* ret_event_source= */ NULL, (SIGRTMIN+18)|SD_EVENT_SIGNAL_PROCMASK, sigrtmin18_handler, &s->sigrtmin18_info); if (r < 0) return r; diff --git a/src/login/logind.c b/src/login/logind.c index a0f7e08a2ab..f88a2004fda 100644 --- a/src/login/logind.c +++ b/src/login/logind.c @@ -86,15 +86,11 @@ static int manager_new(Manager **ret) { if (r < 0) return r; - r = sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL); + r = sd_event_set_signal_exit(m->event, true); if (r < 0) return r; - r = sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL); - if (r < 0) - return r; - - r = sd_event_add_signal(m->event, NULL, SIGRTMIN+18, sigrtmin18_handler, NULL); + r = sd_event_add_signal(m->event, /* ret_event_source= */ NULL, (SIGRTMIN+18)|SD_EVENT_SIGNAL_PROCMASK, sigrtmin18_handler, /* userdata= */ NULL); if (r < 0) return r; @@ -826,7 +822,7 @@ static int manager_connect_console(Manager *m) { return log_error_errno(r, "Failed to watch foreground console: %m"); /* - * SIGRTMIN is used as global VT-release signal, SIGRTMIN + 1 is used + * SIGRTMIN + 0 is used as global VT-release signal, SIGRTMIN + 1 is used * as VT-acquire signal. We ignore any acquire-events (yes, we still * have to provide a valid signal-number for it!) and acknowledge all * release events immediately. @@ -838,11 +834,10 @@ static int manager_connect_console(Manager *m) { SIGRTMIN, SIGRTMAX); assert_se(ignore_signals(SIGRTMIN + 1) >= 0); - assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGRTMIN) >= 0); - r = sd_event_add_signal(m->event, NULL, SIGRTMIN, manager_vt_switch, m); + r = sd_event_add_signal(m->event, /* ret_event_source= */ NULL, (SIGRTMIN + 0) | SD_EVENT_SIGNAL_PROCMASK, manager_vt_switch, m); if (r < 0) - return log_error_errno(r, "Failed to subscribe to signal: %m"); + return log_error_errno(r, "Failed to subscribe to SIGRTMIN+0 signal: %m"); return 0; } @@ -1097,7 +1092,7 @@ static int manager_startup(Manager *m) { assert(m); - r = sd_event_add_signal(m->event, NULL, SIGHUP, manager_dispatch_reload_signal, m); + r = sd_event_add_signal(m->event, /* ret_event_source= */ NULL, SIGHUP|SD_EVENT_SIGNAL_PROCMASK, manager_dispatch_reload_signal, m); if (r < 0) return log_error_errno(r, "Failed to register SIGHUP handler: %m"); @@ -1247,7 +1242,7 @@ static int run(int argc, char *argv[]) { (void) mkdir_label("/run/systemd/users", 0755); (void) mkdir_label("/run/systemd/sessions", 0755); - assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGHUP, SIGTERM, SIGINT, SIGCHLD, SIGRTMIN+18) >= 0); + assert_se(sigprocmask_many(SIG_BLOCK, /* ret_old_mask= */ NULL, SIGCHLD) >= 0); r = manager_new(&m); if (r < 0) diff --git a/src/machine/machinectl.c b/src/machine/machinectl.c index 92d8826f3a6..e6d773b7a09 100644 --- a/src/machine/machinectl.c +++ b/src/machine/machinectl.c @@ -1220,8 +1220,6 @@ static int process_forward(sd_event *event, PTYForward **forward, int master, PT assert(master >= 0); assert(name); - assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGWINCH, SIGTERM, SIGINT) >= 0); - if (!arg_quiet) { if (streq(name, ".host")) log_info("Connected to the local host. Press ^] three times within 1s to exit session."); @@ -1229,8 +1227,9 @@ static int process_forward(sd_event *event, PTYForward **forward, int master, PT log_info("Connected to machine %s. Press ^] three times within 1s to exit session.", name); } - (void) sd_event_add_signal(event, NULL, SIGINT, NULL, NULL); - (void) sd_event_add_signal(event, NULL, SIGTERM, NULL, NULL); + r = sd_event_set_signal_exit(event, true); + if (r < 0) + return log_error_errno(r, "Failed to enable SIGINT/SITERM handling: %m"); r = pty_forward_new(event, master, flags, forward); if (r < 0) diff --git a/src/machine/machined.c b/src/machine/machined.c index b2acc3f0f0e..491f7c735e3 100644 --- a/src/machine/machined.c +++ b/src/machine/machined.c @@ -55,15 +55,11 @@ static int manager_new(Manager **ret) { if (r < 0) return r; - r = sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL); + r = sd_event_set_signal_exit(m->event, true); if (r < 0) return r; - r = sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL); - if (r < 0) - return r; - - r = sd_event_add_signal(m->event, NULL, SIGRTMIN+18, sigrtmin18_handler, NULL); + r = sd_event_add_signal(m->event, /* ret_event_source= */ NULL, (SIGRTMIN+18)|SD_EVENT_SIGNAL_PROCMASK, sigrtmin18_handler, /* userdata= */ NULL); if (r < 0) return r; @@ -332,7 +328,7 @@ static int run(int argc, char *argv[]) { * make sure this check stays in. */ (void) mkdir_label("/run/systemd/machines", 0755); - assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, SIGTERM, SIGINT, SIGRTMIN+18) >= 0); + assert_se(sigprocmask_many(SIG_BLOCK, /* ret_old_mask= */ NULL, SIGCHLD) >= 0); r = manager_new(&m); if (r < 0) diff --git a/src/network/wait-online/manager.c b/src/network/wait-online/manager.c index 7838350c48f..47f5df6a5f6 100644 --- a/src/network/wait-online/manager.c +++ b/src/network/wait-online/manager.c @@ -410,8 +410,7 @@ int manager_new(Manager **ret, if (r < 0) return r; - (void) sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL); - (void) sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL); + (void) sd_event_set_signal_exit(m->event, true); if (timeout > 0) { r = sd_event_add_time_relative(m->event, NULL, CLOCK_BOOTTIME, timeout, 0, NULL, INT_TO_PTR(-ETIMEDOUT)); diff --git a/src/network/wait-online/wait-online.c b/src/network/wait-online/wait-online.c index 4f8270ddfad..6f5aef903ac 100644 --- a/src/network/wait-online/wait-online.c +++ b/src/network/wait-online/wait-online.c @@ -204,8 +204,6 @@ static int run(int argc, char *argv[]) { if (arg_quiet) log_set_max_level(LOG_ERR); - assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT) >= 0); - r = manager_new(&m, arg_interfaces, arg_ignore, arg_required_operstate, arg_required_family, arg_any, arg_timeout); if (r < 0) return log_error_errno(r, "Could not create manager: %m"); diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index c0f027fa98e..cd4467cca4e 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -5601,6 +5601,10 @@ static int run_container( log_warning_errno(r, "Failed to send readiness notification, ignoring: %m"); } + /* Note: we do not use SD_EVENT_SIGNAL_PROCMASK or sd_event_set_signal_exit(), since we want the + * signals to be block continously, even if we destroy the event loop and allocate a new one on + * container reboot. */ + if (arg_kill_signal > 0) { /* Try to kill the init system on SIGINT or SIGTERM */ (void) sd_event_add_signal(event, NULL, SIGINT, on_orderly_shutdown, PID_TO_PTR(*pid)); diff --git a/src/oom/oomd-manager.c b/src/oom/oomd-manager.c index ee57e41b4e9..a7b0717958d 100644 --- a/src/oom/oomd-manager.c +++ b/src/oom/oomd-manager.c @@ -657,11 +657,7 @@ int manager_new(Manager **ret) { (void) sd_event_set_watchdog(m->event, true); - r = sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL); - if (r < 0) - return r; - - r = sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL); + r = sd_event_set_signal_exit(m->event, true); if (r < 0) return r; diff --git a/src/oom/oomd.c b/src/oom/oomd.c index 0d8031052e0..336549aff7d 100644 --- a/src/oom/oomd.c +++ b/src/oom/oomd.c @@ -167,8 +167,6 @@ static int run(int argc, char *argv[]) { if (!FLAGS_SET(mask, CGROUP_MASK_MEMORY)) return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "Requires the cgroup memory controller."); - assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT) >= 0); - if (arg_mem_pressure_usec > 0 && arg_mem_pressure_usec < 1 * USEC_PER_SEC) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "DefaultMemoryPressureDurationSec= must be 0 or at least 1s"); diff --git a/src/portable/portabled.c b/src/portable/portabled.c index 0286bf59e75..766999ff0de 100644 --- a/src/portable/portabled.c +++ b/src/portable/portabled.c @@ -36,15 +36,11 @@ static int manager_new(Manager **ret) { if (r < 0) return r; - r = sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL); + r = sd_event_set_signal_exit(m->event, true); if (r < 0) return r; - r = sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL); - if (r < 0) - return r; - - r = sd_event_add_signal(m->event, NULL, SIGRTMIN+18, sigrtmin18_handler, NULL); + r = sd_event_add_signal(m->event, /* ret_event_source= */ NULL, (SIGRTMIN+18)|SD_EVENT_SIGNAL_PROCMASK, sigrtmin18_handler, /* userdata= */ NULL); if (r < 0) return r; @@ -142,7 +138,7 @@ static int run(int argc, char *argv[]) { if (argc != 1) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program takes no arguments."); - assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, SIGTERM, SIGINT, SIGRTMIN+18) >= 0); + assert_se(sigprocmask_many(SIG_BLOCK, /* ret_old_mask= */ NULL, SIGCHLD) >= 0); r = manager_new(&m); if (r < 0) diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c index 5f92684215c..e6d112964af 100644 --- a/src/resolve/resolved-manager.c +++ b/src/resolve/resolved-manager.c @@ -682,9 +682,9 @@ int manager_new(Manager **ret) { if (r < 0) return r; - (void) sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL); - (void) sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL); - (void) sd_event_add_signal(m->event, NULL, SIGHUP | SD_EVENT_SIGNAL_PROCMASK, manager_dispatch_reload_signal, m); + r = sd_event_set_signal_exit(m->event, true); + if (r < 0) + return r; (void) sd_event_set_watchdog(m->event, true); @@ -720,10 +720,25 @@ int manager_new(Manager **ret) { if (r < 0) return r; - (void) sd_event_add_signal(m->event, &m->sigusr1_event_source, SIGUSR1, manager_sigusr1, m); - (void) sd_event_add_signal(m->event, &m->sigusr2_event_source, SIGUSR2, manager_sigusr2, m); - (void) sd_event_add_signal(m->event, &m->sigrtmin1_event_source, SIGRTMIN+1, manager_sigrtmin1, m); - (void) sd_event_add_signal(m->event, NULL, SIGRTMIN+18, sigrtmin18_handler, &m->sigrtmin18_info); + r = sd_event_add_signal(m->event, /* ret_event_source= */ NULL, SIGHUP | SD_EVENT_SIGNAL_PROCMASK, manager_dispatch_reload_signal, m); + if (r < 0) + return log_debug_errno(r, "Failed install SIGHUP handler: %m"); + + r = sd_event_add_signal(m->event, /* ret_event_source= */ NULL, SIGUSR1 | SD_EVENT_SIGNAL_PROCMASK, manager_sigusr1, m); + if (r < 0) + return log_debug_errno(r, "Failed install SIGUSR1 handler: %m"); + + r = sd_event_add_signal(m->event, /* ret_event_source= */ NULL, SIGUSR2 | SD_EVENT_SIGNAL_PROCMASK, manager_sigusr2, m); + if (r < 0) + return log_debug_errno(r, "Failed install SIGUSR2 handler: %m"); + + r = sd_event_add_signal(m->event, /* ret_event_source= */ NULL, (SIGRTMIN+1) | SD_EVENT_SIGNAL_PROCMASK, manager_sigrtmin1, m); + if (r < 0) + return log_debug_errno(r, "Failed install SIGRTMIN+1 handler: %m"); + + r = sd_event_add_signal(m->event, /* ret_event_source= */ NULL, (SIGRTMIN+18) | SD_EVENT_SIGNAL_PROCMASK, sigrtmin18_handler, &m->sigrtmin18_info); + if (r < 0) + return log_debug_errno(r, "Failed install SIGRTMIN+18 handler: %m"); manager_cleanup_saved_user(m); @@ -801,10 +816,6 @@ Manager *manager_free(Manager *m) { sd_bus_flush_close_unref(m->bus); - sd_event_source_unref(m->sigusr1_event_source); - sd_event_source_unref(m->sigusr2_event_source); - sd_event_source_unref(m->sigrtmin1_event_source); - dns_resource_key_unref(m->llmnr_host_ipv4_key); dns_resource_key_unref(m->llmnr_host_ipv6_key); dns_resource_key_unref(m->mdns_host_ipv4_key); diff --git a/src/resolve/resolved-manager.h b/src/resolve/resolved-manager.h index eda3e19a98a..337aa2788ce 100644 --- a/src/resolve/resolved-manager.h +++ b/src/resolve/resolved-manager.h @@ -123,10 +123,6 @@ struct Manager { int hostname_fd; sd_event_source *hostname_event_source; - sd_event_source *sigusr1_event_source; - sd_event_source *sigusr2_event_source; - sd_event_source *sigrtmin1_event_source; - unsigned n_transactions_total; unsigned n_timeouts_total; unsigned n_timeouts_served_stale_total; diff --git a/src/resolve/resolved.c b/src/resolve/resolved.c index 664e7dd6539..d6a7f0cf5a8 100644 --- a/src/resolve/resolved.c +++ b/src/resolve/resolved.c @@ -67,8 +67,6 @@ static int run(int argc, char *argv[]) { return log_error_errno(r, "Failed to drop privileges: %m"); } - assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, SIGUSR1, SIGUSR2, SIGRTMIN+1, SIGRTMIN+18) >= 0); - r = manager_new(&m); if (r < 0) return log_error_errno(r, "Could not create manager: %m"); diff --git a/src/run/run.c b/src/run/run.c index 9010b8d6605..4370f897ecb 100644 --- a/src/run/run.c +++ b/src/run/run.c @@ -1875,8 +1875,6 @@ static int start_transient_service(sd_bus *bus) { return log_error_errno(r, "Failed to get event loop: %m"); if (master >= 0) { - assert_se(sigprocmask_many(SIG_BLOCK, /* old_sigset=*/ NULL, SIGWINCH) >= 0); - (void) sd_event_set_signal_exit(c.event, true); if (!arg_quiet) diff --git a/src/shared/ptyfwd.c b/src/shared/ptyfwd.c index 3e11ba456f1..c06c279d87b 100644 --- a/src/shared/ptyfwd.c +++ b/src/shared/ptyfwd.c @@ -942,7 +942,7 @@ int pty_forward_new( (void) sd_event_source_set_description(f->master_event_source, "ptyfwd-master"); - r = sd_event_add_signal(f->event, &f->sigwinch_event_source, SIGWINCH, on_sigwinch_event, f); + r = sd_event_add_signal(f->event, &f->sigwinch_event_source, SIGWINCH|SD_EVENT_SIGNAL_PROCMASK, on_sigwinch_event, f); if (r < 0) return r; diff --git a/src/timesync/timesyncd-manager.c b/src/timesync/timesyncd-manager.c index 5cec9c9f849..67b796a3355 100644 --- a/src/timesync/timesyncd-manager.c +++ b/src/timesync/timesyncd-manager.c @@ -1132,15 +1132,21 @@ int manager_new(Manager **ret) { if (r < 0) return r; - (void) sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL); - (void) sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL); - (void) sd_event_add_signal(m->event, NULL, SIGRTMIN+18, sigrtmin18_handler, NULL); + r = sd_event_set_signal_exit(m->event, true); + if (r < 0) + return r; + + r = sd_event_add_signal(m->event, /* ret_event_source= */ NULL, (SIGRTMIN+18)|SD_EVENT_SIGNAL_PROCMASK, sigrtmin18_handler, /* userdata= */ NULL); + if (r < 0) + log_debug_errno(r, "Failed to install SIGRTMIN+18 signal handler, ignoring: %m"); r = sd_event_add_memory_pressure(m->event, NULL, NULL, NULL); if (r < 0) log_debug_errno(r, "Failed allocate memory pressure event source, ignoring: %m"); - (void) sd_event_set_watchdog(m->event, true); + r = sd_event_set_watchdog(m->event, true); + if (r < 0) + log_debug_errno(r, "Failed to enable watchdog handling, ignoring: %m"); /* Load previous synchronization state */ r = access("/run/systemd/timesync/synchronized", F_OK); diff --git a/src/timesync/timesyncd.c b/src/timesync/timesyncd.c index 69c6b8e72ac..d002501d290 100644 --- a/src/timesync/timesyncd.c +++ b/src/timesync/timesyncd.c @@ -179,8 +179,6 @@ static int run(int argc, char *argv[]) { return log_error_errno(r, "Failed to drop privileges: %m"); } - assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, SIGRTMIN+18) >= 0); - r = manager_new(&m); if (r < 0) return log_error_errno(r, "Failed to allocate manager: %m"); diff --git a/src/timesync/wait-sync.c b/src/timesync/wait-sync.c index b6c167b0f97..4104b013254 100644 --- a/src/timesync/wait-sync.c +++ b/src/timesync/wait-sync.c @@ -184,19 +184,13 @@ static int run(int argc, char * argv[]) { }; int r; - assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT) >= 0); - r = sd_event_default(&event); if (r < 0) return log_error_errno(r, "Failed to allocate event loop: %m"); - r = sd_event_add_signal(event, NULL, SIGTERM, NULL, NULL); - if (r < 0) - return log_error_errno(r, "Failed to create sigterm event source: %m"); - - r = sd_event_add_signal(event, NULL, SIGINT, NULL, NULL); + r = sd_event_set_signal_exit(event, true); if (r < 0) - return log_error_errno(r, "Failed to create sigint event source: %m"); + return log_error_errno(r, "Failed to enable SIGTERM/SIGINT handling: %m"); r = sd_event_set_watchdog(event, true); if (r < 0) diff --git a/src/udev/udev-manager.c b/src/udev/udev-manager.c index a031444c2e7..08ed176faf2 100644 --- a/src/udev/udev-manager.c +++ b/src/udev/udev-manager.c @@ -153,8 +153,6 @@ Manager* manager_free(Manager *manager) { sd_event_source_unref(manager->inotify_event); sd_event_source_unref(manager->kill_workers_event); - sd_event_source_unref(manager->memory_pressure_event_source); - sd_event_source_unref(manager->sigrtmin18_event_source); sd_event_unref(manager->event); free(manager->cgroup); @@ -1352,13 +1350,13 @@ int manager_main(Manager *manager) { return log_error_errno(r, "Failed to create post event source: %m"); /* Eventually, we probably want to do more here on memory pressure, for example, kill idle workers immediately */ - r = sd_event_add_memory_pressure(manager->event, &manager->memory_pressure_event_source, NULL, NULL); + r = sd_event_add_memory_pressure(manager->event, /* ret_event_source= */ NULL, /* callback= */ NULL, /* userdata= */ NULL); if (r < 0) log_full_errno(ERRNO_IS_NOT_SUPPORTED(r) || ERRNO_IS_PRIVILEGE(r) || (r == -EHOSTDOWN) ? LOG_DEBUG : LOG_WARNING, r, "Failed to allocate memory pressure watch, ignoring: %m"); - r = sd_event_add_signal(manager->event, &manager->memory_pressure_event_source, - (SIGRTMIN+18) | SD_EVENT_SIGNAL_PROCMASK, sigrtmin18_handler, NULL); + r = sd_event_add_signal(manager->event, /* ret_event_source= */ NULL, + (SIGRTMIN+18) | SD_EVENT_SIGNAL_PROCMASK, sigrtmin18_handler, /* userdata= */ NULL); if (r < 0) return log_error_errno(r, "Failed to allocate SIGRTMIN+18 event source, ignoring: %m"); diff --git a/src/udev/udev-manager.h b/src/udev/udev-manager.h index 864fc0290e3..41aa73698d6 100644 --- a/src/udev/udev-manager.h +++ b/src/udev/udev-manager.h @@ -35,9 +35,6 @@ typedef struct Manager { sd_event_source *kill_workers_event; - sd_event_source *memory_pressure_event_source; - sd_event_source *sigrtmin18_event_source; - usec_t last_usec; ResolveNameTiming resolve_name_timing; diff --git a/src/udev/udevadm-monitor.c b/src/udev/udevadm-monitor.c index b1124df76a2..9585ac892f2 100644 --- a/src/udev/udevadm-monitor.c +++ b/src/udev/udevadm-monitor.c @@ -208,9 +208,11 @@ int monitor_main(int argc, char *argv[], void *userdata) { goto finalize; } - assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT) >= 0); - (void) sd_event_add_signal(event, NULL, SIGTERM, NULL, NULL); - (void) sd_event_add_signal(event, NULL, SIGINT, NULL, NULL); + r = sd_event_set_signal_exit(event, true); + if (r < 0) { + log_error_errno(r, "Failed to install SIGINT/SIGTERM handling: %m"); + goto finalize; + } printf("monitor will print the received events for:\n"); if (arg_print_udev) { diff --git a/src/vmspawn/vmspawn.c b/src/vmspawn/vmspawn.c index 92a197ba308..15418f07423 100644 --- a/src/vmspawn/vmspawn.c +++ b/src/vmspawn/vmspawn.c @@ -2124,7 +2124,7 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) { return r; } - assert_se(sigprocmask_many(SIG_BLOCK, /* old_sigset=*/ NULL, SIGCHLD, SIGWINCH) >= 0); + assert_se(sigprocmask_many(SIG_BLOCK, /* ret_old_mask=*/ NULL, SIGCHLD) >= 0); _cleanup_(sd_event_source_unrefp) sd_event_source *notify_event_source = NULL; _cleanup_(sd_event_unrefp) sd_event *event = NULL;