diff options
-rw-r--r-- | source3/include/proto.h | 6 | ||||
-rw-r--r-- | source3/namedbname.c | 31 | ||||
-rw-r--r-- | source3/nameservreply.c | 2 |
3 files changed, 28 insertions, 11 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h index c2fab68429..655b0fd360 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -338,8 +338,7 @@ BOOL name_equal(struct nmb_name *n1,struct nmb_name *n2); BOOL ms_browser_name(char *name, int type); void remove_name(struct subnet_record *d, struct name_record *n); struct name_record *find_name(struct name_record *n, - struct nmb_name *name, - int search); + struct nmb_name *name, int search); struct name_record *find_name_search(struct subnet_record **d, struct nmb_name *name, int search, struct in_addr ip); @@ -353,8 +352,7 @@ struct name_record *add_netbios_entry(struct subnet_record *d, int ttl, enum name_source source, struct in_addr ip, BOOL new_only,BOOL wins); void expire_names(time_t t); -struct name_record *dns_name_search(struct nmb_name *question, - int Time, int search); +struct name_record *dns_name_search(struct nmb_name *question, int Time); /*The following definitions come from namedbresp.c */ diff --git a/source3/namedbname.c b/source3/namedbname.c index 3a32088593..8f5514be53 100644 --- a/source3/namedbname.c +++ b/source3/namedbname.c @@ -140,8 +140,7 @@ void remove_name(struct subnet_record *d, struct name_record *n) find a name in a namelist. **************************************************************************/ struct name_record *find_name(struct name_record *n, - struct nmb_name *name, - int search) + struct nmb_name *name, int search) { struct name_record *ret; @@ -510,16 +509,17 @@ void expire_names(time_t t) /*************************************************************************** - reply to a name query + assume a WINS name is a dns name, and do a gethostbyname() on it. ****************************************************************************/ -struct name_record *dns_name_search(struct nmb_name *question, - int Time, int search) +struct name_record *dns_name_search(struct nmb_name *question, int Time) { int name_type = question->name_type; char *qname = question->name; + char *r; BOOL dns_type = (name_type == 0x20 || name_type == 0); struct in_addr dns_ip; struct subnet_record *d = find_subnet(ipgrp); + pstring dns_name; if (d == NULL) return NULL; @@ -532,8 +532,27 @@ struct name_record *dns_name_search(struct nmb_name *question, return NULL; } + StrnCpy(dns_name, qname, sizeof(dns_name)); + if ((r = strchr(dns_name,'.')) == NULL) + { + /* append a dot to the name, hopefully to stop DNS recursing */ + strcat(dns_name, "."); + +#ifdef NETGROUP + { + char domainname[255]; + + if (getdomainname(domainname, sizeof(domainname)) == 0) + { + /* we have a domain name - append it to the dns name */ + strcat(dns_name, domainname); + } + } +#endif + } + /* look it up with DNS */ - dns_ip.s_addr = interpret_addr(qname); + dns_ip.s_addr = interpret_addr(dns_name); if (!dns_ip.s_addr) { diff --git a/source3/nameservreply.c b/source3/nameservreply.c index f7df7c485b..df30e4ac41 100644 --- a/source3/nameservreply.c +++ b/source3/nameservreply.c @@ -563,7 +563,7 @@ void reply_name_query(struct packet_struct *p) */ if (success && !n && (lp_wins_proxy() || !bcast)) { - n = dns_name_search(question, p->timestamp, search); + n = dns_name_search(question, p->timestamp); } } |