much simpler code to choose a DC to contact in winbindd. We now always
authorAndrew Tridgell <tridge@samba.org>
Wed, 23 Oct 2002 03:37:51 +0000 (03:37 +0000)
committerAndrew Tridgell <tridge@samba.org>
Wed, 23 Oct 2002 03:37:51 +0000 (03:37 +0000)
choose the server that has the most bits in common in its IP with one
of our interfaces.
(This used to be commit 31774dce67844b67cb405e65f307a20354f2cedb)

source3/nsswitch/winbindd_cm.c

index 5f477c78f79c3d7ab3cc97191313d6f4c2427564..3b83fde95b944fef607356ce8d2af40f163d6b59 100644 (file)
@@ -140,70 +140,20 @@ static BOOL cm_ads_find_dc(const char *domain, struct in_addr *dc_ip, fstring sr
 */
 static BOOL cm_rpc_find_dc(const char *domain, struct in_addr *dc_ip, fstring srv_name)
 {
-       struct in_addr *ip_list = NULL, exclude_ip;
+       struct in_addr *ip_list = NULL;
        int count, i;
 
-       zero_ip(&exclude_ip);
-
-       /* Lookup domain controller name. Try the real PDC first to avoid
-          SAM sync delays */
-
-       if (get_dc_list(True, domain, &ip_list, &count)) {
-               if (name_status_find(domain, 0x1c, 0x20, ip_list[0], srv_name)) {
-                       *dc_ip = ip_list[0];
-                       SAFE_FREE(ip_list);
-                       return True;
-               }
-               /* Didn't get name, remember not to talk to this DC. */
-               exclude_ip = ip_list[0];
-               SAFE_FREE(ip_list);
-       }
-
-       if (!get_dc_list(False, domain, &ip_list, &count)) {
+       if (!get_dc_list(False, domain, &ip_list, &count) && 
+           !get_dc_list(True, domain, &ip_list, &count)) {
                DEBUG(3, ("Could not look up dc's for domain %s\n", domain));
                return False;
        }
 
-       /* Remove the entry we've already failed with (should be the PDC). */
-       for (i = 0; i < count; i++) {
-               if (ip_equal( exclude_ip, ip_list[i]))
-                       zero_ip(&ip_list[i]);
-       }
-
        /* Pick a nice close server */
-       /* Look for DC on local net */
-       for (i = 0; i < count; i++) {
-               if (is_zero_ip(ip_list[i]))
-                       continue;
-
-               if (!is_local_net(ip_list[i]))
-                       continue;
-               
-               if (name_status_find(domain, 0x1c, 0x20, ip_list[i], srv_name)) {
-                       *dc_ip = ip_list[i];
-                       SAFE_FREE(ip_list);
-                       return True;
-               }
-               zero_ip(&ip_list[i]);
-       }
-
-       /*
-        * Secondly try and contact a random PDC/BDC.
-        */
-
-       i = (sys_random() % count);
-
-       if (!is_zero_ip(ip_list[i]) &&
-           name_status_find(domain, 0x1c, 0x20,
-                            ip_list[i], srv_name)) {
-               *dc_ip = ip_list[i];
-               SAFE_FREE(ip_list);
-               return True;
+       if (count > 1) {
+               qsort(ip_list, count, sizeof(struct in_addr), QSORT_CAST ip_compare);
        }
-       zero_ip(&ip_list[i]); /* Tried and failed. */
 
-       /* Finally return first DC that we can contact using a node
-          status */
        for (i = 0; i < count; i++) {
                if (is_zero_ip(ip_list[i]))
                        continue;
@@ -215,6 +165,7 @@ static BOOL cm_rpc_find_dc(const char *domain, struct in_addr *dc_ip, fstring sr
                }
        }
 
+
        SAFE_FREE(ip_list);
 
        return False;