[fetchmail]IPv6 DNS Problems

Matthias Andree matthias.andree@gmx.de
Mon, 11 Jul 2005 04:44:05 +0200


Sebastian Wiesinger <fetchmail@tracker.fire-world.de> writes:

> * Sebastian Wiesinger <fetchmail@tracker.fire-world.de> [2005-03-28 01:33]:
>> I attached my hotfix for this (which is poorly written, but works for
>> me) to this mail.
>
> I made a new diff because I forgot to include the whole "else" tree
> for IPv6. :(
>
> It would be nice if someone could implement something (better) like
> that.

Done. See 6.2.6-pre4, which uses the POSIX-standardized getaddrinfo()
rather than the less portable resolver. OTOH it assumes that you have
gethostbyname if you have getaddrinfo.

Please test either 6.2.6-pre4 from http://home.pages.de/~mandree/fetchmail/ 
or this patch (I don't even know if it applies - it was ripped from SVN
and edited to avoid obvious conflicts).

--- configure.ac~
+++ configure.ac
@@ -29,7 +29,7 @@
 AC_CHECK_HEADERS([unistd.h termios.h termio.h sgtty.h stdarg.h \
 	alloca.h sys/itimer.h fcntl.h sys/fcntl.h memory.h sys/wait.h \
 	arpa/inet.h arpa/nameser.h netinet/in.h net/socket.h \
-	sys/select.h sys/time.h langinfo.h])
+	sys/select.h sys/socket.h sys/time.h langinfo.h])
 AC_CHECK_HEADERS([resolv.h],,,[
 #include <sys/types.h>
 #ifdef HAVE_NETINET_IN_H
--- driver.c~
+++ driver.c
@@ -28,6 +28,9 @@
 #include <sys/wait.h>
 #endif
 
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
 #ifdef HAVE_NET_SOCKET_H
 #include <net/socket.h>
 #endif
@@ -1005,8 +1008,35 @@
 	    }
 	    else
 	    {
+#ifdef INET6_ENABLE
+		struct addrinfo hints, *res;
+		int error;
+
+		memset(&hints, 0, sizeof(hints));
+		hints.ai_socktype = SOCK_STREAM;
+		hints.ai_family = AF_UNSPEC;
+		hints.ai_flags = AI_CANONNAME;
+
+		error = getaddrinfo(ctl->server.queryname, NULL, &hints, &res);
+		if (error)
+		{
+		    report(stderr,
+			   GT_("couldn't find canonical DNS name of %s (%s)\n"),
+			   ctl->server.pollname, ctl->server.queryname);
+		    err = PS_DNS;
+		    set_timeout(0);
+		    phase = oldphase;
+		    goto closeUp;
+		}
+		else
+		{
+		    ctl->server.truename=xstrdup(res->ai_canonname);
+		    ctl->server.trueaddr=xmalloc(res->ai_addrlen);
+		    memcpy(ctl->server.trueaddr, res->ai_addr, res->ai_addrlen);
+		}
+#else
 		struct hostent	*namerec;
-		    
+ 
 		/* 
 		 * Get the host's IP, so we can report it like this:
 		 *
@@ -1032,6 +1062,7 @@
 			   namerec->h_addr_list[0],
 			   namerec->h_length);
 		}
+#endif
 	    }
 	}
 #endif /* HAVE_GETHOSTBYNAME */


-- 
Matthias Andree