addns: Centralize siteless lookup fallback
authorVolker Lendecke <vl@samba.org>
Fri, 11 Jan 2019 13:18:53 +0000 (14:18 +0100)
committerVolker Lendecke <vl@samba.org>
Tue, 15 Jan 2019 06:53:21 +0000 (07:53 +0100)
We had the same logic 3 times, coalesce into one

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
lib/addns/dnsquery.c

index 4e2aaf4f3be5f1b1bc7bdc17015e1abfc4e5977a..30e5a564eec5158f6dd135d773be5b7ba801d99f 100644 (file)
@@ -742,18 +742,41 @@ static NTSTATUS ads_dns_query_internal(TALLOC_CTX *ctx,
                                       int *numdcs )
 {
        char *name;
-       if (sitename && strlen(sitename)) {
+       NTSTATUS status;
+       int num_srvs = 0;
+
+       if ((sitename != NULL) && (strlen(sitename) != 0)) {
                name = talloc_asprintf(ctx, "%s._tcp.%s._sites.%s._msdcs.%s",
                                       servicename, sitename,
                                       dc_pdc_gc_domains, realm);
-       } else {
-               name = talloc_asprintf(ctx, "%s._tcp.%s._msdcs.%s",
-                               servicename, dc_pdc_gc_domains, realm);
+               if (name == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+               }
+
+               status = ads_dns_lookup_srv(ctx, name, dclist, &num_srvs);
+
+               TALLOC_FREE(name);
+
+               if (NT_STATUS_EQUAL(status, NT_STATUS_IO_TIMEOUT) ||
+                   NT_STATUS_EQUAL(status, NT_STATUS_CONNECTION_REFUSED)) {
+                       return status;
+               }
+
+               if (NT_STATUS_IS_OK(status) && (num_srvs != 0)) {
+                       goto done;
+               }
        }
-       if (!name) {
+
+       name = talloc_asprintf(ctx, "%s._tcp.%s._msdcs.%s",
+                              servicename, dc_pdc_gc_domains, realm);
+       if (name == NULL) {
                return NT_STATUS_NO_MEMORY;
        }
-       return ads_dns_lookup_srv(ctx, name, dclist, numdcs);
+       status = ads_dns_lookup_srv(ctx, name, dclist, &num_srvs);
+
+done:
+       *numdcs = num_srvs; /* automatic conversion size_t->int */
+       return status;
 }
 
 /********************************************************************
@@ -775,24 +798,6 @@ NTSTATUS ads_dns_query_dcs(TALLOC_CTX *ctx,
                                        sitename,
                                        dclist,
                                        numdcs);
-
-       if (NT_STATUS_EQUAL(status, NT_STATUS_IO_TIMEOUT) ||
-           NT_STATUS_EQUAL(status, NT_STATUS_CONNECTION_REFUSED)) {
-               return status;
-       }
-
-       if (sitename &&
-           ((!NT_STATUS_IS_OK(status)) ||
-            (NT_STATUS_IS_OK(status) && (numdcs == 0)))) {
-               /* Sitename DNS query may have failed. Try without. */
-               status = ads_dns_query_internal(ctx,
-                                               "_ldap",
-                                               "dc",
-                                               realm,
-                                               NULL,
-                                               dclist,
-                                               numdcs);
-       }
        return status;
 }
 
@@ -815,24 +820,6 @@ NTSTATUS ads_dns_query_gcs(TALLOC_CTX *ctx,
                                        sitename,
                                        dclist,
                                        numdcs);
-
-       if (NT_STATUS_EQUAL(status, NT_STATUS_IO_TIMEOUT) ||
-           NT_STATUS_EQUAL(status, NT_STATUS_CONNECTION_REFUSED)) {
-               return status;
-       }
-
-       if (sitename &&
-           ((!NT_STATUS_IS_OK(status)) ||
-            (NT_STATUS_IS_OK(status) && (numdcs == 0)))) {
-               /* Sitename DNS query may have failed. Try without. */
-               status = ads_dns_query_internal(ctx,
-                                               "_ldap",
-                                               "gc",
-                                               realm,
-                                               NULL,
-                                               dclist,
-                                               numdcs);
-       }
        return status;
 }
 
@@ -857,24 +844,6 @@ NTSTATUS ads_dns_query_kdcs(TALLOC_CTX *ctx,
                                        sitename,
                                        dclist,
                                        numdcs);
-
-       if (NT_STATUS_EQUAL(status, NT_STATUS_IO_TIMEOUT) ||
-           NT_STATUS_EQUAL(status, NT_STATUS_CONNECTION_REFUSED)) {
-               return status;
-       }
-
-       if (sitename &&
-           ((!NT_STATUS_IS_OK(status)) ||
-            (NT_STATUS_IS_OK(status) && (numdcs == 0)))) {
-               /* Sitename DNS query may have failed. Try without. */
-               status = ads_dns_query_internal(ctx,
-                                               "_kerberos",
-                                               "dc",
-                                               dns_forest_name,
-                                               NULL,
-                                               dclist,
-                                               numdcs);
-       }
        return status;
 }