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