summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2001-11-21 23:00:59 +0000
committerJeremy Allison <jra@samba.org>2001-11-21 23:00:59 +0000
commitf146325e7df80b26616225017ef6a60ff5f2e349 (patch)
treedc45a5b3308ee837158cce77f79ff696d4e004fa
parent646f8ca3e822290897e6298dd16ad3b4be78c07a (diff)
downloadsamba-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.c2
-rw-r--r--source3/libsmb/libsmbclient.c4
-rw-r--r--source3/libsmb/namequery.c63
-rw-r--r--source3/nsswitch/winbindd.c6
-rw-r--r--source3/nsswitch/winbindd_util.c49
-rw-r--r--source3/smbwrapper/smbw.c2
-rw-r--r--source3/utils/smbtree.c2
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))