diff options
author | Jeremy Allison <jra@samba.org> | 2001-11-21 23:00:59 +0000 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2001-11-21 23:00:59 +0000 |
commit | f146325e7df80b26616225017ef6a60ff5f2e349 (patch) | |
tree | dc45a5b3308ee837158cce77f79ff696d4e004fa /source3/libsmb | |
parent | 646f8ca3e822290897e6298dd16ad3b4be78c07a (diff) | |
download | samba-f146325e7df80b26616225017ef6a60ff5f2e349.tar.gz samba-f146325e7df80b26616225017ef6a60ff5f2e349.tar.bz2 samba-f146325e7df80b26616225017ef6a60ff5f2e349.zip |
W2K doesn't seem to respond to *#0 names in node status. Ensure name
lookup uses password server parameter when looking for PDCs.
Jeremy.
(This used to be commit 54c968913d6553c6d834b068234ab176917075eb)
Diffstat (limited to 'source3/libsmb')
-rw-r--r-- | source3/libsmb/domain_client_validate.c | 2 | ||||
-rw-r--r-- | source3/libsmb/libsmbclient.c | 4 | ||||
-rw-r--r-- | source3/libsmb/namequery.c | 63 |
3 files changed, 58 insertions, 11 deletions
diff --git a/source3/libsmb/domain_client_validate.c b/source3/libsmb/domain_client_validate.c index a8c3ff2f6b..2fd17e1fa4 100644 --- a/source3/libsmb/domain_client_validate.c +++ b/source3/libsmb/domain_client_validate.c @@ -53,7 +53,7 @@ static BOOL connect_to_domain_password_server(struct cli_state *pcli, return False; } - if (!name_status_find(0x20, to_ip, remote_machine)) { + if (!name_status_find("*", 0x20, 0x20, to_ip, remote_machine)) { DEBUG(0, ("connect_to_domain_password_server: Can't " "resolve name for IP %s\n", server)); return False; diff --git a/source3/libsmb/libsmbclient.c b/source3/libsmb/libsmbclient.c index af2daac3fc..ce00548518 100644 --- a/source3/libsmb/libsmbclient.c +++ b/source3/libsmb/libsmbclient.c @@ -1602,7 +1602,7 @@ int smbc_opendir(const char *fname) /* find the name of the server ... */ - if (!name_status_find(0, rem_ip, server)) { + if (!name_status_find("*", 0, 0, rem_ip, server)) { DEBUG(0, ("Could not get the name of local master browser for server %s\n", server)); errno = EINVAL; @@ -1671,7 +1671,7 @@ int smbc_opendir(const char *fname) */ - if (!name_status_find(0, rem_ip, buserver)) { + if (!name_status_find("*", 0, 0, rem_ip, buserver)) { DEBUG(0, ("Could not get name of local master browser %s\n", server)); errno = EPERM; /* FIXME, is this correct */ diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c index 0e696a085b..f8688ddb25 100644 --- a/source3/libsmb/namequery.c +++ b/source3/libsmb/namequery.c @@ -160,7 +160,8 @@ find the first type XX name in a node status reply - used for finding a servers name given its IP return the matched name in *name **************************************************************************/ -BOOL name_status_find(int type, struct in_addr to_ip, char *name) + +BOOL name_status_find(const char *q_name, int q_type, int type, struct in_addr to_ip, char *name) { struct node_status *status; struct nmb_name nname; @@ -168,17 +169,22 @@ BOOL name_status_find(int type, struct in_addr to_ip, char *name) int sock; sock = open_socket_in(SOCK_DGRAM, 0, 3, interpret_addr(lp_socket_address()), True); - if (sock == -1) return False; + if (sock == -1) + return False; - make_nmb_name(&nname, "*", 0); + /* W2K PDC's seem not to respond to '*'#0. JRA */ + make_nmb_name(&nname, q_name, q_type); status = node_status_query(sock, &nname, to_ip, &count); close(sock); - if (!status) return False; + if (!status) + return False; for (i=0;i<count;i++) { - if (status[i].type == type) break; + if (status[i].type == type) + break; } - if (i == count) return False; + if (i == count) + return False; pull_ascii(name, status[i].name, 15, 0, STR_TERMINATE); @@ -980,7 +986,7 @@ BOOL lookup_pdc_name(const char *srcname, const char *domain, struct in_addr *pd *pdc_name = '\0'; - ret = name_status_find(0x20,*pdc_ip,pdc_name); + ret = name_status_find(domain, 0x1b, 0x20,*pdc_ip,pdc_name); if(ret && *pdc_name) { fstrcpy(ret_name, pdc_name); @@ -1172,9 +1178,50 @@ NT GETDC call, UNICODE, NT domain SID and uncle tom cobbley and all... /******************************************************** Get the IP address list of the PDC/BDC's of a Domain. *********************************************************/ + BOOL get_dc_list(BOOL pdc_only, char *group, struct in_addr **ip_list, int *count) { - return internal_resolve_name(group, pdc_only ? 0x1B : 0x1C, ip_list, count); + /* + * If we're looking for a PDC and it's our domain then + * use the 'password server' parameter. + */ + + if (pdc_only && strequal(group, lp_workgroup())) { + char *p; + char *pserver = lp_passwordserver(); + fstring name; + int num_adresses = 0; + struct in_addr *return_iplist = NULL; + + if (! *pserver) + return internal_resolve_name(group, 0x1B, ip_list, count); + + p = pserver; + while (next_token(&p,name,LIST_SEP,sizeof(name))) { + if (strequal(name, "*")) + return internal_resolve_name(group, 0x1B, ip_list, count); + num_adresses++; + } + if (num_adresses == 0) + return internal_resolve_name(group, 0x1B, ip_list, count); + + return_iplist = (struct in_addr *)malloc(num_adresses * sizeof(struct in_addr)); + if(return_iplist == NULL) { + DEBUG(3,("get_dc_list: malloc fail !\n")); + return False; + } + p = pserver; + *count = 0; + while (next_token(&p,name,LIST_SEP,sizeof(name))) { + struct in_addr name_ip; + if (resolve_name( name, &name_ip, 0x20) == False) + continue; + return_iplist[*count++] = name_ip; + } + *ip_list = return_iplist; + return (*count != 0); + } else + return internal_resolve_name(group, pdc_only ? 0x1B : 0x1C, ip_list, count); } /******************************************************** |