diff options
Diffstat (limited to 'native/jni/java-net/java_net_VMInetAddress.c')
-rw-r--r-- | native/jni/java-net/java_net_VMInetAddress.c | 118 |
1 files changed, 75 insertions, 43 deletions
diff --git a/native/jni/java-net/java_net_VMInetAddress.c b/native/jni/java-net/java_net_VMInetAddress.c index 86ac06e6f..2ca0545fe 100644 --- a/native/jni/java-net/java_net_VMInetAddress.c +++ b/native/jni/java-net/java_net_VMInetAddress.c @@ -45,13 +45,10 @@ exception statement from your version. */ #include <jni.h> #include <jcl.h> +#include "cpnative.h" +#include "cpnet.h" #include "javanet.h" -#include "target_native.h" -#ifndef WITHOUT_NETWORK -#include "target_native_network.h" -#endif /* WITHOUT_NETWORK */ - #include "java_net_VMInetAddress.h" /*************************************************************************/ @@ -69,8 +66,8 @@ Java_java_net_VMInetAddress_getLocalHostname (JNIEnv * env, jstring retval; #ifndef WITHOUT_NETWORK - TARGET_NATIVE_NETWORK_GET_HOSTNAME (hostname, sizeof (hostname), result); - if (result != TARGET_NATIVE_OK) + result = cpnet_getHostname (env, hostname, sizeof (hostname)); + if (result != CPNATIVE_OK) { strcpy (hostname, "localhost"); } @@ -94,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 */ @@ -108,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; @@ -120,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); } @@ -138,14 +137,14 @@ Java_java_net_VMInetAddress_getHostByAddr (JNIEnv * env, #ifndef WITHOUT_NETWORK jbyte *octets; jsize len; - int addr; + cpnet_address *addr; char hostname[255]; int result; jstring retval; /* Grab the byte[] array with the IP out of the input data */ len = (*env)->GetArrayLength (env, arr); - if (len != 4) + if (len != 4 && len != 16) { JCL_ThrowException (env, UNKNOWN_HOST_EXCEPTION, "Bad IP Address"); return (jstring) NULL; @@ -158,21 +157,31 @@ Java_java_net_VMInetAddress_getHostByAddr (JNIEnv * env, return (jstring) NULL; } - /* Convert it to a 32 bit address */ - TARGET_NATIVE_NETWORK_IPADDRESS_BYTES_TO_INT (octets[0], - octets[1], - octets[2], octets[3], addr); + switch (len) + { + case 4: + addr = cpnet_newIPV4Address(env); + cpnet_bytesToIPV4Address (addr, octets); + break; + case 16: + addr = cpnet_newIPV6Address(env); + cpnet_bytesToIPV6Address (addr, octets); + break; + default: + JCL_ThrowException (env, UNKNOWN_HOST_EXCEPTION, "Bad IP Address"); + return (jstring) NULL; + + } /* Release some memory */ (*env)->ReleaseByteArrayElements (env, arr, octets, 0); /* Resolve the address and return the name */ - TARGET_NATIVE_NETWORK_GET_HOSTNAME_BY_ADDRESS (addr, hostname, - sizeof (hostname), result); - if (result != TARGET_NATIVE_OK) + result = cpnet_getHostByAddr (env, addr, hostname, sizeof (hostname)); + if (result != CPNATIVE_OK) { JCL_ThrowException (env, UNKNOWN_HOST_EXCEPTION, - TARGET_NATIVE_LAST_ERROR_STRING ()); + cpnative_getErrorString (result)); return (jstring) NULL; } @@ -194,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; jbyte *octets; jarray ret_octets; - int max_addresses; /* Grab the hostname string */ hostname = (*env)->GetStringUTFChars (env, host, 0); @@ -213,12 +220,8 @@ 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); - if (result != TARGET_NATIVE_OK) + result = cpnet_getHostByName (env, hostname, &addresses, &addresses_count); + if (result != CPNATIVE_OK || addresses_count == 0) { JCL_ThrowException (env, UNKNOWN_HOST_EXCEPTION, (char *) hostname); return (jobjectArray) NULL; @@ -242,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; |