[uClibc] resolv.c doesn't try all search domains
Jan Lana
Jan.Lana at Sun.COM
Thu Dec 2 11:36:39 UTC 2004
I'm sorry, resolv.c has more problems. There is a better patch.
regards,
- jenda
On Thu, Dec 02, 2004 at 11:39:39AM +0100, Jan Lana wrote:
> Hi,
>
> 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
> diff -ur uClibc.orig/libc/inet/resolv.c uClibc/libc/inet/resolv.c
> --- uClibc.orig/libc/inet/resolv.c 2004-09-07 12:34:35.000000000 +0200
> +++ uClibc/libc/inet/resolv.c 2004-12-02 12:00:06.000000000 +0100
> @@ -717,7 +717,7 @@
>
> strncpy(lookup,name,MAXDNAME);
> BIGLOCK;
> - if (variant < __searchdomains && strchr(lookup, '.') == NULL)
> + if (variant < __searchdomains)
> {
> strncat(lookup,".", MAXDNAME);
> strncat(lookup,__searchdomain[variant], MAXDNAME);
> @@ -884,7 +884,7 @@
> sdomains=__searchdomains;
> BIGUNLOCK;
>
> - if (variant < ((sdomains - 1) && strchr(lookup, '.') == NULL)) {
> + if (variant < sdomains - 1) {
> /* next search */
> variant++;
> } else {
> _______________________________________________
> uClibc mailing list
> uClibc at uclibc.org
> http://uclibc.org/mailman/listinfo/uclibc
-------------- next part --------------
diff -ur uClibc.orig/libc/inet/resolv.c uClibc/libc/inet/resolv.c
--- uClibc.orig/libc/inet/resolv.c 2004-09-07 12:34:35.000000000 +0200
+++ uClibc/libc/inet/resolv.c 2004-12-02 13:21:14.000000000 +0100
@@ -672,7 +672,7 @@
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 @@
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 @@
/* 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 @@
sdomains=__searchdomains;
BIGUNLOCK;
- if (variant < ((sdomains - 1) && strchr(lookup, '.') == NULL)) {
+ if (variant < sdomains - 1) {
/* next search */
variant++;
} else {
@@ -895,7 +896,7 @@
retries++;
UNLOCK;
- variant = 0;
+ variant = -1;
}
}
}
More information about the uClibc
mailing list