chiark / gitweb /
networkd: don't hard depend on system bus
[elogind.git] / src / network / networkd-manager.c
index 90328a1b5061e6d08fcf789d43e34eaa45131633..c630ed7ed91aa6bae261a7ae5f3694a01aa5b4b6 100644 (file)
@@ -54,6 +54,10 @@ int manager_new(Manager **ret) {
         if (r < 0)
                 return r;
 
+        r = sd_bus_default_system(&m->bus);
+        if (r < 0 && r != -ENOENT) /* TODO: drop when we can rely on kdbus */
+                return r;
+
         m->udev = udev_new();
         if (!m->udev)
                 return -ENOMEM;
@@ -85,6 +89,7 @@ void manager_free(Manager *m) {
 
         udev_monitor_unref(m->udev_monitor);
         udev_unref(m->udev);
+        sd_bus_unref(m->bus);
         sd_event_source_unref(m->udev_event_source);
         sd_event_unref(m->event);
 
@@ -280,6 +285,21 @@ int manager_rtnl_listen(Manager *m) {
         return 0;
 }
 
+int manager_bus_listen(Manager *m) {
+        int r;
+
+        assert(m->event);
+
+        if (!m->bus) /* TODO: drop when we can rely on kdbus */
+                return 0;
+
+        r = sd_bus_attach_event(m->bus, m->event, 0);
+        if (r < 0)
+                return r;
+
+        return 0;
+}
+
 static void append_dns(FILE *f, struct in_addr *dns, unsigned char family, unsigned *count) {
         char buf[INET6_ADDRSTRLEN];
         const char *address;
@@ -319,18 +339,23 @@ int manager_update_resolv_conf(Manager *m) {
 
         fchmod(fileno(f), 0644);
 
-        fputs("# This file is managed by systemd-networkd(8). Do not edit.\n", f);
+        fputs("# This file is managed by systemd-networkd(8). Do not edit.\n#\n"
+              "# Third party programs must not access this file directly, but\n"
+              "# only through the symlink at /etc/resolv.conf. To manage\n"
+              "# resolv.conf(5) in a different way, replace the symlink by a\n"
+              "# static file or a different symlink.\n\n", f);
 
         HASHMAP_FOREACH(link, m->links, i) {
                 if (link->dhcp) {
-                        struct in_addr **nameservers;
+                        struct in_addr *nameservers;
+                        size_t nameservers_size;
 
-                        r = sd_dhcp_client_get_dns(link->dhcp, &nameservers);
+                        r = sd_dhcp_client_get_dns(link->dhcp, &nameservers, &nameservers_size);
                         if (r >= 0) {
                                 unsigned j;
 
-                                for (j = 0; nameservers[j]; j++)
-                                        append_dns(f, nameservers[j], AF_INET, &count);
+                                for (j = 0; j < nameservers_size; j++)
+                                        append_dns(f, &nameservers[j], AF_INET, &count);
                         }
                 }
         }