]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
dns-domain: reduce indentation in dns_service_split() 23707/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 10 Jun 2022 20:48:35 +0000 (05:48 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 10 Jun 2022 21:02:08 +0000 (06:02 +0900)
src/shared/dns-domain.c

index 20abb84f0fb34e2e6c5a83e9f8328ef9697f12c2..d202fe5d867670596572f5845dfbe8f9c3c9fde7 100644 (file)
@@ -1024,7 +1024,7 @@ static bool dns_service_name_label_is_valid(const char *label, size_t n) {
 
 int dns_service_split(const char *joined, char **ret_name, char **ret_type, char **ret_domain) {
         _cleanup_free_ char *name = NULL, *type = NULL, *domain = NULL;
-        const char *p = joined, *q = NULL, *d = NULL;
+        const char *p = joined, *q = NULL, *d = joined;
         char a[DNS_LABEL_MAX+1], b[DNS_LABEL_MAX+1], c[DNS_LABEL_MAX+1];
         int an, bn, cn, r;
         unsigned x = 0;
@@ -1045,6 +1045,9 @@ int dns_service_split(const char *joined, char **ret_name, char **ret_type, char
                         return bn;
 
                 if (bn > 0) {
+                        if (!srv_type_label_is_valid(b, bn))
+                                goto finish;
+
                         x++;
 
                         /* If there was a second label, try to get the third one */
@@ -1053,51 +1056,45 @@ int dns_service_split(const char *joined, char **ret_name, char **ret_type, char
                         if (cn < 0)
                                 return cn;
 
-                        if (cn > 0)
+                        if (cn > 0 && srv_type_label_is_valid(c, cn))
                                 x++;
-                } else
-                        cn = 0;
-        } else
-                an = 0;
-
-        if (x >= 2 && srv_type_label_is_valid(b, bn)) {
+                }
+        }
 
-                if (x >= 3 && srv_type_label_is_valid(c, cn)) {
+        switch (x) {
+        case 2:
+                if (!srv_type_label_is_valid(a, an))
+                        break;
 
-                        if (dns_service_name_label_is_valid(a, an)) {
-                                /* OK, got <name> . <type> . <type2> . <domain> */
+                /* OK, got <type> . <type2> . <domain> */
 
-                                name = strndup(a, an);
-                                if (!name)
-                                        return -ENOMEM;
+                name = NULL;
 
-                                type = strjoin(b, ".", c);
-                                if (!type)
-                                        return -ENOMEM;
+                type = strjoin(a, ".", b);
+                if (!type)
+                        return -ENOMEM;
 
-                                d = p;
-                                goto finish;
-                        }
+                d = q;
+                break;
 
-                } else if (srv_type_label_is_valid(a, an)) {
+        case 3:
+                if (!dns_service_name_label_is_valid(a, an))
+                        break;
 
-                        /* OK, got <type> . <type2> . <domain> */
+                /* OK, got <name> . <type> . <type2> . <domain> */
 
-                        name = NULL;
+                name = strndup(a, an);
+                if (!name)
+                        return -ENOMEM;
 
-                        type = strjoin(a, ".", b);
-                        if (!type)
-                                return -ENOMEM;
+                type = strjoin(b, ".", c);
+                if (!type)
+                        return -ENOMEM;
 
-                        d = q;
-                        goto finish;
-                }
+                d = p;
+                break;
         }
 
-        name = NULL;
-        type = NULL;
-        d = joined;
-
 finish:
         r = dns_name_normalize(d, 0, &domain);
         if (r < 0)