chiark / gitweb /
networkd: network - store DNS servers in List rather than Set
authorTom Gundersen <teg@jklm.no>
Fri, 16 May 2014 17:43:12 +0000 (19:43 +0200)
committerTom Gundersen <teg@jklm.no>
Fri, 16 May 2014 17:48:25 +0000 (19:48 +0200)
This way we preserve the order of preference.

src/network/networkd-address.c
src/network/networkd-manager.c
src/network/networkd-network.c
src/network/networkd.h

index e6e3f8f..6977fe7 100644 (file)
@@ -313,7 +313,8 @@ int config_parse_dns(const char *unit,
                 const char *rvalue,
                 void *data,
                 void *userdata) {
-        Set **dns = data;
+        Network *network = userdata;
+        Address *tail;
         _cleanup_address_free_ Address *n = NULL;
         int r;
 
@@ -321,7 +322,7 @@ int config_parse_dns(const char *unit,
         assert(section);
         assert(lvalue);
         assert(rvalue);
-        assert(data);
+        assert(network);
 
         r = address_new_dynamic(&n);
         if (r < 0)
@@ -334,7 +335,8 @@ int config_parse_dns(const char *unit,
                 return 0;
         }
 
-        set_put(*dns, n);
+        LIST_FIND_TAIL(addresses, network->dns, tail);
+        LIST_INSERT_AFTER(addresses, network->dns, tail, n);
         n = NULL;
 
         return 0;
index 1b14e9d..013b1dc 100644 (file)
@@ -525,9 +525,8 @@ int manager_update_resolv_conf(Manager *m) {
         HASHMAP_FOREACH(link, m->links, i) {
                 if (link->network && link->network->dns) {
                         Address *address;
-                        Iterator j;
 
-                        SET_FOREACH(address, link->network->dns, j) {
+                        LIST_FOREACH(addresses, address, link->network->dns) {
                                 append_dns(f, &address->in_addr.in,
                                            address->family, &count);
                         }
index 2a68d3e..12107c9 100644 (file)
@@ -77,10 +77,6 @@ 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();
@@ -164,10 +160,10 @@ void network_free(Network *network) {
 
         free(network->description);
 
-        SET_FOREACH(address, network->dns, i)
+        while ((address = network->dns)) {
+                LIST_REMOVE(addresses, network->dns, address);
                 address_free(address);
-
-        set_free(network->dns);
+        }
 
         netdev_unref(network->bridge);
 
index 3b29842..ebb3075 100644 (file)
@@ -150,7 +150,7 @@ struct Network {
         Hashmap *addresses_by_section;
         Hashmap *routes_by_section;
 
-        Set *dns;
+        LIST_HEAD(Address, dns);
 
         LIST_FIELDS(Network, networks);
 };