summaryrefslogtreecommitdiff
path: root/source3/nsswitch
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2002-02-28 01:05:15 +0000
committerJeremy Allison <jra@samba.org>2002-02-28 01:05:15 +0000
commitdf43f3d41009f170295f93f6d6df1b6e84077616 (patch)
treec182985dddbb7e5548eab1eccf0fd91f089f1033 /source3/nsswitch
parent276ff4df82313abcf09db2d373a4229a5b8db506 (diff)
downloadsamba-df43f3d41009f170295f93f6d6df1b6e84077616.tar.gz
samba-df43f3d41009f170295f93f6d6df1b6e84077616.tar.bz2
samba-df43f3d41009f170295f93f6d6df1b6e84077616.zip
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)
Diffstat (limited to 'source3/nsswitch')
-rw-r--r--source3/nsswitch/winbindd_cm.c55
1 files changed, 27 insertions, 28 deletions
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;