diff options
author | Eric Andersen <andersen@codepoet.org> | 2005-01-11 11:08:30 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2005-01-11 11:08:30 +0000 |
commit | e6275a2eaba64768994ee31fd6c10383afa087d4 (patch) | |
tree | 0a22d7c5c568f3f64595d089a0e0b2208339c538 /libc/inet | |
parent | 9d003b2598ee67bd1f1265735a558439d224938a (diff) |
Jan Lana writes:
uClibc resolver doesn't lookup all search domains.
For example, if you have computer 'jenda.prague.my.cz' and resolv.conf:
search my.cz
nameserver xx.xx.xx.xx
try this:
ping jenda.prague.my.cz #works
ping jenda.prague #unknown host
libc/inet/resolv.c doesn't want to try search domains if the domain name
contains '.'. I don't find any reason for the behaviour in literature
and it is inconsistent with the glibc.
Patch is attached.
regards,
- jenda
Diffstat (limited to 'libc/inet')
-rw-r--r-- | libc/inet/resolv.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/libc/inet/resolv.c b/libc/inet/resolv.c index d96b2b79a..87d1cbe8b 100644 --- a/libc/inet/resolv.c +++ b/libc/inet/resolv.c @@ -672,7 +672,7 @@ int __dns_lookup(const char *name, int type, int nscount, char **nsip, int retries = 0; unsigned char * packet = malloc(PACKETSZ); char *dns, *lookup = malloc(MAXDNAME); - int variant = 0; + int variant = -1; struct sockaddr_in sa; #ifdef __UCLIBC_HAS_IPV6__ int v6; @@ -716,13 +716,14 @@ int __dns_lookup(const char *name, int type, int nscount, char **nsip, goto fail; strncpy(lookup,name,MAXDNAME); - BIGLOCK; - if (variant < __searchdomains && strchr(lookup, '.') == NULL) - { - strncat(lookup,".", MAXDNAME); - strncat(lookup,__searchdomain[variant], MAXDNAME); - } - BIGUNLOCK; + if (variant >= 0) { + BIGLOCK; + if (variant < __searchdomains) { + strncat(lookup,".", MAXDNAME); + strncat(lookup,__searchdomain[variant], MAXDNAME); + } + BIGUNLOCK; + } DPRINTF("lookup name: %s\n", lookup); q.dotted = (char *)lookup; q.qtype = type; @@ -866,7 +867,7 @@ int __dns_lookup(const char *name, int type, int nscount, char **nsip, /* if there are other nameservers, give them a go, otherwise return with error */ { - variant = 0; + variant = -1; LOCK; ns = (ns + 1) % nscount; if (ns == 0) @@ -884,7 +885,7 @@ int __dns_lookup(const char *name, int type, int nscount, char **nsip, sdomains=__searchdomains; BIGUNLOCK; - if (variant < ((sdomains - 1) && strchr(lookup, '.') == NULL)) { + if (variant < sdomains - 1) { /* next search */ variant++; } else { @@ -895,7 +896,7 @@ int __dns_lookup(const char *name, int type, int nscount, char **nsip, retries++; UNLOCK; - variant = 0; + variant = -1; } } } |