diff options
Diffstat (limited to 'src/network/networkd-manager.c')
-rw-r--r-- | src/network/networkd-manager.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index f2fe5d544..0b722e9cd 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -34,6 +34,8 @@ #include "mkdir.h" #include "virt.h" +#include "glib-event-glue.h" + #include "sd-rtnl.h" const char* const network_dirs[] = { @@ -72,6 +74,16 @@ static int setup_default_address_pool(Manager *m) { return 0; } +static int event_quit(sd_event_source *source, void *userdata) { + GMainLoop *loop = userdata; + + assert(loop); + + g_main_loop_quit(loop); + + return 1; +} + int manager_new(Manager **ret) { _cleanup_manager_free_ Manager *m = NULL; int r; @@ -88,6 +100,20 @@ int manager_new(Manager **ret) { if (r < 0) return r; + m->glue_source = g_sd_event_create_source(m->event); + if (!m->glue_source) + return -ENOMEM; + + m->loop = g_main_loop_new(NULL, true); + if (!m->loop) + return -ENOMEM; + + g_source_attach(m->glue_source, g_main_loop_get_context(m->loop)); + + r = sd_event_add_exit(m->event, NULL, event_quit, m->loop); + if (r < 0) + return r; + sd_event_set_watchdog(m->event, true); sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL); @@ -149,6 +175,8 @@ void manager_free(Manager *m) { sd_event_source_unref(m->sigterm_event_source); sd_event_source_unref(m->sigint_event_source); sd_event_unref(m->event); + g_source_unref(m->glue_source); + g_main_loop_unref(m->loop); while ((link = hashmap_first(m->links))) link_unref(link); |