chiark / gitweb /
networkd: link - allow loopback links to be manage, but ignore DHCP/IPv4LL
[elogind.git] / src / network / networkd-network.c
index e326b3664e7df74909ed715bf5a51cc93db240e4..fc62395217fd5032a8ae8f331514a4ae8b08c9e6 100644 (file)
@@ -79,13 +79,10 @@ static int network_load_one(Manager *manager, const char *filename) {
         if (!network->filename)
                 return log_oom();
 
-        network->ipv4ll_route = true;
-
         network->dhcp = DHCP_SUPPORT_NONE;
         network->dhcp_ntp = true;
         network->dhcp_dns = true;
         network->dhcp_hostname = true;
-        network->dhcp_domainname = true;
         network->dhcp_routes = true;
         network->dhcp_sendhost = true;
 
@@ -169,13 +166,16 @@ void network_free(Network *network) {
 
         strv_free(network->ntp);
         strv_free(network->dns);
+        strv_free(network->domains);
 
         netdev_unref(network->bridge);
 
         netdev_unref(network->bond);
 
-        HASHMAP_FOREACH(netdev, network->stacked_netdevs, i)
+        HASHMAP_FOREACH(netdev, network->stacked_netdevs, i) {
+                hashmap_remove(network->stacked_netdevs, netdev->ifname);
                 netdev_unref(netdev);
+        }
         hashmap_free(network->stacked_netdevs);
 
         while ((route = network->static_routes))
@@ -344,6 +344,47 @@ int config_parse_netdev(const char *unit,
         return 0;
 }
 
+int config_parse_domains(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;
+        char ***domains = data;
+        char **domain;
+        int r;
+
+        r = config_parse_strv(unit, filename, line, section, section_line,
+                              lvalue, ltype, rvalue, domains, userdata);
+        if (r < 0)
+                return r;
+
+        strv_uniq(*domains);
+        network->wildcard_domain = !!strv_find(*domains, "*");
+
+        STRV_FOREACH(domain, *domains) {
+                if (is_localhost(*domain))
+                        log_syntax(unit, LOG_ERR, filename, line, EINVAL, "'localhost' domain names may not be configured, ignoring assignment: %s", *domain);
+                else if (!hostname_is_valid(*domain)) {
+                        if (!streq(*domain, "*"))
+                                log_syntax(unit, LOG_ERR, filename, line, EINVAL, "domain name is not valid, ignoring assignment: %s", *domain);
+                } else
+                        continue;
+
+                strv_remove(*domains, *domain);
+
+                /* We removed one entry, make sure we don't skip the next one */
+                domain--;
+        }
+
+        return 0;
+}
+
 int config_parse_tunnel(const char *unit,
                         const char *filename,
                         unsigned line,