]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
dns-domain: simplify dns_name_is_root() and dns_name_is_single_label()
authorLennart Poettering <lennart@poettering.net>
Wed, 25 Nov 2015 20:07:17 +0000 (21:07 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 25 Nov 2015 21:00:07 +0000 (22:00 +0100)
Let's change the return value to bool. If we encounter an error while
parsing, return "false" instead of the actual parsing error, after all
the specified hostname does not qualify for what the function is
supposed to test.

Dealing with the additional error codes was always cumbersome, and
easily misused, like for example in the DHCP code.

Let's also rename the functions from dns_name_root() to
dns_name_is_root(), to indicate that this function checks something and
returns a bool. Similar for dns_name_is_signal_label().

src/libsystemd-network/sd-dhcp-client.c
src/resolve/resolved-dns-rr.c
src/resolve/resolved-dns-scope.c
src/resolve/resolved-dns-scope.h
src/resolve/resolved-dns-search-domain.c
src/shared/dns-domain.c
src/shared/dns-domain.h
src/test/test-dns-domain.c

index 5ec0e661f74baee0b337ba0c2ca4f8b4f52e05bd..f689c59a1afd55c86f74cf216c6be6d3c582402e 100644 (file)
@@ -604,7 +604,7 @@ static int client_send_discover(sd_dhcp_client *client) {
                    their messages MUST NOT also send the Host Name option". Just send
                    one of the two depending on the hostname type.
                 */
-                if (dns_name_single_label(client->hostname)) {
+                if (dns_name_is_single_label(client->hostname)) {
                         /* it is unclear from RFC 2131 if client should send hostname in
                            DHCPDISCOVER but dhclient does and so we do as well
                         */
@@ -719,7 +719,7 @@ static int client_send_request(sd_dhcp_client *client) {
         }
 
         if (client->hostname) {
-                if (dns_name_single_label(client->hostname))
+                if (dns_name_is_single_label(client->hostname))
                         r = dhcp_option_append(&request->dhcp, optlen, &optoffset, 0,
                                                DHCP_OPTION_HOST_NAME,
                                                strlen(client->hostname), client->hostname);
index 4f896b05afa93719a249c6c13834e02999afbd1f..4a1abb0cdca477b8365ee8ac5868588eccb18b3d 100644 (file)
@@ -95,10 +95,7 @@ int dns_resource_key_new_append_suffix(DnsResourceKey **ret, DnsResourceKey *key
         assert(key);
         assert(name);
 
-        r = dns_name_root(name);
-        if (r < 0)
-                return r;
-        if (r > 0) {
+        if (dns_name_is_root(name)) {
                 *ret = dns_resource_key_ref(key);
                 return 0;
         }
index daeab9b9eeda577abfce2a4f54cccaf61d17b40c..20db1fbd81d7174ec1130125314381f07c8454d8 100644 (file)
@@ -342,7 +342,7 @@ DnsScopeMatch dns_scope_good_domain(DnsScope *s, int ifindex, uint64_t flags, co
         if ((SD_RESOLVED_FLAGS_MAKE(s->protocol, s->family) & flags) == 0)
                 return DNS_SCOPE_NO;
 
-        if (dns_name_root(domain) != 0)
+        if (dns_name_is_root(domain))
                 return DNS_SCOPE_NO;
 
         /* Never resolve any loopback hostname or IP address via DNS,
@@ -362,19 +362,16 @@ DnsScopeMatch dns_scope_good_domain(DnsScope *s, int ifindex, uint64_t flags, co
                         return DNS_SCOPE_YES;
 
         switch (s->protocol) {
-        case DNS_PROTOCOL_DNS: {
-                int is_single_label;
 
-                is_single_label = dns_name_single_label(domain);
+        case DNS_PROTOCOL_DNS:
 
-                if ((is_single_label == 0 ||
-                     (is_single_label > 0 && !(flags & SD_RESOLVED_NO_SEARCH) && dns_scope_has_search_domains(s))) &&
+                if ((!dns_name_is_single_label(domain) ||
+                     (!(flags & SD_RESOLVED_NO_SEARCH) && dns_scope_has_search_domains(s))) &&
                     dns_name_endswith(domain, "254.169.in-addr.arpa") == 0 &&
                     dns_name_endswith(domain, "0.8.e.f.ip6.arpa") == 0)
                         return DNS_SCOPE_MAYBE;
 
                 return DNS_SCOPE_NO;
-        }
 
         case DNS_PROTOCOL_MDNS:
                 if ((s->family == AF_INET && dns_name_endswith(domain, "in-addr.arpa") > 0) ||
@@ -389,7 +386,7 @@ DnsScopeMatch dns_scope_good_domain(DnsScope *s, int ifindex, uint64_t flags, co
         case DNS_PROTOCOL_LLMNR:
                 if ((s->family == AF_INET && dns_name_endswith(domain, "in-addr.arpa") > 0) ||
                     (s->family == AF_INET6 && dns_name_endswith(domain, "ip6.arpa") > 0) ||
-                    (dns_name_single_label(domain) > 0 && /* only resolve single label names via LLMNR */
+                    (dns_name_is_single_label(domain) && /* only resolve single label names via LLMNR */
                      !is_gateway_hostname(domain) && /* don't resolve "gateway" with LLMNR, let nss-myhostname handle this */
                      manager_is_own_hostname(s->manager, domain) <= 0))  /* never resolve the local hostname via LLMNR */
                         return DNS_SCOPE_MAYBE;
@@ -902,11 +899,11 @@ bool dns_scope_has_search_domains(DnsScope *s) {
         return false;
 }
 
-int dns_scope_name_needs_search_domain(DnsScope *s, const char *name) {
+bool dns_scope_name_needs_search_domain(DnsScope *s, const char *name) {
         assert(s);
 
         if (s->protocol != DNS_PROTOCOL_DNS)
-                return 0;
+                return false;
 
-        return dns_name_single_label(name);
+        return dns_name_is_single_label(name);
 }
index 244bb4131457289e712b0ecdc92617d8077a596b..32e6961757808e6fbbc4075ae895f193229a02b4 100644 (file)
@@ -94,4 +94,4 @@ void dns_scope_dump(DnsScope *s, FILE *f);
 DnsSearchDomain *dns_scope_get_search_domains(DnsScope *s);
 bool dns_scope_has_search_domains(DnsScope *s);
 
-int dns_scope_name_needs_search_domain(DnsScope *s, const char *name);
+bool dns_scope_name_needs_search_domain(DnsScope *s, const char *name);
index d8a0648aab649b74c9796d2abc79033c024e06c3..f9d966abb1ba6308f497567c6d96458a44c51d25 100644 (file)
@@ -42,10 +42,7 @@ int dns_search_domain_new(
         if (r < 0)
                 return r;
 
-        r = dns_name_root(normalized);
-        if (r < 0)
-                return r;
-        if (r > 0)
+        if (dns_name_is_root(normalized))
                 return -EINVAL;
 
         if (l) {
index e6aad39c74532bfddc0afbf0ad03cb8ee2536aaf..31b589143510e20b29802886fa1d31acd4fd1214 100644 (file)
@@ -29,6 +29,7 @@
 #include "hexdecoct.h"
 #include "parse-util.h"
 #include "string-util.h"
+#include "strv.h"
 #include "utf8.h"
 
 int dns_label_unescape(const char **name, char *dest, size_t sz) {
@@ -752,36 +753,27 @@ int dns_name_address(const char *p, int *family, union in_addr_union *address) {
         return 0;
 }
 
-int dns_name_root(const char *name) {
-        char label[DNS_LABEL_MAX+1];
-        int r;
+bool dns_name_is_root(const char *name) {
 
         assert(name);
 
-        r = dns_label_unescape(&name, label, sizeof(label));
-        if (r < 0)
-                return r;
+        /* There are exactly two ways to encode the root domain name:
+         * as empty string, or with a single dot. */
 
-        return r == 0 && *name == 0;
+        return STR_IN_SET(name, "", ".");
 }
 
-int dns_name_single_label(const char *name) {
+bool dns_name_is_single_label(const char *name) {
         char label[DNS_LABEL_MAX+1];
         int r;
 
         assert(name);
 
         r = dns_label_unescape(&name, label, sizeof(label));
-        if (r < 0)
-                return r;
-        if (r == 0)
-                return 0;
-
-        r = dns_label_unescape(&name, label, sizeof(label));
-        if (r < 0)
-                return r;
+        if (r <= 0)
+                return false;
 
-        return r == 0 && *name == 0;
+        return dns_name_is_root(name);
 }
 
 /* Encode a domain name according to RFC 1035 Section 3.1 */
index e7e471e8a6da27d41c37f5d061655815f8c2ce4d..84be17425b3431f970d7ad9c761f1e992aeb5d2c 100644 (file)
@@ -67,8 +67,8 @@ int dns_name_change_suffix(const char *name, const char *old_suffix, const char
 int dns_name_reverse(int family, const union in_addr_union *a, char **ret);
 int dns_name_address(const char *p, int *family, union in_addr_union *a);
 
-int dns_name_root(const char *name);
-int dns_name_single_label(const char *name);
+bool dns_name_is_root(const char *name);
+bool dns_name_is_single_label(const char *name);
 
 int dns_name_to_wire_format(const char *domain, uint8_t *buffer, size_t len);
 
index b76a31a5492de65a7a6a6dfc861e5171fd63b20a..cefe8698c8c68840b6db0a423b3147e3693f18bf 100644 (file)
@@ -246,21 +246,21 @@ static void test_dns_name_endswith(void) {
         test_dns_name_endswith_one("x.y\001.z", "waldo", -EINVAL);
 }
 
-static void test_dns_name_root(void) {
-        assert_se(dns_name_root("") == true);
-        assert_se(dns_name_root(".") == true);
-        assert_se(dns_name_root("xxx") == false);
-        assert_se(dns_name_root("xxx.") == false);
-        assert_se(dns_name_root("..") == -EINVAL);
+static void test_dns_name_is_root(void) {
+        assert_se(dns_name_is_root(""));
+        assert_se(dns_name_is_root("."));
+        assert_se(!dns_name_is_root("xxx"));
+        assert_se(!dns_name_is_root("xxx."));
+        assert_se(!dns_name_is_root(".."));
 }
 
-static void test_dns_name_single_label(void) {
-        assert_se(dns_name_single_label("") == false);
-        assert_se(dns_name_single_label(".") == false);
-        assert_se(dns_name_single_label("..") == -EINVAL);
-        assert_se(dns_name_single_label("x") == true);
-        assert_se(dns_name_single_label("x.") == true);
-        assert_se(dns_name_single_label("xx.yy") == false);
+static void test_dns_name_is_single_label(void) {
+        assert_se(!dns_name_is_single_label(""));
+        assert_se(!dns_name_is_single_label("."));
+        assert_se(!dns_name_is_single_label(".."));
+        assert_se(dns_name_is_single_label("x"));
+        assert_se(dns_name_is_single_label("x."));
+        assert_se(!dns_name_is_single_label("xx.yy"));
 }
 
 static void test_dns_name_reverse_one(const char *address, const char *name) {
@@ -436,8 +436,8 @@ int main(int argc, char *argv[]) {
         test_dns_name_equal();
         test_dns_name_endswith();
         test_dns_name_between();
-        test_dns_name_root();
-        test_dns_name_single_label();
+        test_dns_name_is_root();
+        test_dns_name_is_single_label();
         test_dns_name_reverse();
         test_dns_name_concat();
         test_dns_name_is_valid();