chiark / gitweb /
networkd: add basic dbus API
[elogind.git] / src / network / networkd-manager.c
index 378633061e1d0121df7b4a0d768ebd0222babc49..40328a36c95de117f0c1a751ba0f3d3b8f23a94e 100644 (file)
@@ -151,10 +151,6 @@ int manager_connect_bus(Manager *m) {
         } if (r < 0)
                 return r;
 
-        r = sd_bus_attach_event(m->bus, m->event, 0);
-        if (r < 0)
-                return r;
-
         r = sd_bus_add_match(m->bus, &m->prepare_for_sleep_slot,
                              "type='signal',"
                              "sender='org.freedesktop.login1',"
@@ -166,6 +162,26 @@ int manager_connect_bus(Manager *m) {
         if (r < 0)
                 return log_error_errno(r, "Failed to add match for PrepareForSleep: %m");
 
+        r = sd_bus_add_object_vtable(m->bus, NULL, "/org/freedesktop/network1", "org.freedesktop.network1.Manager", manager_vtable, m);
+        if (r < 0)
+                return log_error_errno(r, "Failed to add manager object vtable: %m");
+
+        r = sd_bus_add_fallback_vtable(m->bus, NULL, "/org/freedesktop/network1/link", "org.freedesktop.network1.Link", link_vtable, link_object_find, m);
+        if (r < 0)
+               return log_error_errno(r, "Failed to add link object vtable: %m");
+
+        r = sd_bus_add_node_enumerator(m->bus, NULL, "/org/freedesktop/network1/link", link_node_enumerator, m);
+        if (r < 0)
+                return log_error_errno(r, "Failed to add link enumerator: %m");
+
+        r = sd_bus_request_name(m->bus, "org.freedesktop.network1", 0);
+        if (r < 0)
+                return log_error_errno(r, "Failed to register name: %m");
+
+        r = sd_bus_attach_event(m->bus, m->event, 0);
+        if (r < 0)
+                return log_error_errno(r, "Failed to attach bus to event loop: %m");
+
         return 0;
 }
 
@@ -525,9 +541,13 @@ int manager_rtnl_enumerate_links(Manager *m) {
         for (link = reply; link; link = sd_rtnl_message_next(link)) {
                 int k;
 
+                m->enumerating = true;
+
                 k = manager_rtnl_process_link(m->rtnl, link, m);
                 if (k < 0)
                         r = k;
+
+                m->enumerating = false;
         }
 
         return r;
@@ -556,9 +576,13 @@ int manager_rtnl_enumerate_addresses(Manager *m) {
         for (addr = reply; addr; addr = sd_rtnl_message_next(addr)) {
                 int k;
 
+                m->enumerating = true;
+
                 k = link_rtnl_process_address(m->rtnl, addr, m);
                 if (k < 0)
                         r = k;
+
+                m->enumerating = false;
         }
 
         return r;
@@ -733,6 +757,13 @@ int manager_save(Manager *m) {
                 goto fail;
         }
 
+        if (m->operational_state != operstate) {
+                m->operational_state = operstate;
+                r = manager_send_changed(m, "OperationalState", NULL);
+                if (r < 0)
+                        log_error_errno(r, "Could not emit changed OperationalState: %m");
+        }
+
         return 0;
 
 fail: