s3: libsmb: Add get_kdc_list_sa() returns samba_sockaddr array.
authorJeremy Allison <jra@samba.org>
Tue, 8 Sep 2020 23:09:53 +0000 (16:09 -0700)
committerNoel Power <npower@samba.org>
Tue, 15 Sep 2020 10:09:38 +0000 (10:09 +0000)
Not yet used, but uses the previous utility functions.
Now to convert the get_kdc_list() callers and remove
one more external use of ip_service.

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 a1165dacba04724e1a127eccd344b2cd82f3b37c..0437428d995e8ba58a69091ecbf2797a4aa2f2a7 100644 (file)
@@ -1229,7 +1229,6 @@ static void sort_service_list(struct ip_service *servlist, size_t count)
        TYPESAFE_QSORT(servlist, count, ip_service_compare);
 }
 
-#if 0
 static int samba_sockaddr_compare(struct samba_sockaddr *sa1,
                                struct samba_sockaddr *sa2)
 {
@@ -1244,7 +1243,6 @@ static void sort_sa_list(struct samba_sockaddr *salist, size_t count)
 
        TYPESAFE_QSORT(salist, count, samba_sockaddr_compare);
 }
-#endif
 
 /**********************************************************************
  Remove any duplicate address/port pairs in the list
@@ -4250,3 +4248,53 @@ NTSTATUS get_kdc_list(TALLOC_CTX *ctx,
        *ip_list_ret = ip_list;
        return status;
 }
+
+/*********************************************************************
+ Get the KDC list - re-use all the logic in get_dc_list.
+ Returns a samba_sockaddr array.
+*********************************************************************/
+
+NTSTATUS get_kdc_list_sa(TALLOC_CTX *ctx,
+                       const char *realm,
+                       const char *sitename,
+                       struct samba_sockaddr **sa_list_ret,
+                       size_t *ret_count)
+{
+       size_t count = 0;
+       struct ip_service *ip_list = NULL;
+       struct samba_sockaddr *sa_list = NULL;
+       bool ordered = false;
+       NTSTATUS status;
+
+       status = get_dc_list(ctx,
+                       realm,
+                       sitename,
+                       &ip_list,
+                       &count,
+                       DC_KDC_ONLY,
+                       &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;
+}
index 7b3af3ae3f448f65f2fb1d801d7c645b93df76d7..29277437f77506defe4b3a1c6b43b4c7911c72fd 100644 (file)
@@ -121,4 +121,9 @@ NTSTATUS get_kdc_list(TALLOC_CTX *ctx,
                        const char *sitename,
                        struct ip_service **ip_list_ret,
                        size_t *ret_count);
+NTSTATUS get_kdc_list_sa(TALLOC_CTX *ctx,
+                       const char *realm,
+                       const char *sitename,
+                       struct samba_sockaddr **sa_list_ret,
+                       size_t *ret_count);
 #endif