mirror of
https://github.com/samba-team/samba.git
synced 2025-03-09 08:58:35 +03:00
r4755: the recent change in the definition of lp_passwordserver() breaks this
old code, so I'm just removing it, as it needs replacing anyway (This used to be commit cae7748d675e35bfb89b81349624258bc76fac1a)
This commit is contained in:
parent
4e4afdb946
commit
da19be9a76
@ -1102,130 +1102,3 @@ BOOL get_pdc_ip(TALLOC_CTX *mem_ctx, const char *domain, struct ipv4_addr *ip)
|
||||
return True;
|
||||
}
|
||||
|
||||
/********************************************************
|
||||
Get the IP address list of the domain controllers for
|
||||
a domain.
|
||||
*********************************************************/
|
||||
|
||||
BOOL get_dc_list(TALLOC_CTX *mem_ctx, const char *domain, struct ipv4_addr **ip_list, int *count, int *ordered)
|
||||
{
|
||||
|
||||
*ordered = False;
|
||||
|
||||
/* If it's our domain then use the 'password server' parameter. */
|
||||
|
||||
if (strequal(domain, lp_workgroup())) {
|
||||
const char *p;
|
||||
const char *pserver = lp_passwordserver(); /* UNIX charset. */
|
||||
fstring name;
|
||||
int num_addresses = 0;
|
||||
int local_count, i, j;
|
||||
struct ipv4_addr *return_iplist = NULL;
|
||||
struct ipv4_addr *auto_ip_list = NULL;
|
||||
BOOL done_auto_lookup = False;
|
||||
int auto_count = 0;
|
||||
|
||||
|
||||
if (!*pserver)
|
||||
return internal_resolve_name(mem_ctx,
|
||||
domain, 0x1C, ip_list, count);
|
||||
|
||||
p = pserver;
|
||||
|
||||
/*
|
||||
* if '*' appears in the "password server" list then add
|
||||
* an auto lookup to the list of manually configured
|
||||
* DC's. If any DC is listed by name, then the list should be
|
||||
* considered to be ordered
|
||||
*/
|
||||
|
||||
while (next_token(&p,name,LIST_SEP,sizeof(name))) {
|
||||
if (strequal(name, "*")) {
|
||||
if ( internal_resolve_name(mem_ctx, domain, 0x1C, &auto_ip_list, &auto_count) )
|
||||
num_addresses += auto_count;
|
||||
done_auto_lookup = True;
|
||||
DEBUG(8,("Adding %d DC's from auto lookup\n", auto_count));
|
||||
}
|
||||
else
|
||||
num_addresses++;
|
||||
}
|
||||
|
||||
/* if we have no addresses and haven't done the auto lookup, then
|
||||
just return the list of DC's */
|
||||
|
||||
if ( (num_addresses == 0) && !done_auto_lookup )
|
||||
return internal_resolve_name(mem_ctx, domain, 0x1C, ip_list, count);
|
||||
|
||||
return_iplist = malloc_array_p(struct ipv4_addr, num_addresses);
|
||||
|
||||
if (return_iplist == NULL) {
|
||||
DEBUG(3,("get_dc_list: malloc fail !\n"));
|
||||
return False;
|
||||
}
|
||||
|
||||
p = pserver;
|
||||
local_count = 0;
|
||||
|
||||
/* fill in the return list now with real IP's */
|
||||
|
||||
while ( (local_count<num_addresses) && next_token(&p,name,LIST_SEP,sizeof(name)) ) {
|
||||
struct ipv4_addr name_ip;
|
||||
|
||||
/* copy any addersses from the auto lookup */
|
||||
|
||||
if ( strequal(name, "*") ) {
|
||||
for ( j=0; j<auto_count; j++ )
|
||||
return_iplist[local_count++] = auto_ip_list[j];
|
||||
continue;
|
||||
}
|
||||
|
||||
/* explicit lookup; resolve_name() will handle names & IP addresses */
|
||||
|
||||
if ( resolve_name( mem_ctx, name, &name_ip, 0x20) ) {
|
||||
return_iplist[local_count++] = name_ip;
|
||||
*ordered = True;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
SAFE_FREE(auto_ip_list);
|
||||
|
||||
/* need to remove duplicates in the list if we have
|
||||
any explicit password servers */
|
||||
|
||||
if ( *ordered ) {
|
||||
/* one loop to remove duplicates */
|
||||
for ( i=0; i<local_count; i++ ) {
|
||||
if ( is_zero_ip(return_iplist[i]) )
|
||||
continue;
|
||||
|
||||
for ( j=i+1; j<local_count; j++ ) {
|
||||
if ( ipv4_equal( return_iplist[i], return_iplist[j]) )
|
||||
zero_ip(&return_iplist[j]);
|
||||
}
|
||||
}
|
||||
|
||||
/* one loop to clean up any holes we left */
|
||||
/* first ip should never be a zero_ip() */
|
||||
for (i = 0; i<local_count; ) {
|
||||
if ( is_zero_ip(return_iplist[i]) ) {
|
||||
if (i != local_count-1 )
|
||||
memmove(&return_iplist[i], &return_iplist[i+1],
|
||||
(local_count - i - 1)*sizeof(return_iplist[i]));
|
||||
local_count--;
|
||||
continue;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
*ip_list = return_iplist;
|
||||
*count = local_count;
|
||||
|
||||
DEBUG(8,("get_dc_list: return %d ip addresses\n", *count));
|
||||
|
||||
return (*count != 0);
|
||||
}
|
||||
|
||||
return internal_resolve_name(mem_ctx, domain, 0x1C, ip_list, count);
|
||||
}
|
||||
|
@ -25,80 +25,3 @@
|
||||
#include "includes.h"
|
||||
|
||||
|
||||
/*
|
||||
find the DC for a domain using methods appropriate for a RPC domain
|
||||
*/
|
||||
BOOL rpc_find_dc(const char *domain, fstring srv_name, struct ipv4_addr *ip_out)
|
||||
{
|
||||
struct ipv4_addr *ip_list = NULL, dc_ip, exclude_ip;
|
||||
int count, i;
|
||||
BOOL list_ordered;
|
||||
BOOL use_pdc_only;
|
||||
|
||||
zero_ip(&exclude_ip);
|
||||
|
||||
use_pdc_only = must_use_pdc(domain);
|
||||
|
||||
/* Lookup domain controller name */
|
||||
|
||||
if ( use_pdc_only && get_pdc_ip(domain, &dc_ip) ) {
|
||||
DEBUG(10,("rpc_find_dc: Atempting to lookup PDC to avoid sam sync delays\n"));
|
||||
|
||||
if (name_status_find(domain, 0x1c, 0x20, dc_ip, srv_name)) {
|
||||
goto done;
|
||||
}
|
||||
/* Didn't get name, remember not to talk to this DC. */
|
||||
exclude_ip = dc_ip;
|
||||
}
|
||||
|
||||
/* get a list of all domain controllers */
|
||||
|
||||
if (!get_dc_list( domain, &ip_list, &count, &list_ordered) ) {
|
||||
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). */
|
||||
|
||||
if ( use_pdc_only ) {
|
||||
for (i = 0; i < count; i++) {
|
||||
if (ipv4_equal( exclude_ip, ip_list[i]))
|
||||
zero_ip(&ip_list[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/* Pick a nice close server, but only if the list was not ordered */
|
||||
if (!list_ordered && (count > 1) ) {
|
||||
qsort(ip_list, count, sizeof(struct ipv4_addr), QSORT_CAST ip_compare);
|
||||
}
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
SAFE_FREE(ip_list);
|
||||
|
||||
return False;
|
||||
done:
|
||||
/* We have the netbios name and IP address of a domain controller.
|
||||
Ideally we should sent a SAMLOGON request to determine whether
|
||||
the DC is alive and kicking. If we can catch a dead DC before
|
||||
performing a smbcli_connect() we can avoid a 30-second timeout. */
|
||||
|
||||
DEBUG(3, ("rpc_find_dc: Returning DC %s (%s) for domain %s\n", srv_name,
|
||||
inet_ntoa(dc_ip), domain));
|
||||
|
||||
*ip_out = dc_ip;
|
||||
|
||||
SAFE_FREE(ip_list);
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user