diff options
author | Lennart Poettering <lennart@poettering.net> | 2023-01-02 17:25:46 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2023-01-10 18:28:38 +0100 |
commit | 0e07cdb0e77d0322bc866b5e13abbe38e988059d (patch) | |
tree | 7380911ab2ef15cb6a04b1f71838f9e83268cdbe /src/network/networkd-manager.c | |
parent | dd0ab174c36492cdcb92cf46844fb0905b1d4a7e (diff) | |
download | systemd-0e07cdb0e77d0322bc866b5e13abbe38e988059d.tar.gz |
networkd: implement Type=notify-reload protocol
Diffstat (limited to 'src/network/networkd-manager.c')
-rw-r--r-- | src/network/networkd-manager.c | 48 |
1 files changed, 43 insertions, 5 deletions
diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index 7d067a8c46..f82117cc1e 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -474,6 +474,14 @@ static int signal_restart_callback(sd_event_source *s, const struct signalfd_sig return sd_event_exit(sd_event_source_get_event(s), 0); } +static int signal_reload_callback(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) { + Manager *m = ASSERT_PTR(userdata); + + manager_reload(m); + + return 0; +} + static int manager_set_keep_configuration(Manager *m) { int r; @@ -508,12 +516,11 @@ int manager_setup(Manager *m) { 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, 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); + (void) sd_event_add_signal(m->event, NULL, SIGTERM | SD_EVENT_SIGNAL_PROCMASK, signal_terminate_callback, m); + (void) sd_event_add_signal(m->event, NULL, SIGINT | SD_EVENT_SIGNAL_PROCMASK, signal_terminate_callback, m); + (void) sd_event_add_signal(m->event, NULL, SIGUSR2 | SD_EVENT_SIGNAL_PROCMASK, signal_restart_callback, m); + (void) sd_event_add_signal(m->event, NULL, SIGHUP | SD_EVENT_SIGNAL_PROCMASK, signal_reload_callback, m); r = sd_event_add_post(m->event, NULL, manager_dirty_handler, m); if (r < 0) @@ -1069,3 +1076,34 @@ int manager_set_timezone(Manager *m, const char *tz) { return 0; } + +int manager_reload(Manager *m) { + Link *link; + int r; + + assert(m); + + (void) sd_notifyf(/* unset= */ false, + "RELOADING=1\n" + "STATUS=Reloading configuration...\n" + "MONOTONIC_USEC=" USEC_FMT, now(CLOCK_MONOTONIC)); + + r = netdev_load(m, /* reload= */ true); + if (r < 0) + goto finish; + + r = network_reload(m); + if (r < 0) + goto finish; + + HASHMAP_FOREACH(link, m->links_by_index) { + r = link_reconfigure(link, /* force = */ false); + if (r < 0) + goto finish; + } + + r = 0; +finish: + (void) sd_notify(/* unset= */ false, NOTIFY_READY); + return r; +} |