summaryrefslogtreecommitdiff
path: root/src/network/networkd-manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/network/networkd-manager.c')
-rw-r--r--src/network/networkd-manager.c28
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);