diff options
author | Jeremy Allison <jra@samba.org> | 2002-02-28 01:05:15 +0000 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2002-02-28 01:05:15 +0000 |
commit | df43f3d41009f170295f93f6d6df1b6e84077616 (patch) | |
tree | c182985dddbb7e5548eab1eccf0fd91f089f1033 | |
parent | 276ff4df82313abcf09db2d373a4229a5b8db506 (diff) | |
download | samba-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)
-rw-r--r-- | source3/auth/auth_domain.c | 23 | ||||
-rw-r--r-- | source3/libsmb/namequery.c | 16 | ||||
-rw-r--r-- | source3/nsswitch/winbindd_cm.c | 55 |
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; |