]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3: libsmb: Add function get_sorted_dc_list_sa(). Returns samba_sockaddr array.
authorJeremy Allison <jra@samba.org>
Tue, 8 Sep 2020 23:29:35 +0000 (16:29 -0700)
committerNoel Power <npower@samba.org>
Tue, 15 Sep 2020 10:09:38 +0000 (10:09 +0000)
Now to fix callers.

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Noel Power <noel.power@suse.com>
source3/libsmb/namequery.c
source3/libsmb/namequery.h

index 4f933c66694136594af0a7f07b6c988d6d174dfc..70eea22aedf0f0809ed873a2e11d29f9a72b61ac 100644 (file)
@@ -4211,6 +4211,80 @@ NTSTATUS get_sorted_dc_list(TALLOC_CTX *ctx,
        return status;
 }
 
+/*********************************************************************
+ Small wrapper function to get the DC list and sort it if neccessary.
+ Returns a samba_sockaddr array.
+*********************************************************************/
+
+NTSTATUS get_sorted_dc_list_sa(TALLOC_CTX *ctx,
+                               const char *domain,
+                               const char *sitename,
+                               struct samba_sockaddr **sa_list_ret,
+                               size_t *ret_count,
+                               bool ads_only)
+{
+       bool ordered = false;
+       NTSTATUS status;
+       enum dc_lookup_type lookup_type = DC_NORMAL_LOOKUP;
+       struct ip_service *ip_list = NULL;
+       struct samba_sockaddr *sa_list = NULL;
+       size_t count = 0;
+
+       DBG_INFO("attempting lookup for name %s (sitename %s)\n",
+               domain,
+               sitename ? sitename : "NULL");
+
+       if (ads_only) {
+               lookup_type = DC_ADS_ONLY;
+       }
+
+       status = get_dc_list(ctx,
+                       domain,
+                       sitename,
+                       &ip_list,
+                       &count,
+                       lookup_type,
+                       &ordered);
+       if (NT_STATUS_EQUAL(status, NT_STATUS_NO_LOGON_SERVERS)
+                       && sitename) {
+               DBG_NOTICE("no server for name %s available"
+                       " in site %s, fallback to all servers\n",
+                       domain,
+                       sitename);
+               status = get_dc_list(ctx,
+                               domain,
+                               NULL,
+                               &ip_list,
+                               &count,
+                               lookup_type,
+                               &ordered);
+       }
+
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+
+       status = ip_service_to_samba_sockaddr(ctx,
+                                       &sa_list,
+                                       ip_list,
+                                       count);
+
+       TALLOC_FREE(ip_list);
+
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+
+       /* only sort if we don't already have an ordered list */
+       if (!ordered) {
+               sort_sa_list(sa_list, count);
+       }
+
+       *ret_count = count;
+       *sa_list_ret = sa_list;
+       return status;
+}
+
 /*********************************************************************
  Get the KDC list - re-use all the logic in get_dc_list.
  Returns a samba_sockaddr array.
index 879a21137475afc6628ff535700f7b74f2c2c4d3..774a0602eb5de4d4f14a1bded29ea3ae94ee235d 100644 (file)
@@ -116,6 +116,12 @@ NTSTATUS get_sorted_dc_list(TALLOC_CTX *ctx,
                        struct ip_service **ip_list_ret,
                        size_t *ret_count,
                        bool ads_only);
+NTSTATUS get_sorted_dc_list_sa(TALLOC_CTX *ctx,
+                       const char *domain,
+                       const char *sitename,
+                       struct samba_sockaddr **sa_list_ret,
+                       size_t *ret_count,
+                       bool ads_only);
 NTSTATUS get_kdc_list(TALLOC_CTX *ctx,
                        const char *realm,
                        const char *sitename,