[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Behaviour of resoov
From: |
Martin Fuzzey |
Subject: |
Behaviour of resoov |
Date: |
Sat, 13 Dec 2003 01:30:18 +0100 |
User-agent: |
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.5) Gecko/20031007 |
Hi,
I am seeing the following behaviour with glibc2.2.5 (Mandrake 9.0)
hostname = myhost.example.net
no search or domain entries in /etc/resolv.conf
resolve attempt on "somehost"
=> DNS query sent to somehost.example.net. [1]
=> DNS query sent to somehost. [2]
resolve attempt on "somehost.somewhere"
=> DNS query sent to somehost.somewhere. [3]
=> DNS query sent to somehost.somewhere.example.net [4]
In particular this means that DNS queries are made from localhost in
some cases as has been noted
http://www.atm.tut.fi/list-archive/ipng/msg04751.html
I question case 2 therefore.
Indeed looking at the code from res_query.c
/* If there aren't any dots, it could be a user-level alias. */
if (!dots && (cp = res_hostalias(statp, name, tmp, sizeof tmp))!= NULL)
return (__libc_res_nquery(statp, cp, class, type, answer,
anslen, answerp));
/*
* If there are enough dots in the name, let's just give it a
* try 'as is'. The threshold can be set with the "ndots" option.
* Also, query 'as is', if there is a trailing dot in the name.
*/
saved_herrno = -1;
if (dots >= statp->ndots || trailing_dot) {
ret = __libc_res_nquerydomain(statp, name, NULL, class, type,
answer, anslen, answerp);
if (ret > 0 || trailing_dot)
return (ret);
saved_herrno = h_errno;
tried_as_is++;
if (answerp && *answerp != answer) {
answer = *answerp;
anslen = MAXPACKET;
}
}
/*
* We do at least one level of search if
* - there is no dot and RES_DEFNAME is set, or
* - there is at least one dot, there is no trailing dot,
* and RES_DNSRCH is set.
*/
if ((!dots && (statp->options & RES_DEFNAMES) != 0) ||
(dots && !trailing_dot && (statp->options & RES_DNSRCH) != 0)) {
int done = 0;
for (domain = (const char * const *)statp->dnsrch;
*domain && !done;
domain++) {
if (domain[0][0] == '\0' ||
(domain[0][0] == '.' && domain[0][1] == '\0'))
root_on_list++;
ret = __libc_res_nquerydomain(statp, name, *domain,
class, type,
answer, anslen, answerp);
SNIP
}
/*
* If the name has any dots at all, and no earlier 'as-is' query
* for the name, and "." is not on the search list, then try an as-is
* query now.
*/
if (statp->ndots && !(tried_as_is || root_on_list)) {
<=========== Doesn't seem coherent with comment above. Shouldn't this
be dots rathet than statp->ndots??
ret = __libc_res_nquerydomain(statp, name, NULL, class, type,
answer, anslen, answerp);
if (ret > 0)
return (ret);
}
The same code appears in the current glibc relasese (2.3.2)
I'm no DNS expert so I may be completely wrong but I'd be very
interested to know if this is "correct".
Regards,
Martin Fuzzey
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Behaviour of resoov,
Martin Fuzzey <=