]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
resolved: split out calls to compile full list of dns servers and search domains
authorLennart Poettering <lennart@poettering.net>
Tue, 24 Nov 2015 20:55:00 +0000 (21:55 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 25 Nov 2015 20:58:38 +0000 (21:58 +0100)
Let's split this out from the resolv.conf parser, so that this becomes
generically useful.

src/resolve/resolved-manager.c
src/resolve/resolved-manager.h
src/resolve/resolved-resolv-conf.c

index 31f042e066b6be5125e89985ec82c82453c49254..64703ab713e4ea81b7333fd11e7018ff736e8812 100644 (file)
@@ -1055,6 +1055,88 @@ int manager_is_own_hostname(Manager *m, const char *name) {
         return 0;
 }
 
+int manager_compile_dns_servers(Manager *m, OrderedSet **dns) {
+        DnsServer *s;
+        Iterator i;
+        Link *l;
+        int r;
+
+        assert(m);
+        assert(dns);
+
+        r = ordered_set_ensure_allocated(dns, &dns_server_hash_ops);
+        if (r < 0)
+                return r;
+
+        /* First add the system-wide servers and domains */
+        LIST_FOREACH(servers, s, m->dns_servers) {
+                r = ordered_set_put(*dns, s);
+                if (r == -EEXIST)
+                        continue;
+                if (r < 0)
+                        return r;
+        }
+
+        /* Then, add the per-link servers */
+        HASHMAP_FOREACH(l, m->links, i) {
+                LIST_FOREACH(servers, s, l->dns_servers) {
+                        r = ordered_set_put(*dns, s);
+                        if (r == -EEXIST)
+                                continue;
+                        if (r < 0)
+                                return r;
+                }
+        }
+
+        /* If we found nothing, add the fallback servers */
+        if (ordered_set_isempty(*dns)) {
+                LIST_FOREACH(servers, s, m->fallback_dns_servers) {
+                        r = ordered_set_put(*dns, s);
+                        if (r == -EEXIST)
+                                continue;
+                        if (r < 0)
+                                return r;
+                }
+        }
+
+        return 0;
+}
+
+int manager_compile_search_domains(Manager *m, OrderedSet **domains) {
+        DnsSearchDomain *d;
+        Iterator i;
+        Link *l;
+        int r;
+
+        assert(m);
+        assert(domains);
+
+        r = ordered_set_ensure_allocated(domains, &dns_name_hash_ops);
+        if (r < 0)
+                return r;
+
+        LIST_FOREACH(domains, d, m->search_domains) {
+                r = ordered_set_put(*domains, d->name);
+                if (r == -EEXIST)
+                        continue;
+                if (r < 0)
+                        return r;
+        }
+
+        HASHMAP_FOREACH(l, m->links, i) {
+
+                LIST_FOREACH(domains, d, l->search_domains) {
+                        r = ordered_set_put(*domains, d->name);
+                        if (r == -EEXIST)
+                                continue;
+                        if (r < 0)
+                                return r;
+                }
+        }
+
+        return 0;
+}
+
 static const char* const support_table[_SUPPORT_MAX] = {
         [SUPPORT_NO] = "no",
         [SUPPORT_YES] = "yes",
index 2bbd5d08e967649fbdb31e925e692b42ecf6d074..d00c4445839ace26e89d7c90e8f9539b06c9601f 100644 (file)
@@ -27,6 +27,7 @@
 
 #include "hashmap.h"
 #include "list.h"
+#include "ordered-set.h"
 
 typedef struct Manager Manager;
 typedef enum Support Support;
@@ -148,5 +149,8 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
 
 int manager_is_own_hostname(Manager *m, const char *name);
 
+int manager_compile_dns_servers(Manager *m, OrderedSet **servers);
+int manager_compile_search_domains(Manager *m, OrderedSet **domains);
+
 const char* support_to_string(Support p) _const_;
 int support_from_string(const char *s) _pure_;
index f5cce670f0e92c66521efa2113a037c7fb6660fe..744969b7453451e56988bfbb08cee334655611e5 100644 (file)
@@ -220,14 +220,12 @@ static int write_resolv_conf_contents(FILE *f, OrderedSet *dns, OrderedSet *doma
 }
 
 int manager_write_resolv_conf(Manager *m) {
-        static const char path[] = "/run/systemd/resolve/resolv.conf";
+
+        #define PRIVATE_RESOLV_CONF "/run/systemd/resolve/resolv.conf"
+
+        _cleanup_ordered_set_free_ OrderedSet *dns = NULL, *domains = NULL;
         _cleanup_free_ char *temp_path = NULL;
         _cleanup_fclose_ FILE *f = NULL;
-        _cleanup_ordered_set_free_ OrderedSet *dns = NULL, *domains = NULL;
-        DnsSearchDomain *d;
-        DnsServer *s;
-        Iterator i;
-        Link *l;
         int r;
 
         assert(m);
@@ -236,62 +234,15 @@ int manager_write_resolv_conf(Manager *m) {
         manager_read_resolv_conf(m);
 
         /* Add the full list to a set, to filter out duplicates */
-        dns = ordered_set_new(&dns_server_hash_ops);
-        if (!dns)
-                return -ENOMEM;
-
-        domains = ordered_set_new(&dns_name_hash_ops);
-        if (!domains)
-                return -ENOMEM;
-
-        /* First add the system-wide servers and domains */
-        LIST_FOREACH(servers, s, m->dns_servers) {
-                r = ordered_set_put(dns, s);
-                if (r == -EEXIST)
-                        continue;
-                if (r < 0)
-                        return r;
-        }
-
-        LIST_FOREACH(domains, d, m->search_domains) {
-                r = ordered_set_put(domains, d->name);
-                if (r == -EEXIST)
-                        continue;
-                if (r < 0)
-                        return r;
-        }
-
-        /* Then, add the per-link servers and domains */
-        HASHMAP_FOREACH(l, m->links, i) {
-                LIST_FOREACH(servers, s, l->dns_servers) {
-                        r = ordered_set_put(dns, s);
-                        if (r == -EEXIST)
-                                continue;
-                        if (r < 0)
-                                return r;
-                }
-
-                LIST_FOREACH(domains, d, l->search_domains) {
-                        r = ordered_set_put(domains, d->name);
-                        if (r == -EEXIST)
-                                continue;
-                        if (r < 0)
-                                return r;
-                }
-        }
+        r = manager_compile_dns_servers(m, &dns);
+        if (r < 0)
+                return r;
 
-        /* If we found nothing, add the fallback servers */
-        if (ordered_set_isempty(dns)) {
-                LIST_FOREACH(servers, s, m->fallback_dns_servers) {
-                        r = ordered_set_put(dns, s);
-                        if (r == -EEXIST)
-                                continue;
-                        if (r < 0)
-                                return r;
-                }
-        }
+        r = manager_compile_search_domains(m, &domains);
+        if (r < 0)
+                return r;
 
-        r = fopen_temporary_label(path, path, &f, &temp_path);
+        r = fopen_temporary_label(PRIVATE_RESOLV_CONF, PRIVATE_RESOLV_CONF, &f, &temp_path);
         if (r < 0)
                 return r;
 
@@ -301,7 +252,7 @@ int manager_write_resolv_conf(Manager *m) {
         if (r < 0)
                 goto fail;
 
-        if (rename(temp_path, path) < 0) {
+        if (rename(temp_path, PRIVATE_RESOLV_CONF) < 0) {
                 r = -errno;
                 goto fail;
         }
@@ -309,7 +260,7 @@ int manager_write_resolv_conf(Manager *m) {
         return 0;
 
 fail:
-        (void) unlink(path);
+        (void) unlink(PRIVATE_RESOLV_CONF);
         (void) unlink(temp_path);
         return r;
 }