From 5093bf804963cd90f1c6c6053c0417f78b945ca6 Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Sat, 18 Feb 2006 18:15:55 +0000 Subject: 2006-02-18 Guilhem Lavaux * native/jni/java-net/java_net_VMInetAddress.c: Fixed compilation errors. Removed any remaining TARGET invocations. * native/jni/java-net/javanet.c (_javanet_create_inetaddress): Removed spurious arr and octets. Fixed compilation errors. * native/jni/native-lib/cpnet.h (cpnet_getHostname, cpnet_getHostByName, cpnet_getHostByAddr, cpnet_setIPV4Any, cpnet_freeAddresses, cpnet_isIPV6Address, cpnet_isIPV4Address): New functions. (cpnet_bytesToIPV4Address): Fixed interface to be consistent with the rest. --- ChangeLog.native | 16 ++++++ native/jni/java-net/java_net_VMInetAddress.c | 85 ++++++++++++++++++---------- native/jni/java-net/javanet.c | 9 +-- native/jni/native-lib/cpnet.h | 34 ++++++++++- 4 files changed, 105 insertions(+), 39 deletions(-) diff --git a/ChangeLog.native b/ChangeLog.native index 21dd75864..34678ea21 100644 --- a/ChangeLog.native +++ b/ChangeLog.native @@ -1,3 +1,19 @@ +2006-02-18 Guilhem Lavaux + + * native/jni/java-net/java_net_VMInetAddress.c: Fixed compilation + errors. Removed any remaining TARGET invocations. + + * native/jni/java-net/javanet.c + (_javanet_create_inetaddress): Removed spurious arr and + octets. Fixed compilation errors. + + * native/jni/native-lib/cpnet.h + (cpnet_getHostname, cpnet_getHostByName, cpnet_getHostByAddr, + cpnet_setIPV4Any, cpnet_freeAddresses, cpnet_isIPV6Address, + cpnet_isIPV4Address): New functions. + (cpnet_bytesToIPV4Address): Fixed interface to be consistent with + the rest. + 2006-02-04 Guilhem Lavaux * Resynchronized with GNU Classpath's HEAD branch. diff --git a/native/jni/java-net/java_net_VMInetAddress.c b/native/jni/java-net/java_net_VMInetAddress.c index 67849416e..15da76879 100644 --- a/native/jni/java-net/java_net_VMInetAddress.c +++ b/native/jni/java-net/java_net_VMInetAddress.c @@ -66,7 +66,7 @@ Java_java_net_VMInetAddress_getLocalHostname (JNIEnv * env, jstring retval; #ifndef WITHOUT_NETWORK - result = cpnet_getHostname (hostname, sizeof (hostname)); + result = cpnet_getHostname (env, hostname, sizeof (hostname)); if (result != CPNATIVE_OK) { strcpy (hostname, "localhost"); @@ -91,6 +91,7 @@ Java_java_net_VMInetAddress_lookupInaddrAny (JNIEnv * env, __attribute__ ((__unused__))) { jarray IParray; + cpnet_address *addr; jbyte *octets; /* Allocate an array for the IP address */ @@ -105,11 +106,10 @@ Java_java_net_VMInetAddress_lookupInaddrAny (JNIEnv * env, octets = (*env)->GetByteArrayElements (env, IParray, 0); #ifndef WITHOUT_NETWORK - TARGET_NATIVE_NETWORK_INT_TO_IPADDRESS_BYTES (INADDR_ANY, - octets[0], - octets[1], - octets[2], octets[3]); - (*env)->ReleaseByteArrayElements (env, IParray, octets, 0); + addr = cpnet_newIPV4Address (env); + cpnet_setIPV4Any (addr); + cpnet_IPV4AddressToBytes (addr, octets); + cpnet_freeAddress (env, addr); #else /* not WITHOUT_NETWORK */ octets[0] = 0; octets[1] = 0; @@ -117,6 +117,8 @@ Java_java_net_VMInetAddress_lookupInaddrAny (JNIEnv * env, octets[3] = 0; #endif /* not WITHOUT_NETWORK */ + (*env)->ReleaseByteArrayElements (env, IParray, octets, 0); + return (IParray); } @@ -159,11 +161,11 @@ Java_java_net_VMInetAddress_getHostByAddr (JNIEnv * env, { case 4: addr = cpnet_newIPV4Address(env); - cpnet_bytesToIPV4Address (octets, addr); + cpnet_bytesToIPV4Address (addr, octets); break; case 16: - addr = cpnew_newIPV6Address(env); - cpnet_bytesToIPV6Address (octets, addr); + addr = cpnet_newIPV6Address(env); + cpnet_bytesToIPV6Address (addr, octets); break; default: JCL_ThrowException (env, UNKNOWN_HOST_EXCEPTION, "Bad IP Address"); @@ -175,7 +177,7 @@ Java_java_net_VMInetAddress_getHostByAddr (JNIEnv * env, (*env)->ReleaseByteArrayElements (env, arr, octets, 0); /* Resolve the address and return the name */ - result = cpnet_getHostByAddr (addr, hostname, sizeof (hostname)); + result = cpnet_getHostByAddr (env, addr, hostname, sizeof (hostname)); if (result != CPNATIVE_OK) { JCL_ThrowException (env, UNKNOWN_HOST_EXCEPTION, @@ -201,16 +203,14 @@ Java_java_net_VMInetAddress_getHostByName (JNIEnv * env, { #ifndef WITHOUT_NETWORK const char *hostname; -/* FIXME: limitation of max. 64 addresses - how to make it more flexibale? */ - int addresses[64]; + cpnet_address **addresses; jsize addresses_count; int result; jclass arr_class; jobjectArray addrs; - int i; + jint i, j; jbyte *octets; jarray ret_octets; - int max_addresses; /* Grab the hostname string */ hostname = (*env)->GetStringUTFChars (env, host, 0); @@ -220,11 +220,7 @@ Java_java_net_VMInetAddress_getHostByName (JNIEnv * env, return (jobjectArray) NULL; } - max_addresses = sizeof (addresses) / sizeof (addresses[0]); - TARGET_NATIVE_NETWORK_GET_HOSTNAME_BY_NAME (hostname, - addresses, - max_addresses, - addresses_count, result); + result = cpnet_getHostByName (env, hostname, &addresses, &addresses_count); if (result != CPNATIVE_OK) { JCL_ThrowException (env, UNKNOWN_HOST_EXCEPTION, (char *) hostname); @@ -249,25 +245,54 @@ Java_java_net_VMInetAddress_getHostByName (JNIEnv * env, /* Now loop and copy in each address */ for (i = 0; i < addresses_count; i++) { - ret_octets = (*env)->NewByteArray (env, 4); - if (!ret_octets) + if (cpnet_isIPV6Address (addresses[i])) { - JCL_ThrowException (env, UNKNOWN_HOST_EXCEPTION, "Internal Error"); - return (jobjectArray) NULL; + ret_octets = (*env)->NewByteArray (env, 16); + + if (!ret_octets) + { + JCL_ThrowException (env, UNKNOWN_HOST_EXCEPTION, "Internal Error"); + cpnet_freeAddresses (env, addresses, addresses_count); + return (jobjectArray) NULL; + } + + octets = (*env)->GetByteArrayElements (env, ret_octets, 0); + + cpnet_IPV6AddressToBytes (addresses[i], octets); + + (*env)->ReleaseByteArrayElements (env, ret_octets, octets, 0); + + (*env)->SetObjectArrayElement (env, addrs, i, ret_octets); } + else if (cpnet_isIPV4Address (addresses[i])) + { + ret_octets = (*env)->NewByteArray (env, 4); - octets = (*env)->GetByteArrayElements (env, ret_octets, 0); + if (!ret_octets) + { + JCL_ThrowException (env, UNKNOWN_HOST_EXCEPTION, "Internal Error"); + cpnet_freeAddresses (env, addresses, addresses_count); + return (jobjectArray) NULL; + } + + octets = (*env)->GetByteArrayElements (env, ret_octets, 0); - TARGET_NATIVE_NETWORK_INT_TO_IPADDRESS_BYTES (addresses[i], - octets[0], - octets[1], - octets[2], octets[3]); + cpnet_IPV4AddressToBytes (addresses[i], octets); - (*env)->ReleaseByteArrayElements (env, ret_octets, octets, 0); + (*env)->ReleaseByteArrayElements (env, ret_octets, octets, 0); - (*env)->SetObjectArrayElement (env, addrs, i, ret_octets); + (*env)->SetObjectArrayElement (env, addrs, i, ret_octets); + } + else + { + JCL_ThrowException (env, UNKNOWN_HOST_EXCEPTION, "Internal Error"); + cpnet_freeAddresses (env, addresses, addresses_count); + return (jobjectArray) NULL; + } } + cpnet_freeAddresses (env, addresses, addresses_count); + return (addrs); #else /* not WITHOUT_NETWORK */ return (jobjectArray) NULL; diff --git a/native/jni/java-net/javanet.c b/native/jni/java-net/javanet.c index f7a64e7de..7526dcc05 100644 --- a/native/jni/java-net/javanet.c +++ b/native/jni/java-net/javanet.c @@ -236,7 +236,7 @@ static jobject _javanet_create_inetaddress (JNIEnv * env, cpnet_address *netaddr) { #ifndef WITHOUT_NETWORK - unsigned char octets[4]; + jbyte octets[4]; char buf[16]; jclass ia_cls; jmethodID mid; @@ -676,8 +676,6 @@ _javanet_bind (JNIEnv * env, jobject this, jobject addr, jint port, int stream) { #ifndef WITHOUT_NETWORK - jbyteArray arr = 0; - jbyte *octets; jint fd; cpnet_address *tmpaddr; cpnet_address *local_addr; @@ -704,17 +702,12 @@ _javanet_bind (JNIEnv * env, jobject this, jobject addr, jint port, cpnet_freeAddress (env, tmpaddr); if (result != CPNATIVE_OK) { - (*env)->ReleaseByteArrayElements (env, arr, octets, 0); - JCL_ThrowException (env, BIND_EXCEPTION, cpnative_getErrorString (result)); return; } DBG ("_javanet_bind(): Past bind\n"); - - (*env)->ReleaseByteArrayElements (env, arr, octets, 0); - /* Update instance variables, specifically the local port number */ result = cpnet_getLocalAddr (env, fd, &local_addr); if (result != CPNATIVE_OK) diff --git a/native/jni/native-lib/cpnet.h b/native/jni/native-lib/cpnet.h index a1f8a9555..85a287a33 100644 --- a/native/jni/native-lib/cpnet.h +++ b/native/jni/native-lib/cpnet.h @@ -90,6 +90,9 @@ JNIEXPORT jint cpnet_getBindAddress (JNIEnv *env, jint fd, cpnet_address **addr) JNIEXPORT jint cpnet_addMembership (JNIEnv *env, jint fd, cpnet_address *addr); JNIEXPORT jint cpnet_dropMembership (JNIEnv *env, jint fd, cpnet_address *addr); JNIEXPORT jint cpnet_getAvailableBytes (JNIEnv *env, jint fd, jint *availableBytes); +JNIEXPORT jint cpnet_getHostname (JNIEnv *env, char *hostname, jint hostname_len); +JNIEXPORT jint cpnet_getHostByName (JNIEnv *env, const char *hostname, cpnet_address ***adresses, jint *addresses_count); +JNIEXPORT jint cpnet_getHostByAddr (JNIEnv *env, cpnet_address *addr, char *hostname, jint hostname_len); static inline cpnet_address *cpnet_newIPV4Address(JNIEnv * env) { @@ -102,6 +105,13 @@ static inline cpnet_address *cpnet_newIPV4Address(JNIEnv * env) return addr; } +static inline void cpnet_setIPV4Any(cpnet_address *addr) +{ + struct sockaddr_in *netaddr = (struct sockaddr_in *)&(addr->data[0]); + + netaddr->sin_addr.s_addr = INADDR_ANY; +} + static inline cpnet_address *cpnet_newIPV6Address(JNIEnv * env) { cpnet_address * addr = (cpnet_address *)JCL_malloc(env, sizeof(cpnet_address) + sizeof(struct sockaddr_in6)); @@ -118,6 +128,14 @@ static inline void cpnet_freeAddress(JNIEnv * env, cpnet_address *addr) JCL_free(env, addr); } +static void cpnet_freeAddresses(JNIEnv * env, cpnet_address **addr, jint addresses_count) +{ + jint i; + + for (i = 0; i < addresses_count; i++) + cpnet_freeAddress(env, addr[i]); +} + static inline void cpnet_addressSetPort(cpnet_address *addr, jint port) { struct sockaddr_in *ipaddr = (struct sockaddr_in *)&(addr->data[0]); @@ -140,6 +158,20 @@ static inline jboolean cpnet_isAddressEqual(cpnet_address *addr1, cpnet_address return memcmp(addr1->data, addr2->data, addr1->len) == 0; } +static inline jboolean cpnet_isIPV6Address(cpnet_address *addr) +{ + struct sockaddr_in *ipaddr = (struct sockaddr_in *)&(addr->data[0]); + + return ipaddr->sin_family == AF_INET6; +} + +static inline jboolean cpnet_isIPV4Address(cpnet_address *addr) +{ + struct sockaddr_in *ipaddr = (struct sockaddr_in *)&(addr->data[0]); + + return ipaddr->sin_family == AF_INET; +} + static inline void cpnet_IPV4AddressToBytes(cpnet_address *netaddr, jbyte *octets) { struct sockaddr_in *ipaddr = (struct sockaddr_in *)&(netaddr->data[0]); @@ -151,7 +183,7 @@ static inline void cpnet_IPV4AddressToBytes(cpnet_address *netaddr, jbyte *octet octets[3] = sysaddr & 0xff; } -static inline void cpnet_bytesToIPV4Address(cpnet_address *netaddr, unsigned char *octets) +static inline void cpnet_bytesToIPV4Address(cpnet_address *netaddr, jbyte *octets) { jint sysaddr; struct sockaddr_in *ipaddr = (struct sockaddr_in *)&(netaddr->data[0]); -- cgit v1.2.1