From e6275a2eaba64768994ee31fd6c10383afa087d4 Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Tue, 11 Jan 2005 11:08:30 +0000 Subject: 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 --- libc/inet/resolv.c | 23 ++++++++++++----------- 1 file 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; } } } -- cgit v1.2.3