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 | |
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)
-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 | ||||
-rw-r--r-- | source3/nsswitch/winbindd.c | 6 | ||||
-rw-r--r-- | source3/nsswitch/winbindd_util.c | 49 | ||||
-rw-r--r-- | source3/smbwrapper/smbw.c | 2 | ||||
-rw-r--r-- | source3/utils/smbtree.c | 2 |
7 files changed, 88 insertions, 40 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); } /******************************************************** diff --git a/source3/nsswitch/winbindd.c b/source3/nsswitch/winbindd.c index 56ed17464b..9c8b022f53 100644 --- a/source3/nsswitch/winbindd.c +++ b/source3/nsswitch/winbindd.c @@ -677,11 +677,13 @@ int main(int argc, char **argv) BOOL interactive = False; int opt, new_debuglevel = -1; - /* glibc (?) likes to print "User defined signal 1" and exit if a - SIGUSR1 is received before a handler is installed */ + /* glibc (?) likes to print "User defined signal 1" and exit if a + SIGUSR1 is received before a handler is installed */ CatchSignal(SIGUSR1, SIG_IGN); + snprintf(debugf, sizeof(debugf), "%s/log.winbindd", dyn_LOGFILEBASE); + /* Initialise for running in non-root mode */ sec_init(); diff --git a/source3/nsswitch/winbindd_util.c b/source3/nsswitch/winbindd_util.c index 90292ec2d2..cf7a04e8ff 100644 --- a/source3/nsswitch/winbindd_util.c +++ b/source3/nsswitch/winbindd_util.c @@ -114,55 +114,54 @@ BOOL get_domain_info(void) uint32 enum_ctx = 0, num_doms = 0; char **domains = NULL; DOM_SID *sids = NULL, domain_sid; - NTSTATUS result; - CLI_POLICY_HND *hnd; + NTSTATUS result; + CLI_POLICY_HND *hnd; int i; - fstring level5_dom; - BOOL rv = False; - TALLOC_CTX *mem_ctx; + fstring level5_dom; + BOOL rv = False; + TALLOC_CTX *mem_ctx; DEBUG(1, ("getting trusted domain list\n")); - if (!(mem_ctx = talloc_init())) - return False; + if (!(mem_ctx = talloc_init())) + return False; /* Add our workgroup - keep handle to look up trusted domains */ - if (!(hnd = cm_get_lsa_handle(lp_workgroup()))) - goto done; + if (!(hnd = cm_get_lsa_handle(lp_workgroup()))) + goto done; - result = cli_lsa_query_info_policy(hnd->cli, mem_ctx, - &hnd->pol, 0x05, level5_dom, - &domain_sid); + result = cli_lsa_query_info_policy(hnd->cli, mem_ctx, + &hnd->pol, 0x05, level5_dom, &domain_sid); - if (!NT_STATUS_IS_OK(result)) - goto done; + if (!NT_STATUS_IS_OK(result)) + goto done; add_trusted_domain(lp_workgroup(), &domain_sid); /* Enumerate list of trusted domains */ - if (!(hnd = cm_get_lsa_handle(lp_workgroup()))) - goto done; + if (!(hnd = cm_get_lsa_handle(lp_workgroup()))) + goto done; - result = cli_lsa_enum_trust_dom(hnd->cli, mem_ctx, - &hnd->pol, &enum_ctx, &num_doms, - &domains, &sids); + result = cli_lsa_enum_trust_dom(hnd->cli, mem_ctx, + &hnd->pol, &enum_ctx, &num_doms, &domains, &sids); - if (!NT_STATUS_IS_OK(result)) - goto done; + if (!NT_STATUS_IS_OK(result)) + goto done; - /* Add each domain to the trusted domain list */ + /* Add each domain to the trusted domain list */ for(i = 0; i < num_doms; i++) add_trusted_domain(domains[i], &sids[i]); - rv = True; + rv = True; done: - talloc_destroy(mem_ctx); - return rv; + talloc_destroy(mem_ctx); + + return rv; } /* Free global domain info */ diff --git a/source3/smbwrapper/smbw.c b/source3/smbwrapper/smbw.c index 24d09e2d42..b4b0b28f36 100644 --- a/source3/smbwrapper/smbw.c +++ b/source3/smbwrapper/smbw.c @@ -273,7 +273,7 @@ static char *smbw_find_workgroup(void) for (i=0;i<count;i++) { static fstring name; - if (name_status_find(0x1d, ip_list[i], name)) { + if (name_status_find("*", 0, 0x1d, ip_list[i], name)) { slprintf(server, sizeof(server), "%s#1D", name); if (smbw_server(server, "IPC$")) { smbw_setshared("WORKGROUP", name); diff --git a/source3/utils/smbtree.c b/source3/utils/smbtree.c index 857b858bec..9ce8120bba 100644 --- a/source3/utils/smbtree.c +++ b/source3/utils/smbtree.c @@ -182,7 +182,7 @@ static BOOL find_master_ip_bcast(pstring workgroup, struct in_addr *server_ip) for (i = 0; i < count; i++) { static fstring name; - if (!name_status_find(0x1d, ip_list[i], name)) + if (!name_status_find("*", 0, 0x1d, ip_list[i], name)) continue; if (!find_master_ip(name, server_ip)) |