chiark / gitweb /
networkd: add support for Domains= to .network files
authorTom Gundersen <teg@jklm.no>
Fri, 15 Aug 2014 12:21:08 +0000 (14:21 +0200)
committerTom Gundersen <teg@jklm.no>
Fri, 15 Aug 2014 13:15:24 +0000 (15:15 +0200)
This allows the search/routing domanis to be specified per link/network and be passed
on to resolved.

man/systemd.network.xml
src/network/networkd-link.c
src/network/networkd-network-gperf.gperf
src/network/networkd-network.c
src/network/networkd.h

index 290aa6efe5f910ed99417b65fb699008573750ff..024509968a964be49f45959792621835757c7994 100644 (file)
                                                 This option may be specified more than once.</para>
                                         </listitem>
                                 </varlistentry>
-<!-- TODO: document NTP= option when it is actually used somewhere -->
+                                <varlistentry>
+                                        <term><varname>Domains=</varname></term>
+                                        <listitem>
+                                                <para>The domains used for DNS resolution over this link.</para>
+                                        </listitem>
+                                </varlistentry>
+                                <varlistentry>
+                                        <term><varname>NTP=</varname></term>
+                                        <listitem>
+                                                <para>An NTP server address. This option may be specified more than once.</para>
+                                        </listitem>
+                                </varlistentry>
                                 <varlistentry>
                                         <term><varname>Bridge=</varname></term>
                                         <listitem>
index 9eb2e890918ac4e1ae546f03b45e0323a82340d9..d25343ba2ba4d87125a444132bdabed7f6d51f3b 100644 (file)
@@ -1722,6 +1722,7 @@ int link_save(Link *link) {
 
         if (link->network) {
                 char **address;
+                char **domain;
 
                 fputs("DNS=", f);
 
@@ -1763,15 +1764,26 @@ int link_save(Link *link) {
 
                 fputs("\n", f);
 
+                fprintf(f, "DOMAINS=");
+
                 if (link->network->dhcp_domains &&
                     link->dhcp_lease) {
                         const char *domainname;
 
                         r = sd_dhcp_lease_get_domainname(link->dhcp_lease, &domainname);
-                        if (r >= 0)
-                                fprintf(f, "DOMAINS=%s\n", domainname);
+                        if (r >= 0) {
+                                fputs(domainname, f);
+                                if (link->network->domains)
+                                        fputs(" ", f);
+                        }
                 }
 
+                STRV_FOREACH(domain, link->network->domains)
+                        fprintf(f, "%s%s", *domain,
+                                (domain + 1 ? " " : ""));
+
+                fputs("\n", f);
+
                 fprintf(f, "LLMNR=%s\n",
                         llmnr_support_to_string(link->network->llmnr));
         }
index 9cd7a4aa6156802ca92c118471c94b0727117465..c5b9614a2b5937848c14186f16b6aec279bbbdf2 100644 (file)
@@ -37,6 +37,7 @@ Network.IPv4LL,              config_parse_bool,                  0,
 Network.IPv4LLRoute,         config_parse_bool,                  0,                             offsetof(Network, ipv4ll_route)
 Network.Address,             config_parse_address,               0,                             0
 Network.Gateway,             config_parse_gateway,               0,                             0
+Network.Domains,             config_parse_domains,               0,                             offsetof(Network, domains)
 Network.DNS,                 config_parse_strv,                  0,                             offsetof(Network, dns)
 Network.LLMNR,               config_parse_llmnr,                 0,                             offsetof(Network, llmnr)
 Network.NTP,                 config_parse_strv,                  0,                             offsetof(Network, ntp)
index e13e4a0f620b2c585ee09e84489d99d0c4dcd1e9..bbc5d279e942035e188c1560795eb8e6b604ab4b 100644 (file)
@@ -341,6 +341,34 @@ 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) {
+        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);
+
+        STRV_FOREACH(domain, *domains)
+                if (is_localhost(*domain) || !hostname_is_valid(*domain))
+                        strv_remove(*domains, *domain);
+
+        return 0;
+}
+
 int config_parse_tunnel(const char *unit,
                         const char *filename,
                         unsigned line,
index 90e798dbf5cf1825a09cd368ed02271b8fe67997..a9867d9e7f50f0c3f2d738634a47f51416b9f641 100644 (file)
@@ -111,7 +111,7 @@ struct Network {
         Hashmap *addresses_by_section;
         Hashmap *routes_by_section;
 
-        char **dns, **ntp;
+        char **domains, **dns, **ntp;
 
         LLMNRSupport llmnr;
 
@@ -224,6 +224,17 @@ int config_parse_netdev(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_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);
+
 int config_parse_tunnel(const char *unit,
                         const char *filename,
                         unsigned line,