]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3: libsmb: Add remove_duplicate_addrs2_sa() - uses samba_sockaddr.
authorJeremy Allison <jra@samba.org>
Wed, 9 Sep 2020 16:18:36 +0000 (09:18 -0700)
committerNoel Power <npower@samba.org>
Tue, 15 Sep 2020 10:09:39 +0000 (10:09 +0000)
Not yet used, will be used when we migrate internal_resolve_name()
to samba_sockaddr.

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 f63356c485430d6b8a12efe8022641041888ed52..6595324b255b4b0b211e4f9b01b2cc3d9be79b62 100644 (file)
@@ -1297,6 +1297,41 @@ size_t remove_duplicate_addrs2(struct ip_service *iplist, size_t count )
        return count;
 }
 
+/**********************************************************************
+ Remove any duplicate address/port pairs in the samba_sockaddr array.
+ *********************************************************************/
+
+size_t remove_duplicate_addrs2_sa(struct samba_sockaddr *salist, size_t count )
+{
+       size_t i, j;
+
+       DBG_DEBUG("looking for duplicate address/port pairs\n");
+
+       /* One loop to set duplicates to a zero addr. */
+       for (i=0; i < count; i++) {
+               if (is_zero_addr(&salist[i].u.ss)) {
+                       continue;
+               }
+
+               for (j=i+1; j<count; j++) {
+                       if (sockaddr_equal(&salist[i].u.sa, &salist[j].u.sa)) {
+                               zero_sockaddr(&salist[j].u.ss);
+                       }
+               }
+       }
+
+       /* Now remove any addresses set to zero above. */
+       for (i = 0; i < count; i++) {
+               while (i < count &&
+                               is_zero_addr(&salist[i].u.ss)) {
+                       ARRAY_DEL_ELEMENT(salist, i, count);
+                       count--;
+               }
+       }
+
+       return count;
+}
+
 static bool prioritize_ipv4_list(struct ip_service *iplist, size_t count)
 {
        TALLOC_CTX *frame = talloc_stackframe();
index 2342c5a2164c881216ceadb8e4cb46df76fda198..26b8316bb3a5611e8134fe115988b9053982d572 100644 (file)
@@ -48,6 +48,7 @@ bool name_status_find(const char *q_name,
                        const struct sockaddr_storage *to_ss,
                        fstring name);
 size_t remove_duplicate_addrs2(struct ip_service *iplist, size_t count );
+size_t remove_duplicate_addrs2_sa(struct samba_sockaddr *salist, size_t count);
 struct tevent_req *name_query_send(TALLOC_CTX *mem_ctx,
                                   struct tevent_context *ev,
                                   const char *name, int name_type,