From df43f3d41009f170295f93f6d6df1b6e84077616 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 28 Feb 2002 01:05:15 +0000 Subject: Ensure that winbindd and smbd both use identical logic to find dc's. Fix bug where zeroip addresses were being checked. Jeremy. (This used to be commit 8ed49fe0df201833329c17b2afe1e3aa70646558) --- source3/nsswitch/winbindd_cm.c | 55 +++++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 28 deletions(-) (limited to 'source3/nsswitch') diff --git a/source3/nsswitch/winbindd_cm.c b/source3/nsswitch/winbindd_cm.c index 3aaaf6b670..dcbd47303f 100644 --- a/source3/nsswitch/winbindd_cm.c +++ b/source3/nsswitch/winbindd_cm.c @@ -148,47 +148,46 @@ static BOOL cm_get_dc_name(const char *domain, fstring srv_name, struct in_addr } /* Pick a nice close server */ - - if (strequal(lp_passwordserver(), "*")) { + /* Look for DC on local net */ + + for (i = 0; i < count; i++) { + if (!is_local_net(ip_list[i])) + continue; - /* Look for DC on local net */ - - for (i = 0; i < count; i++) { - if (is_local_net(ip_list[i]) && - name_status_find(domain, 0x1c, 0x20, - ip_list[i], srv_name)) { - dc_ip = ip_list[i]; - goto done; - } - zero_ip(&ip_list[i]); + if (name_status_find(domain, 0x1c, 0x20, ip_list[i], srv_name)) { + dc_ip = ip_list[i]; + goto done; } + zero_ip(&ip_list[i]); + } - /* Look for other DCs */ - - for (i = 0; i < count; i++) { - if (!is_zero_ip(ip_list[i]) && - name_status_find(domain, 0x1c, 0x20, - ip_list[i], srv_name)) { - dc_ip = ip_list[i]; - goto done; - } - } + /* + * Secondly try and contact a random PDC/BDC. + */ - /* No-one to talk to )-: */ + i = (sys_random() % count); - return False; + if (!is_zero_ip(ip_list[i]) && + name_status_find(domain, 0x1c, 0x20, + ip_list[i], srv_name)) { + dc_ip = ip_list[i]; + goto done; } + zero_ip(&ip_list[i]); /* Tried and failed. */ - /* Return first DC that we can contact */ + /* Finally return first DC that we can contact */ for (i = 0; i < count; i++) { - if (name_status_find(domain, 0x1c, 0x20, ip_list[i], - srv_name)) { + if (is_zero_ip(ip_list[i])) + continue; + + if (name_status_find(domain, 0x1c, 0x20, ip_list[i], srv_name)) { dc_ip = ip_list[i]; goto done; } } + /* No-one to talk to )-: */ return False; /* Boo-hoo */ done: @@ -201,7 +200,7 @@ static BOOL cm_get_dc_name(const char *domain, fstring srv_name, struct in_addr fstrcpy(dcc->srv_name, srv_name); - DEBUG(3, ("Returning DC %s (%s) for domain %s\n", srv_name, + DEBUG(3, ("cm_get_dc_name: Returning DC %s (%s) for domain %s\n", srv_name, inet_ntoa(dc_ip), domain)); *ip_out = dc_ip; -- cgit