From 06f021a8048583d66202e3ac5cd0a12386d33ac2 Mon Sep 17 00:00:00 2001 From: Tom Gundersen Date: Thu, 13 Mar 2014 20:46:45 +0100 Subject: networkd: allow more than one static DNS server --- man/systemd.network.xml | 4 ++-- src/network/networkd-address.c | 4 ++-- src/network/networkd-manager.c | 15 +++++++++++---- src/network/networkd-network.c | 10 +++++++++- src/network/networkd.h | 4 +++- 5 files changed, 27 insertions(+), 10 deletions(-) diff --git a/man/systemd.network.xml b/man/systemd.network.xml index 4118fc9b65..7609128f3f 100644 --- a/man/systemd.network.xml +++ b/man/systemd.network.xml @@ -221,8 +221,8 @@ DNS= A DNS server address, which must be in the format described in - inet_pton3 - . + inet_pton3. + This option may be specified repeatedly. diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index c92418967b..414b3bccfa 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -225,7 +225,7 @@ int config_parse_dns(const char *unit, const char *rvalue, void *data, void *userdata) { - Address **dns = data; + Set **dns = data; _cleanup_address_free_ Address *n = NULL; int r; @@ -246,7 +246,7 @@ int config_parse_dns(const char *unit, return 0; } - *dns = n; + set_put(*dns, n); n = NULL; return 0; diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index 8c2f5efbd3..c730e7148d 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -442,10 +442,17 @@ int manager_update_resolv_conf(Manager *m) { } } - HASHMAP_FOREACH(link, m->links, i) - if (link->network && link->network->dns) - append_dns(f, &link->network->dns->in_addr.in, - link->network->dns->family, &count); + HASHMAP_FOREACH(link, m->links, i) { + if (link->network && link->network->dns) { + Address *address; + Iterator j; + + SET_FOREACH(address, link->network->dns, j) { + append_dns(f, &address->in_addr.in, + address->family, &count); + } + } + } fflush(f); diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 6437ff4230..6e9915b75d 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -69,6 +69,10 @@ static int network_load_one(Manager *manager, const char *filename) { if (!network->routes_by_section) return log_oom(); + network->dns = set_new(NULL, NULL); + if (!network->dns) + return log_oom(); + network->filename = strdup(filename); if (!network->filename) return log_oom(); @@ -136,6 +140,7 @@ int network_load(Manager *manager) { void network_free(Network *network) { Route *route; Address *address; + Iterator i; if (!network) return; @@ -150,7 +155,10 @@ void network_free(Network *network) { free(network->description); - address_free(network->dns); + SET_FOREACH(address, network->dns, i) + address_free(address); + + set_free(network->dns); hashmap_free(network->vlans); diff --git a/src/network/networkd.h b/src/network/networkd.h index 0c0171993d..311350c1e2 100644 --- a/src/network/networkd.h +++ b/src/network/networkd.h @@ -33,6 +33,7 @@ #include "rtnl-util.h" #include "hashmap.h" #include "list.h" +#include "set.h" #include "condition-util.h" typedef struct NetDev NetDev; @@ -130,11 +131,12 @@ struct Network { LIST_HEAD(Address, static_addresses); LIST_HEAD(Route, static_routes); - Address *dns; Hashmap *addresses_by_section; Hashmap *routes_by_section; + Set *dns; + LIST_FIELDS(Network, networks); }; -- cgit v1.2.3-54-g00ecf