aboutsummaryrefslogtreecommitdiff
path: root/libc/inet/resolv.c
diff options
context:
space:
mode:
authorGravatar Eric Andersen <andersen@codepoet.org>2005-01-11 11:08:30 +0000
committerGravatar Eric Andersen <andersen@codepoet.org>2005-01-11 11:08:30 +0000
commite6275a2eaba64768994ee31fd6c10383afa087d4 (patch)
tree0a22d7c5c568f3f64595d089a0e0b2208339c538 /libc/inet/resolv.c
parent9d003b2598ee67bd1f1265735a558439d224938a (diff)
downloaduClibc-e6275a2eaba64768994ee31fd6c10383afa087d4.tar.gz
uClibc-e6275a2eaba64768994ee31fd6c10383afa087d4.tar.bz2
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/resolv.c')
-rw-r--r--libc/inet/resolv.c23
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;
}
}
}