diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index e0c095d022..546bb2375c 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -30,6 +30,7 @@ #include "ordered-set.h" #include "path-util.h" #include "set.h" +#include "signal-util.h" #include "strv.h" #include "sysctl-util.h" #include "tmpfile-util.h" @@ -1561,6 +1562,28 @@ static int manager_dirty_handler(sd_event_source *s, void *userdata) { return 1; } +static int signal_terminate_callback(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) { + Manager *m = userdata; + + assert(m); + m->restarting = false; + + log_debug("Terminate operation initiated."); + + return sd_event_exit(sd_event_source_get_event(s), 0); +} + +static int signal_restart_callback(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) { + Manager *m = userdata; + + assert(m); + m->restarting = true; + + log_debug("Restart operation initiated."); + + return sd_event_exit(sd_event_source_get_event(s), 0); +} + int manager_new(Manager **ret) { _cleanup_(manager_freep) Manager *m = NULL; int r; @@ -1581,9 +1604,12 @@ int manager_new(Manager **ret) { if (r < 0) return r; + assert_se(sigprocmask_many(SIG_SETMASK, NULL, SIGINT, SIGTERM, SIGUSR2, -1) >= 0); + (void) sd_event_set_watchdog(m->event, true); - (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, SIGTERM, signal_terminate_callback, m); + (void) sd_event_add_signal(m->event, NULL, SIGINT, signal_terminate_callback, m); + (void) sd_event_add_signal(m->event, NULL, SIGUSR2, signal_restart_callback, m); r = sd_event_add_post(m->event, NULL, manager_dirty_handler, m); if (r < 0) diff --git a/src/network/networkd-manager.h b/src/network/networkd-manager.h index f5166dad12..7b5557f5bf 100644 --- a/src/network/networkd-manager.h +++ b/src/network/networkd-manager.h @@ -29,6 +29,7 @@ struct Manager { bool enumerating:1; bool dirty:1; + bool restarting:1; Set *dirty_links; diff --git a/units/systemd-networkd.service.in b/units/systemd-networkd.service.in index 9ea3bb914e..5c6275e5b3 100644 --- a/units/systemd-networkd.service.in +++ b/units/systemd-networkd.service.in @@ -42,6 +42,7 @@ SystemCallArchitectures=native SystemCallErrorNumber=EPERM SystemCallFilter=@system-service Type=notify +RestartKillSignal=SIGUSR2 User=systemd-network WatchdogSec=3min