summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/proto.h6
-rw-r--r--source3/namedbname.c31
-rw-r--r--source3/nameservreply.c2
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);
}
}