summaryrefslogtreecommitdiff
path: root/source3
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
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')
-rw-r--r--source3/auth/auth_domain.c23
-rw-r--r--source3/libsmb/namequery.c16
-rw-r--r--source3/nsswitch/winbindd_cm.c55
3 files changed, 47 insertions, 47 deletions
diff --git a/source3/auth/auth_domain.c b/source3/auth/auth_domain.c
index 947cd41a26..c7bfea4f6a 100644
--- a/source3/auth/auth_domain.c
+++ b/source3/auth/auth_domain.c
@@ -197,9 +197,8 @@ static NTSTATUS find_connect_pdc(struct cli_state **cli,
if(!is_local_net(ip_list[i]))
continue;
- if(NT_STATUS_IS_OK(nt_status =
- attempt_connect_to_dc(cli, domain,
- &ip_list[i], trust_passwd)))
+ if(NT_STATUS_IS_OK(nt_status = attempt_connect_to_dc(cli, domain,
+ &ip_list[i], trust_passwd)))
break;
zero_ip(&ip_list[i]); /* Tried and failed. */
@@ -211,10 +210,11 @@ static NTSTATUS find_connect_pdc(struct cli_state **cli,
if(!NT_STATUS_IS_OK(nt_status)) {
i = (sys_random() % count);
- if (!NT_STATUS_IS_OK(nt_status =
- attempt_connect_to_dc(cli, domain,
- &ip_list[i], trust_passwd)))
- zero_ip(&ip_list[i]); /* Tried and failed. */
+ if (!is_zero_ip(ip_list[i])) {
+ if (!NT_STATUS_IS_OK(nt_status = attempt_connect_to_dc(cli, domain,
+ &ip_list[i], trust_passwd)))
+ zero_ip(&ip_list[i]); /* Tried and failed. */
+ }
}
/*
@@ -227,15 +227,16 @@ static NTSTATUS find_connect_pdc(struct cli_state **cli,
* Note that from a WINS server the #1 IP address is the PDC.
*/
for(i = 0; i < count; i++) {
- if (NT_STATUS_IS_OK(nt_status =
- attempt_connect_to_dc(cli, domain,
- &ip_list[i], trust_passwd)))
+ if (is_zero_ip(ip_list[i]))
+ continue;
+
+ if (NT_STATUS_IS_OK(nt_status = attempt_connect_to_dc(cli, domain,
+ &ip_list[i], trust_passwd)))
break;
}
}
SAFE_FREE(ip_list);
-
return nt_status;
}
diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
index f03ede10cd..0370365953 100644
--- a/source3/libsmb/namequery.c
+++ b/source3/libsmb/namequery.c
@@ -1269,6 +1269,14 @@ NT GETDC call, UNICODE, NT domain SID and uncle tom cobbley and all...
#endif /* defined(I_HATE_WINDOWS_REPLY_CODE) */
}
+/********************************************************
+ Get the IP address list of the Local Master Browsers
+ ********************************************************/
+
+BOOL get_lmb_list(struct in_addr **ip_list, int *count)
+{
+ return internal_resolve_name( MSBROWSE, 0x1, ip_list, count);
+}
/********************************************************
Get the IP address list of the PDC/BDC's of a Domain.
@@ -1320,11 +1328,3 @@ BOOL get_dc_list(BOOL pdc_only, const char *group, struct in_addr **ip_list, int
} else
return internal_resolve_name(group, name_type, ip_list, count);
}
-
-/********************************************************
- Get the IP address list of the Local Master Browsers
- ********************************************************/
-BOOL get_lmb_list(struct in_addr **ip_list, int *count)
-{
- return internal_resolve_name( MSBROWSE, 0x1, ip_list, count);
-}
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;