? ksocketbufferhandler.cpp
? ksocketbufferhandler_p.h
Index: kresolverstandardworkers.cpp
===================================================================
RCS file: /home/kde/kdelibs/kdecore/network/kresolverstandardworkers.cpp,v
retrieving revision 1.14
diff -u -3 -p -r1.14 kresolverstandardworkers.cpp
--- kresolverstandardworkers.cpp	3 Dec 2004 20:40:07 -0000	1.14
+++ kresolverstandardworkers.cpp	25 Jan 2005 14:51:12 -0000
@@ -32,6 +32,7 @@
 #include <errno.h>
 #include <string.h>
 #include <stdlib.h>
+#include <unistd.h>
 
 #ifdef HAVE_NET_IF_H
 #include <net/if.h>
@@ -53,6 +54,23 @@ struct addrinfo;
 using namespace KNetwork;
 using namespace KNetwork::Internal;
 
+static bool hasIPv6()
+{
+#ifndef AF_INET6
+  return false;
+#else
+  if (getenv("KDE_NO_IPV6") != 0L)
+    return false;
+
+  int fd = ::socket(AF_INET6, SOCK_STREAM, 0);
+  if (fd == -1)
+    return false;
+
+  ::close(fd);
+  return true;
+#endif
+}
+
 namespace
 {
   /*
@@ -298,6 +316,9 @@ namespace
 	if (flags() & KResolver::NoResolve)
 	  hint.ai_flags |= AI_NUMERICHOST;
 # endif
+# ifdef AI_ADDRCONFIG
+	hint.ai_flags |= AI_ADDRCONFIG;
+# endif
 
 	// now we do the blocking processing
 	if (m_node.isEmpty())
@@ -732,9 +753,7 @@ bool KStandardWorker::run()
 #endif
   };
   int familyCount = sizeof(families)/sizeof(families[0]);
-  bool skipIPv6 = false;
-  if (getenv("KDE_NO_IPV6") != 0L)
-    skipIPv6 = true;
+  bool skipIPv6 = !hasIPv6();
   resultList.setAutoDelete(true);
 
   for (int i = 0; i < familyCount; i++)
