On Thu, Aug 14, 2003 at 05:48:38PM -0400, John K. Sterling wrote:
> On Thursday, August 14, 2003, at 05:20 PM, Colm MacCarthaigh,,, wrote:
> 
> >Can you just confirm it's listening in v6 only ? the output of
> >"netstat -an | grep LISTEN" (Darwin has netstat and grep, right?)
> >should be enough.
> 
> heh.  very funny:
> 
> % netstat -an | grep LISTEN
> tcp46      0      0  *.80                   *.*                    
> LISTEN

good good, patch works so :) In which I'll now cc [EMAIL PROTECTED] and include 
the neccessary autoconf voodoo to fix OSX/Darwin.

-- 
Colm MacCárthaigh                        Public Key: [EMAIL PROTECTED]
[EMAIL PROTECTED]                                         http://www.stdlib.net/
Index: configure.in
===================================================================
RCS file: /home/cvspublic/apr/configure.in,v
retrieving revision 1.531
diff -u -r1.531 configure.in
--- configure.in        11 Aug 2003 17:40:38 -0000      1.531
+++ configure.in        14 Aug 2003 22:40:37 -0000
@@ -1778,17 +1778,6 @@
     fi ],
   [ user_disabled_ipv6=0 ] )
 
-case $host in
-  *apple-darwin*)
-    # It appears that Jaguar has all the right features, but
-    # getnameinfo() fails to find the hostname for a mapped
-    # address.
-    broken_ipv6=1
-    ;;
-  *)
-    broken_ipv6=0
-esac
-
 AC_SEARCH_LIBS(getaddrinfo, socket inet6)
 AC_SEARCH_LIBS(gai_strerror, socket inet6)
 AC_SEARCH_LIBS(getnameinfo, socket inet6)
@@ -1803,23 +1792,19 @@
 if test "$user_disabled_ipv6" = 1; then
     AC_MSG_RESULT([no -- disabled by user])
 else
-    if test "x$broken_ipv6" = "x0"; then
-        if test "x$have_sockaddr_in6" = "x1"; then
-            if test "x$ac_cv_working_getaddrinfo" = "xyes"; then
-                if test "x$ac_cv_working_getnameinfo" = "xyes"; then
-                    have_ipv6="1"
-                    AC_MSG_RESULT([yes])
-                else
-                    AC_MSG_RESULT([no -- no getnameinfo])
-                fi
+    if test "x$have_sockaddr_in6" = "x1"; then
+        if test "x$ac_cv_working_getaddrinfo" = "xyes"; then
+            if test "x$ac_cv_working_getnameinfo" = "xyes"; then
+                have_ipv6="1"
+                AC_MSG_RESULT([yes])
             else
-                AC_MSG_RESULT([no -- no working getaddrinfo])
+                AC_MSG_RESULT([no -- no getnameinfo])
             fi
         else
-            AC_MSG_RESULT([no -- no sockaddr_in6])
+            AC_MSG_RESULT([no -- no working getaddrinfo])
         fi
     else
-        AC_MSG_RESULT([no -- the platform has problems supporting IPv6])
+        AC_MSG_RESULT([no -- no sockaddr_in6])
     fi
 fi
 
Index: network_io/unix/sockaddr.c
===================================================================
RCS file: /home/cvspublic/apr/network_io/unix/sockaddr.c,v
retrieving revision 1.41
diff -u -r1.41 sockaddr.c
--- network_io/unix/sockaddr.c  14 Aug 2003 17:36:17 -0000      1.41
+++ network_io/unix/sockaddr.c  14 Aug 2003 22:40:38 -0000
@@ -634,9 +634,28 @@
      * a numeric address string if it fails to resolve the host name;
      * that is *not* what we want here
      */
+#ifdef DARWIN && APR_HAVE_IPV6
+    /* Darwin's getnameinfo does not work for IPv4-mapped-IPv6 addresses,
+     * the workaround is to convert the last 32 bits of the IPv6 address 
+     * to a valid sockaddr_in structure. This is extremely hacky, avoid
+     * re-use. */
+    if (sockaddr->family == AF_INET6 && 
IN6_IS_ADDR_V4MAPPED(&sockaddr->sa.sin6.sin6_addr))
+    {
+        struct apr_sockaddr_t tmpsa;
+
+        tmpsa.sa.sin.sin_family = AF_INET;
+        tmpsa.sa.sin.sin_addr.s_addr = ((uint32_t *)sockaddr->ipaddr_ptr)[3]; 
+
+        rc = getnameinfo((const struct sockaddr *)&tmpsa.sa, sizeof(struct 
sockaddr_in),
+                         tmphostname, sizeof(tmphostname), NULL, 0,
+                         flags != 0 ? flags : NI_NAMEREQD);
+    }
+    else
+#endif
     rc = getnameinfo((const struct sockaddr *)&sockaddr->sa, sockaddr->salen,
                      tmphostname, sizeof(tmphostname), NULL, 0,
                      flags != 0 ? flags : NI_NAMEREQD);
+
     if (rc != 0) {
         *hostname = NULL;
 

Reply via email to