1
0
mirror of https://github.com/systemd/systemd.git synced 2025-03-19 22:50:17 +03:00

networkd: handle SIGINT and SIGTERM

This commit is contained in:
Tom Gundersen 2014-02-22 20:19:49 +01:00
parent 12e0f830f5
commit 0c2f9b8469
4 changed files with 44 additions and 5 deletions

View File

@ -35,6 +35,8 @@ int link_new(Manager *manager, struct udev_device *device, Link **ret) {
const char *ifname;
int r;
assert(manager);
assert(manager->links);
assert(device);
assert(ret);

View File

@ -38,6 +38,38 @@ const char* const network_dirs[] = {
#endif
NULL};
static int dispatch_sigterm(sd_event_source *es, const struct signalfd_siginfo *si, void *userdata) {
Manager *m = userdata;
assert(m);
log_received_signal(LOG_INFO, si);
sd_event_exit(m->event, 0);
return 0;
}
static int setup_signals(Manager *m) {
sigset_t mask;
int r;
assert(m);
assert_se(sigemptyset(&mask) == 0);
sigset_add_many(&mask, SIGINT, SIGTERM, -1);
assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0);
r = sd_event_add_signal(m->event, &m->sigterm_event_source, SIGTERM, dispatch_sigterm, m);
if (r < 0)
return r;
r = sd_event_add_signal(m->event, &m->sigint_event_source, SIGINT, dispatch_sigterm, m);
if (r < 0)
return r;
return 0;
}
int manager_new(Manager **ret) {
_cleanup_manager_free_ Manager *m = NULL;
int r;
@ -60,6 +92,10 @@ int manager_new(Manager **ret) {
if (r < 0 && r != -ENOENT) /* TODO: drop when we can rely on kdbus */
return r;
r = setup_signals(m);
if (r < 0)
return r;
m->udev = udev_new();
if (!m->udev)
return -ENOMEM;
@ -105,6 +141,8 @@ void manager_free(Manager *m) {
udev_unref(m->udev);
sd_bus_unref(m->bus);
sd_event_source_unref(m->udev_event_source);
sd_event_source_unref(m->sigterm_event_source);
sd_event_source_unref(m->sigint_event_source);
sd_event_unref(m->event);
while ((network = m->networks))

View File

@ -201,6 +201,8 @@ struct Manager {
struct udev *udev;
struct udev_monitor *udev_monitor;
sd_event_source *udev_event_source;
sd_event_source *sigterm_event_source;
sd_event_source *sigint_event_source;
Hashmap *links;
Hashmap *netdevs;

View File

@ -21,12 +21,9 @@
#include "networkd.h"
static void test_link(struct udev_device *loopback) {
_cleanup_manager_free_ Manager *manager = NULL;
static void test_link(Manager *manager, struct udev_device *loopback) {
Link *link = NULL;
manager_new(&manager);
assert_se(link_new(manager, loopback, &link) >= 0);
assert_se(link);
}
@ -69,7 +66,7 @@ int main(void) {
test_network_get(manager, loopback);
test_link(loopback);
test_link(manager, loopback);
assert_se(manager_udev_listen(manager) >= 0);
assert_se(manager_udev_enumerate_links(manager) >= 0);