hi all,

the attached patch largely fixes the build on cygwin, and lets IPv6 dependant code only be built if we find IPv6 facilities.

cheers,
dalibor topic

2007-06-25  Dalibor Topic  <[EMAIL PROTECTED]>

        * native/jni/java-net/gnu_java_net_VMPlainSocketImpl.c
        (THROW_NO_IPV6): New macro.
        (Java_gnu_java_net_VMPlainSocketImpl_bind6) Conditionally
        build code if IPv6 facilities are available, otherwise
        throw an error.
        (Java_gnu_java_net_VMPlainSocketImpl_setMulticastInterface6,
        Java_gnu_java_net_VMPlainSocketImpl_join6,
        Java_gnu_java_net_VMPlainSocketImpl_leave6,
        Java_gnu_java_net_VMPlainSocketImpl_joinGroup6,
        Java_gnu_java_net_VMPlainSocketImpl_leaveGroup6)
        Use THROW_NO_IPV6.

        * native/jni/java-net/java_net_VMInetAddress.c
        (Java_java_net_VMInetAddress_getHostByAddr,
        Java_java_net_VMInetAddress_getHostByName,
        Java_java_net_VMInetAddress_aton) Build IPv6 dependant
        code conditionally on IPv6 facilities being available.
        Switched if-else blocks where necessary to allow that.

        * native/jni/java-net/javanet.c
        (_javanet_get_ip_netaddr) Build IPv6 dependant code conditionally
        on IPv6 facilities being available.

        * native/jni/native-lib/cpnet.c
        (cpnet_getHostByName, cpnet_getHostByAddr) Build IPv6 dependant
        code conditionally on IPv6 facilities being available.
        (cpnet_aton) Moved variable declaration of inet6_addr to the scope
        of its use. Build IPv6 dependant code conditionally
        on IPv6 facilities being available.

        * native/jni/native-lib/cpnet.h (cpnet_newIPV6Address,
        cpnet_isIPV6Address, cpnet_IPV6AddressToBytes,
        cpnet_bytesToIPV6Address): Make IPv6 dependant utility functions
        available conditionally on IPv6 facilities being available.

--- native/jni/java-net/gnu_java_net_VMPlainSocketImpl.c	26 Nov 2006 13:31:27 -0000	1.14
+++ native/jni/java-net/gnu_java_net_VMPlainSocketImpl.c	24 Jun 2007 20:38:38 -0000
@@ -69,6 +69,7 @@
 #include "gnu_java_net_VMPlainSocketImpl.h"
 
 #define THROW_NO_NETWORK(env) JCL_ThrowException (env, "java/lang/InternalError", "this platform not configured for network support")
+#define THROW_NO_IPV6(env)    JCL_ThrowException (env, "java/lang/InternalError", "IPv6 support not available")
 
 /*
  * Class:     gnu_java_net_VMPlainSocketImpl
@@ -120,7 +121,7 @@
                                            jclass c __attribute__((unused)),
                                            jint fd, jbyteArray addr, jint port)
 {
-  /* FIXME! Add check if we have IPv6! */
+#ifdef HAVE_INET6
   struct sockaddr_in6 sockaddr;
   jbyte *elems;
   int ret;
@@ -141,6 +142,9 @@
 
   if (-1 == ret)
     JCL_ThrowException (env, IO_EXCEPTION, strerror (errno));
+#else
+  THROW_NO_IPV6(env);
+#endif
 }
 
 
@@ -442,8 +446,7 @@
 #endif /* HAVE_INET6 */
 #else
   (void) fd;
-  JCL_ThrowException (env, "java/lang/InternalError",
-                      "socket options not supported");
+  THROW_NO_IPV6(env);
 #endif /* HAVE_SETSOCKOPT */
 }
 
@@ -582,8 +585,7 @@
 #else
   (void) fd;
   (void) addr;
-  JCL_ThrowException (env, "java/lang/InternalError",
-                      "IPv6 support not available");
+  THROW_NO_IPV6(env);
 #endif /* HAVE_INET6 */
 #else
   (void) fd;
@@ -657,8 +659,7 @@
 #else
   (void) fd;
   (void) addr;
-  JCL_ThrowException (env, "java/lang/InternalError",
-                      "IPv6 support not available");
+  THROW_NO_IPV6(env);
 #endif /* HAVE_INET6 */
 #else
   (void) fd;
@@ -763,8 +764,7 @@
 #else
   (void) fd;
   (void) addr;
-  JCL_ThrowException (env, "java/lang/InternalError",
-                      "IPv6 support not available");
+  THROW_NO_IPV6(env);
 #endif /* HAVE_INET6 */
 #else
   (void) fd;
@@ -865,8 +865,7 @@
 #else
   (void) fd;
   (void) addr;
-  JCL_ThrowException (env, "java/lang/InternalError",
-                      "IPv6 support not available");
+  THROW_NO_IPV6(env);
 #endif /* HAVE_INET6 */
 #else
   (void) fd;
Index: native/jni/java-net/java_net_VMInetAddress.c
===================================================================
RCS file: /sources/classpath/classpath/native/jni/java-net/java_net_VMInetAddress.c,v
retrieving revision 1.9
--- native/jni/java-net/javanet.c	25 Oct 2006 00:39:02 -0000	1.37
+++ native/jni/java-net/javanet.c	24 Jun 2007 20:38:39 -0000
@@ -395,10 +395,12 @@
       netaddr = cpnet_newIPV4Address(env);
       cpnet_bytesToIPV4Address(netaddr, octets);
       break;
+#ifdef HAVE_INET6
     case 16:
       netaddr = cpnet_newIPV6Address(env);
       cpnet_bytesToIPV6Address(netaddr, octets);
       break;
+#endif
     default:
       /* This should not happen as we have checked before.
        * But that way we shut the compiler warnings */
Index: native/jni/java-nio/gnu_java_nio_VMChannel.c
===================================================================
RCS file: /sources/classpath/classpath/native/jni/java-nio/gnu_java_nio_VMChannel.c,v
retrieving revision 1.19
--- native/jni/java-net/java_net_VMInetAddress.c	8 Sep 2006 08:59:57 -0000	1.9
+++ native/jni/java-net/java_net_VMInetAddress.c	24 Jun 2007 20:38:38 -0000
@@ -163,10 +163,12 @@
       addr = cpnet_newIPV4Address(env);
       cpnet_bytesToIPV4Address (addr, octets);      
       break;
+#ifdef HAVE_INET6
     case 16:
       addr = cpnet_newIPV6Address(env);
       cpnet_bytesToIPV6Address (addr, octets);
       break;
+#endif
     default:
       JCL_ThrowException (env, UNKNOWN_HOST_EXCEPTION, "Bad IP Address");
       return (jstring) NULL;
@@ -245,9 +247,9 @@
   /* Now loop and copy in each address */
   for (i = 0; i < addresses_count; i++)
     {
-      if (cpnet_isIPV6Address (addresses[i]))
+      if (cpnet_isIPV4Address (addresses[i]))
 	{
-	  ret_octets = (*env)->NewByteArray (env, 16);
+	  ret_octets = (*env)->NewByteArray (env, 4);
 
 	  if (!ret_octets)
 	    {
@@ -258,15 +260,16 @@
 	  
 	  octets = (*env)->GetByteArrayElements (env, ret_octets, 0);
 
-	  cpnet_IPV6AddressToBytes (addresses[i], octets);
+	  cpnet_IPV4AddressToBytes (addresses[i], octets);
 
 	  (*env)->ReleaseByteArrayElements (env, ret_octets, octets, 0);
 
 	  (*env)->SetObjectArrayElement (env, addrs, i, ret_octets);
 	}
-      else if (cpnet_isIPV4Address (addresses[i]))
+#ifdef HAVE_INET6
+      else if (cpnet_isIPV6Address (addresses[i]))
 	{
-	  ret_octets = (*env)->NewByteArray (env, 4);
+	  ret_octets = (*env)->NewByteArray (env, 16);
 
 	  if (!ret_octets)
 	    {
@@ -277,12 +280,13 @@
 	  
 	  octets = (*env)->GetByteArrayElements (env, ret_octets, 0);
 
-	  cpnet_IPV4AddressToBytes (addresses[i], octets);
+	  cpnet_IPV6AddressToBytes (addresses[i], octets);
 
 	  (*env)->ReleaseByteArrayElements (env, ret_octets, octets, 0);
 
 	  (*env)->SetObjectArrayElement (env, addrs, i, ret_octets);
 	}
+#endif
       else
 	{
 	  JCL_ThrowException (env, UNKNOWN_HOST_EXCEPTION, "Internal Error");
@@ -336,9 +340,9 @@
   if (!address)
     return (jbyteArray) NULL;
 
-  if (cpnet_isIPV6Address (address))
+  if (cpnet_isIPV4Address (address))
     {
-      ret_octets = (jbyteArray) (*env)->NewByteArray (env, 16);
+      ret_octets = (jbyteArray) (*env)->NewByteArray (env, 4);
 
       if (!ret_octets)
 	{
@@ -349,13 +353,14 @@
 	  
       octets = (*env)->GetByteArrayElements (env, ret_octets, 0);
 
-      cpnet_IPV6AddressToBytes (address, octets);
+      cpnet_IPV4AddressToBytes (address, octets);
 
       (*env)->ReleaseByteArrayElements (env, ret_octets, octets, 0);
     }
-  else if (cpnet_isIPV4Address (address))
+#ifdef HAVE_INET6
+  else if (cpnet_isIPV6Address (address))
     {
-      ret_octets = (jbyteArray) (*env)->NewByteArray (env, 4);
+      ret_octets = (jbyteArray) (*env)->NewByteArray (env, 16);
 
       if (!ret_octets)
 	{
@@ -366,10 +371,11 @@
 	  
       octets = (*env)->GetByteArrayElements (env, ret_octets, 0);
 
-      cpnet_IPV4AddressToBytes (address, octets);
+      cpnet_IPV6AddressToBytes (address, octets);
 
       (*env)->ReleaseByteArrayElements (env, ret_octets, octets, 0);
     }
+#endif
   else
     {
       JCL_ThrowException (env, UNKNOWN_HOST_EXCEPTION, "Internal Error");
Index: native/jni/java-net/javanet.c
===================================================================
RCS file: /sources/classpath/classpath/native/jni/java-net/javanet.c,v
retrieving revision 1.37
--- native/jni/native-lib/cpnet.c	17 Apr 2007 21:46:27 -0000	1.8
+++ native/jni/native-lib/cpnet.c	24 Jun 2007 20:38:40 -0000
@@ -693,6 +693,7 @@
 	  cpnet_bytesToIPV4Address(addr_arr[i], (jbyte *)hret.h_addr_list[i]);
 	}
       break;
+#ifdef HAVE_INET6
     case AF_INET6:
       for (i = 0; i < counter; i++)
 	{
@@ -700,6 +701,7 @@
 	  cpnet_bytesToIPV6Address(addr_arr[i], (jbyte *)hret.h_addr_list[i]);
 	}
       break;
+#endif
     default:
       *addresses_count = 0;
       JCL_free(env, addr_arr);
@@ -732,12 +734,14 @@
       addr_len = sizeof(haddr.addr_v4->sin_addr);
       addr_type = AF_INET;
     }
+#ifdef HAVE_INET6
   else if (haddr.addr_v6->sin6_family == AF_INET6)
     {
       raw_addr = &haddr.addr_v6->sin6_addr;
       addr_type = AF_INET6;
       addr_len = sizeof(haddr.addr_v6->sin6_addr);
     }
+#endif
   else
     return EINVAL;
 
@@ -762,9 +766,6 @@
 jint cpnet_aton (JNIEnv *env, const char *hostname, cpnet_address **addr)
 {
   jbyte *bytes = NULL;
-#ifdef HAVE_INET_PTON
-  jbyte inet6_addr[16];
-#endif
 
 #ifdef HAVE_INET_ATON
   struct in_addr laddr;
@@ -789,9 +790,11 @@
       return 0;
     }
 
-#ifdef HAVE_INET_PTON
+#if defined(HAVE_INET_PTON) && defined(HAVE_INET6)
   if (inet_pton (AF_INET6, hostname, inet6_addr) > 0)
     {
+      jbyte inet6_addr[16];
+
       *addr = cpnet_newIPV6Address(env);
       cpnet_bytesToIPV6Address(*addr, inet6_addr);
       return 0;
Index: native/jni/native-lib/cpnet.h
===================================================================
RCS file: /sources/classpath/classpath/native/jni/native-lib/cpnet.h,v
retrieving revision 1.4
--- native/jni/native-lib/cpnet.h	7 Jan 2007 22:08:10 -0000	1.4
+++ native/jni/native-lib/cpnet.h	24 Jun 2007 20:38:40 -0000
@@ -117,6 +117,7 @@
   netaddr->sin_addr.s_addr = INADDR_ANY;
 }
 
+#ifdef HAVE_INET6
 static inline cpnet_address *cpnet_newIPV6Address(JNIEnv * env)
 {
   cpnet_address * addr = (cpnet_address *)JCL_malloc(env, sizeof(cpnet_address) + sizeof(struct sockaddr_in6));
@@ -128,6 +129,7 @@
 
   return addr;
 }
+#endif
 
 static inline void cpnet_freeAddress(JNIEnv * env, cpnet_address *addr)
 {
@@ -156,12 +158,14 @@
   return memcmp(addr1->data, addr2->data, addr1->len) == 0;
 }
 
+#ifdef HAVE_INET6
 static inline jboolean cpnet_isIPV6Address(cpnet_address *addr)
 {
   struct sockaddr_in *ipaddr = (struct sockaddr_in *)&(addr->data[0]);
 
   return ipaddr->sin_family == AF_INET6;
 }
+#endif
 
 static inline jboolean cpnet_isIPV4Address(cpnet_address *addr)
 {
@@ -194,6 +198,7 @@
   ipaddr->sin_addr.s_addr = htonl(sysaddr);
 }
 
+#ifdef HAVE_INET6
 static inline void cpnet_IPV6AddressToBytes(cpnet_address *netaddr, jbyte *octets)
 {
   struct sockaddr_in6 *ipaddr = (struct sockaddr_in6 *)&(netaddr->data[0]);
@@ -207,5 +212,6 @@
 
   memcpy(&ipaddr->sin6_addr, octets, 16);
 }
+#endif
 
 #endif
Index: tools/Makefile.am
===================================================================
RCS file: /sources/classpath/classpath/tools/Makefile.am,v
retrieving revision 1.40

Reply via email to