1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-12 09:18:10 +03:00

dealing with name queries and dns lookups etc.

lkcl
(This used to be commit 98cb371244)
This commit is contained in:
Samba Release Account 1996-10-24 17:48:06 +00:00
parent 8a7c1bd335
commit e010ad006e
3 changed files with 48 additions and 53 deletions

View File

@ -353,9 +353,8 @@ 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 *search_for_name(struct subnet_record **d,
struct nmb_name *question,
struct in_addr ip, int Time, int search);
struct name_record *dns_name_search(struct nmb_name *question,
int Time, int search);
/*The following definitions come from namedbresp.c */
@ -739,9 +738,6 @@ struct smb_passwd *get_smbpwnam(char *name);
/*The following definitions come from smbrun.c */
/*The following definitions come from smbwizard.c */
/*The following definitions come from status.c */
void Ucrit_addUsername(pstring username);

View File

@ -512,24 +512,21 @@ void expire_names(time_t t)
/***************************************************************************
reply to a name query
****************************************************************************/
struct name_record *search_for_name(struct subnet_record **d,
struct nmb_name *question,
struct in_addr ip, int Time, int search)
struct name_record *dns_name_search(struct nmb_name *question,
int Time, int search)
{
struct subnet_record *d = find_subnet(ipgrp);
int name_type = question->name_type;
char *qname = question->name;
BOOL dns_type = (name_type == 0x20 || name_type == 0);
struct name_record *n;
if (d == NULL) return NULL;
DEBUG(3,("Search for %s from %s - ", namestr(question), inet_ntoa(ip)));
/* first look up name in cache */
n = find_name_search(d,question,search,ip);
if (*d == NULL) return NULL;
if (!n && (search & FIND_SELF)) {
if (!n && (search & FIND_SELF))
{
if (!lp_wins_proxy())
DEBUG(3,("wins proxy not enabled - failing lookup\n"));
else
@ -541,7 +538,6 @@ struct name_record *search_for_name(struct subnet_record **d,
if (!n)
{
struct in_addr dns_ip;
uint32 a;
/* only do DNS lookups if the query is for type 0x20 or type 0x0 */
if (!dns_type && name_type != 0x1b)
@ -551,11 +547,9 @@ struct name_record *search_for_name(struct subnet_record **d,
}
/* look it up with DNS */
a = interpret_addr(qname);
dns_ip.s_addr = interpret_addr(qname);
putip((char *)&dns_ip,(char *)&a);
if (!a)
if (dns_ip.s_addr)
{
/* no luck with DNS. We could possibly recurse here XXXX */
DEBUG(3,("no recursion.\n"));
@ -573,21 +567,6 @@ struct name_record *search_for_name(struct subnet_record **d,
if (!n) return NULL;
}
/* is our entry already dead? */
if (n->death_time)
{
if (n->death_time < Time) return False;
}
/* it may have been an earlier failure */
if (n->source == DNSFAIL)
{
DEBUG(3,("DNSFAIL\n"));
return NULL;
}
DEBUG(3,("OK %s\n",inet_ntoa(n->ip_flgs[0].ip)));
return n;
}

View File

@ -509,10 +509,6 @@ void reply_name_query(struct packet_struct *p)
int search = bcast ? FIND_LOCAL | FIND_WINS: FIND_WINS;
if (!lp_wins_proxy()) {
search |= FIND_SELF;
}
if (search & FIND_LOCAL)
{
if (!(d = find_req_subnet(p->ip, bcast)))
@ -547,13 +543,42 @@ void reply_name_query(struct packet_struct *p)
success = False;
}
if (success && (n = search_for_name(&d,question,p->ip,p->timestamp, search)))
if (success)
{
/* don't respond to broadcast queries unless the query is for
a name we own or it is for a Primary Domain Controller name */
/* look up the name in the cache */
n = find_name_search(&d, question, p->ip, search));
if (bcast && n->source != SELF && name_type != 0x1b) {
if (!lp_wins_proxy() || same_net(p->ip,n->ip_flgs[0].ip,*iface_nmask(p->ip))) {
/* it is a name that already failed DNS lookup or it's expired */
if (n->source == DNSFAIL ||
(n->death_time && n->death_time < p->timestamp))
{
success = False;
}
/* do we want to do dns lookups? */
/* XXXX this DELAYS nmbd while it does a search. not a good idea
but there's no pleasant alternative. phil@hands.com suggested
making the name a full DNS name, which would succeed / fail
much quicker.
*/
if (success && !n && (lp_wins_proxy() || !bcast))
{
n = dns_name_search(question, p->timestamp, search);
}
}
if (!n) success = False;
if (success)
{
if (bcast && n->source != SELF && name_type != 0x1b)
{
/* don't respond to broadcast queries unless the query is for
a name we own or it is for a Primary Domain Controller name */
if (!lp_wins_proxy() ||
same_net(p->ip,n->ip_flgs[0].ip,*iface_nmask(p->ip)))
{
/* never reply with a negative response to broadcast queries */
return;
}
@ -573,12 +598,9 @@ void reply_name_query(struct packet_struct *p)
retip = n->ip_flgs[0].ip;
nb_flags = n->ip_flgs[0].nb_flags;
}
else
{
if (bcast) return; /* never reply negative response to bcasts */
success = False;
}
if (!success && bcast) return; /* never reply negative response to bcasts */
/* if the IP is 0 then substitute my IP */
if (zero_ip(retip)) retip = *iface_ip(p->ip);
@ -608,5 +630,3 @@ void reply_name_query(struct packet_struct *p)
ttl,
rdata, success ? 6 : 0);
}