[systemd-commits] 3 commits - src/libsystemd-network src/network src/resolve src/systemd

Tom Gundersen tomegun at kemper.freedesktop.org
Wed Jul 23 14:55:22 PDT 2014


 src/libsystemd-network/network-internal.c |    7 -
 src/libsystemd-network/network-internal.h |    2 
 src/libsystemd-network/sd-dhcp-lease.c    |    8 +
 src/network/networkd-address.c            |   49 ----------
 src/network/networkd-link.c               |   72 +++++++++------
 src/network/networkd-network-gperf.gperf  |    4 
 src/network/networkd-network.c            |   11 --
 src/network/networkd.h                    |    7 -
 src/network/sd-network.c                  |   67 +++-----------
 src/resolve/resolved-dns-server.c         |   25 +----
 src/resolve/resolved-dns-server.h         |    2 
 src/resolve/resolved-link.c               |  143 +++++-------------------------
 src/resolve/resolved-link.h               |    5 -
 src/resolve/resolved-manager.c            |   12 --
 src/systemd/sd-network.h                  |   16 +--
 15 files changed, 119 insertions(+), 311 deletions(-)

New commits:
commit 6f4dedb250f2d607eceefaa491f338becbeee7c0
Author: Tom Gundersen <teg at jklm.no>
Date:   Wed Jul 23 23:03:50 2014 +0200

    sd-network: expose DNS/NTP servers as strings
    
    This avoids having to distinguish between IPv4 and IPv6, allowing us
    to keep their internal orderings. The consumers now has to turn the
    strings into addresses.

diff --git a/src/network/sd-network.c b/src/network/sd-network.c
index 91d6275..bfb8321 100644
--- a/src/network/sd-network.c
+++ b/src/network/sd-network.c
@@ -134,12 +134,13 @@ _public_ int sd_network_get_dhcp_lease(int ifindex, sd_dhcp_lease **ret) {
         return 0;
 }
 
-static int network_get_in_addr(const char *key, int ifindex, struct in_addr **addr) {
+static int network_get_strv(const char *key, int ifindex, char ***ret) {
         _cleanup_free_ char *p = NULL, *s = NULL;
+        _cleanup_strv_free_ char **a = NULL;
         int r;
 
         assert_return(ifindex > 0, -EINVAL);
-        assert_return(addr, -EINVAL);
+        assert_return(ret, -EINVAL);
 
         if (asprintf(&p, "/run/systemd/netif/links/%d", ifindex) < 0)
                 return -ENOMEM;
@@ -147,63 +148,31 @@ static int network_get_in_addr(const char *key, int ifindex, struct in_addr **ad
         r = parse_env_file(p, NEWLINE, key, &s, NULL);
         if (r < 0)
                 return r;
-        else if (!s)
-                return -EIO;
-
-        return deserialize_in_addrs(addr, s);
-}
+        else if (!s) {
+                *ret = NULL;
 
-_public_ int sd_network_get_dns(int ifindex, struct in_addr **addr) {
-        return network_get_in_addr("DNS", ifindex, addr);
-}
-
-static int network_get_in6_addr(const char *key, int ifindex, struct in6_addr **addr) {
-        _cleanup_free_ char *p = NULL, *s = NULL;
-        int r;
-
-        assert_return(ifindex > 0, -EINVAL);
-        assert_return(addr, -EINVAL);
+                return 0;
+        }
 
-        if (asprintf(&p, "/run/systemd/netif/links/%d", ifindex) < 0)
+        a = strv_split(s, " ");
+        if (!a)
                 return -ENOMEM;
 
-        r = parse_env_file(p, NEWLINE, key, &s, NULL);
-        if (r < 0)
-                return r;
-        else if (!s)
-                return -EIO;
-
-        return deserialize_in6_addrs(addr, s);
-}
-
-_public_ int sd_network_get_dns6(int ifindex, struct in6_addr **addr) {
-        return network_get_in6_addr("DNS", ifindex, addr);
-}
+        strv_uniq(a);
+        r = strv_length(a);
 
-static int network_get_boolean(const char *key, int ifindex) {
-        _cleanup_free_ char *p = NULL, *s = NULL;
-        int r;
-
-        assert_return(ifindex > 0, -EINVAL);
-
-        if (asprintf(&p, "/run/systemd/netif/links/%d", ifindex) < 0)
-                return -ENOMEM;
-
-        r = parse_env_file(p, NEWLINE, key, &s, NULL);
-        if (r < 0)
-                return r;
-        else if (!s)
-                return false;
+        *ret = a;
+        a = NULL;
 
-        return parse_boolean(s);
+        return r;
 }
 
-_public_ int sd_network_dhcp_use_dns(int ifindex) {
-        return network_get_boolean("DHCP_USE_DNS", ifindex);
+_public_ int sd_network_get_dns(int ifindex, char ***ret) {
+        return network_get_strv("DNS", ifindex, ret);
 }
 
-_public_ int sd_network_dhcp_use_ntp(int ifindex) {
-        return network_get_boolean("DHCP_USE_NTP", ifindex);
+_public_ int sd_network_get_ntp(int ifindex, char ***ret) {
+        return network_get_strv("NTP", ifindex, ret);
 }
 
 static inline int MONITOR_TO_FD(sd_network_monitor *m) {
diff --git a/src/resolve/resolved-link.c b/src/resolve/resolved-link.c
index 16f41a2..3c6c757 100644
--- a/src/resolve/resolved-link.c
+++ b/src/resolve/resolved-link.c
@@ -133,49 +133,33 @@ int link_update_rtnl(Link *l, sd_rtnl_message *m) {
 }
 
 static int link_update_dns_servers(Link *l) {
-        _cleanup_free_ struct in_addr *nameservers = NULL;
-        _cleanup_free_ struct in6_addr *nameservers6 = NULL;
+        _cleanup_strv_free_ char **nameservers = NULL;
+        char **nameserver;
         DnsServer *s, *nx;
-        int r, n, i;
+        int r;
 
         assert(l);
 
         LIST_FOREACH(servers, s, l->dns_servers)
                 s->marked = true;
 
-        n = sd_network_get_dns(l->ifindex, &nameservers);
-        if (n < 0) {
-                r = n;
+        r = sd_network_get_dns(l->ifindex, &nameservers);
+        if (r < 0)
                 goto clear;
-        }
-
-        for (i = 0; i < n; i++) {
-                union in_addr_union a = { .in = nameservers[i] };
-
-                s = link_find_dns_server(l, AF_INET, &a);
-                if (s)
-                        s->marked = false;
-                else {
-                        r = dns_server_new(l->manager, NULL, l, AF_INET, &a);
-                        if (r < 0)
-                                goto clear;
-                }
-        }
 
-        n = sd_network_get_dns6(l->ifindex, &nameservers6);
-        if (n < 0) {
-                r = n;
-                goto clear;
-        }
+        STRV_FOREACH(nameserver, nameservers) {
+                union in_addr_union a;
+                int family;
 
-        for (i = 0; i < n; i++) {
-                union in_addr_union a = { .in6 = nameservers6[i] };
+                r = in_addr_from_string_auto(*nameserver, &family, &a);
+                if (r < 0)
+                        goto clear;
 
-                s = link_find_dns_server(l, AF_INET6, &a);
+                s = link_find_dns_server(l, family, &a);
                 if (s)
                         s->marked = false;
                 else {
-                        r = dns_server_new(l->manager, NULL, l, AF_INET6, &a);
+                        r = dns_server_new(l->manager, NULL, l, family, &a);
                         if (r < 0)
                                 goto clear;
                 }
diff --git a/src/systemd/sd-network.h b/src/systemd/sd-network.h
index e454705..ec01e07 100644
--- a/src/systemd/sd-network.h
+++ b/src/systemd/sd-network.h
@@ -76,17 +76,13 @@ int sd_network_get_operational_state(char **state);
 /* Get DHCPv4 lease from ifindex. */
 int sd_network_get_dhcp_lease(int ifindex, sd_dhcp_lease **ret);
 
-/* Returns true if link is configured to respect DNS entries received by DHCP */
-int sd_network_dhcp_use_dns(int ifindex);
+/* Get DNS entries for a given link. These are string representations of
+ * IP addresses */
+int sd_network_get_dns(int ifindex, char ***addr);
 
-/* Returns true if link is configured to respect NTP entries received by DHCP */
-int sd_network_dhcp_use_ntp(int ifindex);
-
-/* Get IPv4 DNS entries statically configured for the link */
-int sd_network_get_dns(int ifindex, struct in_addr **addr);
-
-/* Get IPv6 DNS entries statically configured for the link */
-int sd_network_get_dns6(int ifindex, struct in6_addr **addr);
+/* Get NTP entries for a given link. These are domain names or string
+ * reperesentations of IP addresses */
+int sd_network_get_ntp(int ifindex, char ***addr);
 
 /* Monitor object */
 typedef struct sd_network_monitor sd_network_monitor;

commit 6073b6f26ab9fc6bf335faa7073ec443eef093fd
Author: Tom Gundersen <teg at jklm.no>
Date:   Wed Jul 23 23:10:00 2014 +0200

    resolved: don't read DHCP leases
    
    networkd will expose both statically configured DNS servers and servers
    receieved over DHCP in sd_network_get_dns(), so no need to keep
    the distinction in resolved.

diff --git a/src/resolve/resolved-dns-server.c b/src/resolve/resolved-dns-server.c
index 734441b..f33cf5d 100644
--- a/src/resolve/resolved-dns-server.c
+++ b/src/resolve/resolved-dns-server.c
@@ -24,7 +24,6 @@
 int dns_server_new(
                 Manager *m,
                 DnsServer **ret,
-                DnsServerSource source,
                 Link *l,
                 int family,
                 const union in_addr_union *in_addr) {
@@ -33,30 +32,23 @@ int dns_server_new(
 
         assert(m);
         assert(in_addr);
-        assert(source < _DNS_SERVER_SOURCE_MAX);
 
         s = new0(DnsServer, 1);
         if (!s)
                 return -ENOMEM;
 
-        s->source = source;
         s->family = family;
         s->address = *in_addr;
 
-        if (source == DNS_SERVER_LINK) {
-                assert(l);
-                LIST_FIND_TAIL(servers, l->link_dns_servers, tail);
-                LIST_INSERT_AFTER(servers, l->link_dns_servers, tail, s);
-                s->link = l;
-        } else if (source == DNS_SERVER_DHCP) {
-                assert(l);
-                LIST_FIND_TAIL(servers, l->dhcp_dns_servers, tail);
-                LIST_INSERT_AFTER(servers, l->dhcp_dns_servers, tail, s);
+        if (l) {
+                LIST_FIND_TAIL(servers, l->dns_servers, tail);
+                LIST_INSERT_AFTER(servers, l->dns_servers, tail, s);
                 s->link = l;
+                s->source = DNS_SERVER_LINK;
         } else {
-                assert(!l);
                 LIST_FIND_TAIL(servers, m->dns_servers, tail);
                 LIST_INSERT_AFTER(servers, m->dns_servers, tail, s);
+                s->source = DNS_SERVER_SYSTEM;
         }
 
         s->manager = m;
@@ -74,12 +66,7 @@ DnsServer* dns_server_free(DnsServer *s)  {
         if (s->source == DNS_SERVER_LINK) {
 
                 if (s->link)
-                        LIST_REMOVE(servers, s->link->link_dns_servers, s);
-        } else if (s->source == DNS_SERVER_DHCP) {
-
-                if (s->link)
-                        LIST_REMOVE(servers, s->link->dhcp_dns_servers, s);
-
+                        LIST_REMOVE(servers, s->link->dns_servers, s);
         } else if (s->source == DNS_SERVER_SYSTEM) {
 
                 if (s->manager)
diff --git a/src/resolve/resolved-dns-server.h b/src/resolve/resolved-dns-server.h
index 2b0b996..45a7c4f 100644
--- a/src/resolve/resolved-dns-server.h
+++ b/src/resolve/resolved-dns-server.h
@@ -33,7 +33,6 @@ typedef enum DnsServerSource DnsServerSource;
 enum DnsServerSource {
         DNS_SERVER_SYSTEM,
         DNS_SERVER_LINK,
-        DNS_SERVER_DHCP,
         _DNS_SERVER_SOURCE_MAX
 };
 
@@ -54,7 +53,6 @@ struct DnsServer {
 int dns_server_new(
                 Manager *m,
                 DnsServer **s,
-                DnsServerSource source,
                 Link *l,
                 int family,
                 const union in_addr_union *address);
diff --git a/src/resolve/resolved-link.c b/src/resolve/resolved-link.c
index 43f60d8..16f41a2 100644
--- a/src/resolve/resolved-link.c
+++ b/src/resolve/resolved-link.c
@@ -22,7 +22,6 @@
 #include <net/if.h>
 
 #include "sd-network.h"
-#include "dhcp-lease-internal.h"
 #include "strv.h"
 #include "resolved-link.h"
 
@@ -71,11 +70,8 @@ Link *link_free(Link *l) {
         dns_scope_free(l->llmnr_ipv4_scope);
         dns_scope_free(l->llmnr_ipv6_scope);
 
-        while (l->dhcp_dns_servers)
-                dns_server_free(l->dhcp_dns_servers);
-
-        while (l->link_dns_servers)
-                dns_server_free(l->link_dns_servers);
+        while (l->dns_servers)
+                dns_server_free(l->dns_servers);
 
         free(l);
         return NULL;
@@ -86,7 +82,7 @@ static void link_allocate_scopes(Link *l) {
 
         assert(l);
 
-        if (l->link_dns_servers || l->dhcp_dns_servers) {
+        if (l->dns_servers) {
                 if (!l->unicast_scope) {
                         r = dns_scope_new(l->manager, &l->unicast_scope, l, DNS_PROTOCOL_DNS, AF_UNSPEC);
                         if (r < 0)
@@ -136,7 +132,7 @@ int link_update_rtnl(Link *l, sd_rtnl_message *m) {
         return 0;
 }
 
-static int link_update_link_dns_servers(Link *l) {
+static int link_update_dns_servers(Link *l) {
         _cleanup_free_ struct in_addr *nameservers = NULL;
         _cleanup_free_ struct in6_addr *nameservers6 = NULL;
         DnsServer *s, *nx;
@@ -144,7 +140,7 @@ static int link_update_link_dns_servers(Link *l) {
 
         assert(l);
 
-        LIST_FOREACH(servers, s, l->link_dns_servers)
+        LIST_FOREACH(servers, s, l->dns_servers)
                 s->marked = true;
 
         n = sd_network_get_dns(l->ifindex, &nameservers);
@@ -156,11 +152,11 @@ static int link_update_link_dns_servers(Link *l) {
         for (i = 0; i < n; i++) {
                 union in_addr_union a = { .in = nameservers[i] };
 
-                s = link_find_dns_server(l, DNS_SERVER_LINK, AF_INET, &a);
+                s = link_find_dns_server(l, AF_INET, &a);
                 if (s)
                         s->marked = false;
                 else {
-                        r = dns_server_new(l->manager, NULL, DNS_SERVER_LINK, l, AF_INET, &a);
+                        r = dns_server_new(l->manager, NULL, l, AF_INET, &a);
                         if (r < 0)
                                 goto clear;
                 }
@@ -175,25 +171,25 @@ static int link_update_link_dns_servers(Link *l) {
         for (i = 0; i < n; i++) {
                 union in_addr_union a = { .in6 = nameservers6[i] };
 
-                s = link_find_dns_server(l, DNS_SERVER_LINK, AF_INET6, &a);
+                s = link_find_dns_server(l, AF_INET6, &a);
                 if (s)
                         s->marked = false;
                 else {
-                        r = dns_server_new(l->manager, NULL, DNS_SERVER_LINK, l, AF_INET6, &a);
+                        r = dns_server_new(l->manager, NULL, l, AF_INET6, &a);
                         if (r < 0)
                                 goto clear;
                 }
         }
 
-        LIST_FOREACH_SAFE(servers, s, nx, l->link_dns_servers)
+        LIST_FOREACH_SAFE(servers, s, nx, l->dns_servers)
                 if (s->marked)
                         dns_server_free(s);
 
         return 0;
 
 clear:
-        while (l->link_dns_servers)
-                dns_server_free(l->link_dns_servers);
+        while (l->dns_servers)
+                dns_server_free(l->dns_servers);
 
         return r;
 }
@@ -201,7 +197,7 @@ clear:
 int link_update_monitor(Link *l) {
         assert(l);
 
-        link_update_link_dns_servers(l);
+        link_update_dns_servers(l);
         link_allocate_scopes(l);
 
         return 0;
@@ -242,14 +238,12 @@ LinkAddress *link_find_address(Link *l, int family, union in_addr_union *in_addr
         return NULL;
 }
 
-DnsServer* link_find_dns_server(Link *l, DnsServerSource source, int family, union in_addr_union *in_addr) {
-        DnsServer *first, *s;
+DnsServer* link_find_dns_server(Link *l, int family, union in_addr_union *in_addr) {
+        DnsServer *s;
 
         assert(l);
 
-        first = source == DNS_SERVER_DHCP ? l->dhcp_dns_servers : l->link_dns_servers;
-
-        LIST_FOREACH(servers, s, first)
+        LIST_FOREACH(servers, s, l->dns_servers)
                 if (s->family == family && in_addr_equal(family, &s->address, in_addr))
                         return s;
 
@@ -260,9 +254,7 @@ DnsServer *link_get_dns_server(Link *l) {
         assert(l);
 
         if (!l->current_dns_server)
-                l->current_dns_server = l->link_dns_servers;
-        if (!l->current_dns_server)
-                l->current_dns_server = l->dhcp_dns_servers;
+                l->current_dns_server = l->dns_servers;
 
         return l->current_dns_server;
 }
@@ -273,13 +265,7 @@ void link_next_dns_server(Link *l) {
         /* Switch to the next DNS server */
 
         if (!l->current_dns_server) {
-                l->current_dns_server = l->link_dns_servers;
-                if (l->current_dns_server)
-                        return;
-        }
-
-        if (!l->current_dns_server) {
-                l->current_dns_server = l->dhcp_dns_servers;
+                l->current_dns_server = l->dns_servers;
                 if (l->current_dns_server)
                         return;
         }
@@ -292,12 +278,7 @@ void link_next_dns_server(Link *l) {
                 return;
         }
 
-        if (l->current_dns_server->source == DNS_SERVER_LINK)
-                l->current_dns_server = l->dhcp_dns_servers;
-        else {
-                assert(l->current_dns_server->source == DNS_SERVER_DHCP);
-                l->current_dns_server = l->link_dns_servers;
-        }
+        l->current_dns_server = l->dns_servers;
 }
 
 int link_address_new(Link *l, LinkAddress **ret, int family, union in_addr_union *in_addr) {
diff --git a/src/resolve/resolved-link.h b/src/resolve/resolved-link.h
index bd32a70..cef0400 100644
--- a/src/resolve/resolved-link.h
+++ b/src/resolve/resolved-link.h
@@ -52,8 +52,7 @@ struct Link {
 
         LIST_HEAD(LinkAddress, addresses);
 
-        LIST_HEAD(DnsServer, link_dns_servers);
-        LIST_HEAD(DnsServer, dhcp_dns_servers);
+        LIST_HEAD(DnsServer, dns_servers);
         DnsServer *current_dns_server;
 
         DnsScope *unicast_scope;
@@ -74,7 +73,7 @@ int link_update_monitor(Link *l);
 bool link_relevant(Link *l, int family);
 LinkAddress* link_find_address(Link *l, int family, union in_addr_union *in_addr);
 
-DnsServer* link_find_dns_server(Link *l, DnsServerSource source, int family, union in_addr_union *in_addr);
+DnsServer* link_find_dns_server(Link *l, int family, union in_addr_union *in_addr);
 DnsServer* link_get_dns_server(Link *l);
 void link_next_dns_server(Link *l);
 
diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c
index 19ea678..f4fa197 100644
--- a/src/resolve/resolved-manager.c
+++ b/src/resolve/resolved-manager.c
@@ -29,8 +29,6 @@
 #include "rtnl-util.h"
 #include "event-util.h"
 #include "network-util.h"
-#include "sd-dhcp-lease.h"
-#include "dhcp-lease-internal.h"
 #include "network-internal.h"
 #include "conf-parser.h"
 #include "socket-util.h"
@@ -326,7 +324,7 @@ static int parse_dns_server_string(Manager *m, const char *string) {
                 if (manager_find_dns_server(m, family, &addr))
                         continue;
 
-                r = dns_server_new(m, NULL, DNS_SERVER_SYSTEM, NULL, family, &addr);
+                r = dns_server_new(m, NULL, NULL, family, &addr);
                 if (r < 0)
                         return r;
         }
@@ -517,13 +515,9 @@ int manager_write_resolv_conf(Manager *m) {
               "# resolv.conf(5) in a different way, replace the symlink by a\n"
               "# static file or a different symlink.\n\n", f);
 
-        HASHMAP_FOREACH(l, m->links, i) {
-                LIST_FOREACH(servers, s, l->link_dns_servers)
-                        write_resolve_conf_server(s, f, &count);
-
-                LIST_FOREACH(servers, s, l->dhcp_dns_servers)
+        HASHMAP_FOREACH(l, m->links, i)
+                LIST_FOREACH(servers, s, l->dns_servers)
                         write_resolve_conf_server(s, f, &count);
-        }
 
         LIST_FOREACH(servers, s, m->dns_servers)
                 write_resolve_conf_server(s, f, &count);

commit b0e39c8284b5195850a58e4efcce2f059bdcc6ad
Author: Tom Gundersen <teg at jklm.no>
Date:   Wed Jul 23 13:48:18 2014 +0200

    networkd: merge DNS and NTP entries when exporting
    
    In the state files, do not distinguish where the various entries came from
    (static or DHCP), but include them all in the same list.

diff --git a/src/libsystemd-network/network-internal.c b/src/libsystemd-network/network-internal.c
index 3407537..603ee6d 100644
--- a/src/libsystemd-network/network-internal.c
+++ b/src/libsystemd-network/network-internal.c
@@ -339,21 +339,16 @@ int net_parse_inaddr(const char *address, int *family, void *dst) {
         return 0;
 }
 
-void serialize_in_addrs(FILE *f, const char *key, const struct in_addr *addresses, size_t size) {
+void serialize_in_addrs(FILE *f, const struct in_addr *addresses, size_t size) {
         unsigned i;
 
         assert(f);
-        assert(key);
         assert(addresses);
         assert(size);
 
-        fprintf(f, "%s=", key);
-
         for (i = 0; i < size; i++)
                 fprintf(f, "%s%s", inet_ntoa(addresses[i]),
                         (i < (size - 1)) ? " ": "");
-
-        fputs("\n", f);
 }
 
 int deserialize_in_addrs(struct in_addr **ret, const char *string) {
diff --git a/src/libsystemd-network/network-internal.h b/src/libsystemd-network/network-internal.h
index 765dff4..6dd518b 100644
--- a/src/libsystemd-network/network-internal.h
+++ b/src/libsystemd-network/network-internal.h
@@ -67,7 +67,7 @@ int net_parse_inaddr(const char *address, int *family, void *dst);
 int net_get_unique_predictable_data(struct udev_device *device, uint8_t result[8]);
 const char *net_get_name(struct udev_device *device);
 
-void serialize_in_addrs(FILE *f, const char *key, const struct in_addr *addresses, size_t size);
+void serialize_in_addrs(FILE *f, const struct in_addr *addresses, size_t size);
 int deserialize_in_addrs(struct in_addr **addresses, const char *string);
 int deserialize_in6_addrs(struct in6_addr **addresses, const char *string);
 
diff --git a/src/libsystemd-network/sd-dhcp-lease.c b/src/libsystemd-network/sd-dhcp-lease.c
index 4ed30f5..bfd1b0c 100644
--- a/src/libsystemd-network/sd-dhcp-lease.c
+++ b/src/libsystemd-network/sd-dhcp-lease.c
@@ -629,13 +629,17 @@ int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) {
         if (r >= 0)
                 fprintf(f, "MTU=%" PRIu16 "\n", mtu);
 
+        fputs("DNS=", f);
         r = sd_dhcp_lease_get_dns(lease, &addresses);
         if (r >= 0)
-                serialize_in_addrs(f, "DNS", addresses, r);
+                serialize_in_addrs(f, addresses, r);
+        fputs("\n", f);
 
+        fputs("NTP=", f);
         r = sd_dhcp_lease_get_ntp(lease, &addresses);
         if (r >= 0)
-                serialize_in_addrs(f, "NTP", addresses, r);
+                serialize_in_addrs(f, addresses, r);
+        fputs("\n", f);
 
         r = sd_dhcp_lease_get_domainname(lease, &string);
         if (r >= 0)
diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c
index 8c4ef99..551c1ea 100644
--- a/src/network/networkd-address.c
+++ b/src/network/networkd-address.c
@@ -394,55 +394,6 @@ int address_configure(Address *address, Link *link,
         return 0;
 }
 
-int config_parse_dns(const char *unit,
-                const char *filename,
-                unsigned line,
-                const char *section,
-                unsigned section_line,
-                const char *lvalue,
-                int ltype,
-                const char *rvalue,
-                void *data,
-                void *userdata) {
-        Network *network = userdata;
-        Address *tail;
-        _cleanup_address_free_ Address *n = NULL;
-        int r;
-
-        assert(filename);
-        assert(section);
-        assert(lvalue);
-        assert(rvalue);
-        assert(network);
-
-        r = address_new_dynamic(&n);
-        if (r < 0)
-                return r;
-
-        r = net_parse_inaddr(rvalue, &n->family, &n->in_addr);
-        if (r < 0) {
-                log_syntax(unit, LOG_ERR, filename, line, EINVAL,
-                           "DNS address is invalid, ignoring assignment: %s", rvalue);
-                return 0;
-        }
-
-        if (streq(lvalue, "DNS")) {
-                LIST_FIND_TAIL(addresses, network->dns, tail);
-                LIST_INSERT_AFTER(addresses, network->dns, tail, n);
-        } else if (streq(lvalue, "NTP")) {
-                LIST_FIND_TAIL(addresses, network->ntp, tail);
-                LIST_INSERT_AFTER(addresses, network->ntp, tail, n);
-        } else {
-                log_syntax(unit, LOG_ERR, filename, line, EINVAL,
-                           "Key is invalid, ignoring assignment: %s=%s", lvalue, rvalue);
-                return 0;
-        }
-
-        n = NULL;
-
-        return 0;
-}
-
 int config_parse_broadcast(const char *unit,
                 const char *filename,
                 unsigned line,
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
index 86d4b83..7e6bc7b 100644
--- a/src/network/networkd-link.c
+++ b/src/network/networkd-link.c
@@ -2419,27 +2419,6 @@ int link_update(Link *link, sd_rtnl_message *m) {
         return link_update_flags(link, m);
 }
 
-static void serialize_addresses(FILE *f, const char *key, Address *address) {
-        Address *ad;
-
-        assert(f);
-        assert(key);
-
-        if (!address)
-                return;
-
-        fprintf(f, "%s=", key);
-
-        LIST_FOREACH(addresses, ad, address) {
-                char buf[INET6_ADDRSTRLEN];
-
-                if (inet_ntop(ad->family, &ad->in_addr, buf, INET6_ADDRSTRLEN))
-                        fprintf(f, "%s%s", buf, (ad->addresses_next) ? " ": "");
-        }
-
-        fputs("\n", f);
-}
-
 static void link_update_operstate(Link *link) {
 
         assert(link);
@@ -2510,8 +2489,47 @@ int link_save(Link *link) {
                 admin_state, oper_state);
 
         if (link->network) {
-                serialize_addresses(f, "DNS", link->network->dns);
-                serialize_addresses(f, "NTP", link->network->ntp);
+                char **address;
+
+                fputs("DNS=", f);
+
+                if (link->network->dhcp_dns &&
+                    link->dhcp_lease) {
+                        const struct in_addr *addresses;
+
+                        r = sd_dhcp_lease_get_dns(link->dhcp_lease, &addresses);
+                        if (r > 0) {
+                                serialize_in_addrs(f, addresses, r);
+                                if (link->network->dns)
+                                        fputs(" ", f);
+                        }
+                }
+
+                STRV_FOREACH(address, link->network->dns)
+                        fprintf(f, "%s%s", *address,
+                                (address + 1 ? " " : ""));
+
+                fputs("\n", f);
+
+                fprintf(f, "NTP=");
+
+                if (link->network->dhcp_ntp &&
+                    link->dhcp_lease) {
+                        const struct in_addr *addresses;
+
+                        r = sd_dhcp_lease_get_ntp(link->dhcp_lease, &addresses);
+                        if (r > 0) {
+                                serialize_in_addrs(f, addresses, r);
+                                if (link->network->ntp)
+                                        fputs(" ", f);
+                        }
+                }
+
+                STRV_FOREACH(address, link->network->ntp)
+                        fprintf(f, "%s%s", *address,
+                                (address + 1 ? " " : ""));
+
+                fputs("\n", f);
         }
 
         if (link->dhcp_lease) {
@@ -2522,12 +2540,8 @@ int link_save(Link *link) {
                         goto finish;
 
                 fprintf(f,
-                        "DHCP_LEASE=%s\n"
-                        "DHCP_USE_DNS=%s\n"
-                        "DHCP_USE_NTP=%s\n",
-                        link->lease_file,
-                        yes_no(link->network->dhcp_dns),
-                        yes_no(link->network->dhcp_ntp));
+                        "DHCP_LEASE=%s\n",
+                        link->lease_file);
         } else
                 unlink(link->lease_file);
 
diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf
index f5156b4..2938f8a 100644
--- a/src/network/networkd-network-gperf.gperf
+++ b/src/network/networkd-network-gperf.gperf
@@ -35,8 +35,8 @@ Network.DHCPServer,          config_parse_bool,                  0,
 Network.IPv4LL,              config_parse_bool,                  0,                             offsetof(Network, ipv4ll)
 Network.Address,             config_parse_address,               0,                             0
 Network.Gateway,             config_parse_gateway,               0,                             0
-Network.DNS,                 config_parse_dns,                   0,                             offsetof(Network, dns)
-Network.NTP,                 config_parse_dns,                   0,                             offsetof(Network, ntp)
+Network.DNS,                 config_parse_strv,                  0,                             offsetof(Network, dns)
+Network.NTP,                 config_parse_strv,                  0,                             offsetof(Network, ntp)
 Network.Tunnel,              config_parse_tunnel,                0,                             offsetof(Network, tunnel)
 Address.Address,             config_parse_address,               0,                             0
 Address.Peer,                config_parse_address,               0,                             0
diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c
index bc93042..24fc26b 100644
--- a/src/network/networkd-network.c
+++ b/src/network/networkd-network.c
@@ -169,15 +169,8 @@ void network_free(Network *network) {
         free(network->description);
         free(network->dhcp_vendor_class_identifier);
 
-        while ((address = network->ntp)) {
-                LIST_REMOVE(addresses, network->ntp, address);
-                address_free(address);
-        }
-
-        while ((address = network->dns)) {
-                LIST_REMOVE(addresses, network->dns, address);
-                address_free(address);
-        }
+        strv_free(network->ntp);
+        strv_free(network->dns);
 
         netdev_unref(network->bridge);
 
diff --git a/src/network/networkd.h b/src/network/networkd.h
index 7d291e5..bae2852 100644
--- a/src/network/networkd.h
+++ b/src/network/networkd.h
@@ -105,8 +105,7 @@ struct Network {
         Hashmap *addresses_by_section;
         Hashmap *routes_by_section;
 
-        LIST_HEAD(Address, dns);
-        LIST_HEAD(Address, ntp);
+        char **dns, **ntp;
 
         LIST_FIELDS(Network, networks);
 };
@@ -338,10 +337,6 @@ bool address_equal(Address *a1, Address *a2);
 DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
 #define _cleanup_address_free_ _cleanup_(address_freep)
 
-int config_parse_dns(const char *unit, const char *filename, unsigned line,
-                     const char *section, unsigned section_line, const char *lvalue,
-                     int ltype, const char *rvalue, void *data, void *userdata);
-
 int config_parse_address(const char *unit, const char *filename, unsigned line,
                          const char *section, unsigned section_line, const char *lvalue,
                          int ltype, const char *rvalue, void *data, void *userdata);
diff --git a/src/resolve/resolved-link.c b/src/resolve/resolved-link.c
index 078301a..43f60d8 100644
--- a/src/resolve/resolved-link.c
+++ b/src/resolve/resolved-link.c
@@ -136,57 +136,6 @@ int link_update_rtnl(Link *l, sd_rtnl_message *m) {
         return 0;
 }
 
-static int link_update_dhcp_dns_servers(Link *l) {
-        _cleanup_dhcp_lease_unref_ sd_dhcp_lease *lease = NULL;
-        const struct in_addr *nameservers = NULL;
-        DnsServer *s, *nx;
-        int r, n, i;
-
-        assert(l);
-
-        r = sd_network_dhcp_use_dns(l->ifindex);
-        if (r <= 0)
-                goto clear;
-
-        r = sd_network_get_dhcp_lease(l->ifindex, &lease);
-        if (r < 0)
-                goto clear;
-
-        LIST_FOREACH(servers, s, l->dhcp_dns_servers)
-                s->marked = true;
-
-        n = sd_dhcp_lease_get_dns(lease, &nameservers);
-        if (n < 0) {
-                r = n;
-                goto clear;
-        }
-
-        for (i = 0; i < n; i++) {
-                union in_addr_union a = { .in = nameservers[i] };
-
-                s = link_find_dns_server(l, DNS_SERVER_DHCP, AF_INET, &a);
-                if (s)
-                        s->marked = false;
-                else {
-                        r = dns_server_new(l->manager, NULL, DNS_SERVER_DHCP, l, AF_INET, &a);
-                        if (r < 0)
-                                goto clear;
-                }
-        }
-
-        LIST_FOREACH_SAFE(servers, s, nx, l->dhcp_dns_servers)
-                if (s->marked)
-                        dns_server_free(s);
-
-        return 0;
-
-clear:
-        while (l->dhcp_dns_servers)
-                dns_server_free(l->dhcp_dns_servers);
-
-        return r;
-}
-
 static int link_update_link_dns_servers(Link *l) {
         _cleanup_free_ struct in_addr *nameservers = NULL;
         _cleanup_free_ struct in6_addr *nameservers6 = NULL;
@@ -252,7 +201,6 @@ clear:
 int link_update_monitor(Link *l) {
         assert(l);
 
-        link_update_dhcp_dns_servers(l);
         link_update_link_dns_servers(l);
         link_allocate_scopes(l);
 



More information about the systemd-commits mailing list