chiark / gitweb /
sd-network: add support for wildcard domains
authorTom Gundersen <teg@jklm.no>
Fri, 15 Aug 2014 12:49:31 +0000 (14:49 +0200)
committerTom Gundersen <teg@jklm.no>
Fri, 15 Aug 2014 13:15:24 +0000 (15:15 +0200)
src/libsystemd/sd-network/sd-network.c
src/network/networkctl.c
src/network/networkd-link.c
src/network/networkd-network.c
src/network/networkd.h
src/systemd/sd-network.h

index 4d8b7e7b2c17da0db8eedb63143f47962fc914f4..e30fc3cbf4240c84976265006412b4e34f88446b 100644 (file)
@@ -210,6 +210,25 @@ _public_ int sd_network_link_get_domains(int ifindex, char ***ret) {
         return network_get_link_strv("DOMAINS", ifindex, ret);
 }
 
+_public_ int sd_network_link_get_wildcard_domain(int ifindex) {
+        int r;
+        _cleanup_free_ char *p = NULL, *s = NULL;
+
+        assert_return(ifindex > 0, -EINVAL);
+
+        if (asprintf(&p, "/run/systemd/netif/links/%d", ifindex) < 0)
+                return -ENOMEM;
+
+        r = parse_env_file(p, NEWLINE, "WILDCARD_DOMAIN", &s, NULL);
+        if (r < 0)
+                return r;
+
+        if (!s)
+                return -EIO;
+
+        return parse_boolean(s);
+}
+
 static inline int MONITOR_TO_FD(sd_network_monitor *m) {
         return (int) (unsigned long) m - 1;
 }
index 33fe8bfc6103d91de4b80bbfe52f12306804f74d..bf95aa2c90332ab21fb43a733cce1a2633d1c6ee 100644 (file)
@@ -366,6 +366,13 @@ static int link_status_one(sd_rtnl *rtnl, struct udev *udev, const char *name) {
         sd_network_link_get_dns(ifindex, &dns);
         sd_network_link_get_ntp(ifindex, &ntp);
         sd_network_link_get_domains(ifindex, &domains);
+        r = sd_network_link_get_wildcard_domain(ifindex);
+        if (r > 0) {
+                char *wildcard;
+
+                wildcard = strdup("*");
+                strv_push(&domains, wildcard);
+        }
 
         sprintf(devid, "n%i", ifindex);
         d = udev_device_new_from_device_id(udev, devid);
index d25343ba2ba4d87125a444132bdabed7f6d51f3b..76e642758d5b14e7d532e26e17cf5651b7d0f5e7 100644 (file)
@@ -1784,6 +1784,9 @@ int link_save(Link *link) {
 
                 fputs("\n", f);
 
+                fprintf(f, "WILDCARD_DOMAIN=%s\n",
+                        yes_no(link->network->wildcard_domain));
+
                 fprintf(f, "LLMNR=%s\n",
                         llmnr_support_to_string(link->network->llmnr));
         }
index bbc5d279e942035e188c1560795eb8e6b604ab4b..f3b2c68430f7792ecf4e1353a3d13a783efbfecd 100644 (file)
@@ -351,6 +351,7 @@ int config_parse_domains(const char *unit,
                          const char *rvalue,
                          void *data,
                          void *userdata) {
+        Network *network = userdata;
         char ***domains = data;
         char **domain;
         int r;
@@ -362,6 +363,11 @@ int config_parse_domains(const char *unit,
 
         strv_uniq(*domains);
 
+        if (strv_isempty(*domains))
+                network->wildcard_domain = false;
+        else if (strv_find(*domains, "*"))
+                network->wildcard_domain = true;
+
         STRV_FOREACH(domain, *domains)
                 if (is_localhost(*domain) || !hostname_is_valid(*domain))
                         strv_remove(*domains, *domain);
index a9867d9e7f50f0c3f2d738634a47f51416b9f641..c8d89d212b8fdb04cdc2873429344f53bf2fbe54 100644 (file)
@@ -111,6 +111,7 @@ struct Network {
         Hashmap *addresses_by_section;
         Hashmap *routes_by_section;
 
+        bool wildcard_domain;
         char **domains, **dns, **ntp;
 
         LLMNRSupport llmnr;
index db785077ff4ac28fc33cd135843bba2ad2a59bd9..52e398a08da6dd4891cc22c866950b9ee5c19d88 100644 (file)
@@ -107,6 +107,10 @@ int sd_network_link_get_llmnr(int ifindex, char **llmnr);
 /* Get the DNS domain names for a given link. */
 int sd_network_link_get_domains(int ifindex, char ***domains);
 
+/* Returns whether or not domains that don't match any link should be resolved
+ * on this link. 1 for yes, 0 for no and negative value for error */
+int sd_network_link_get_wildcard_domain(int ifindex);
+
 /* Monitor object */
 typedef struct sd_network_monitor sd_network_monitor;