summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuilhem Lavaux <guilhem@kaffe.org>2006-02-18 18:15:55 +0000
committerGuilhem Lavaux <guilhem@kaffe.org>2006-02-18 18:15:55 +0000
commit5093bf804963cd90f1c6c6053c0417f78b945ca6 (patch)
tree21b118c5cbddb67da8c675630d93ccaf331077a7
parent3af9dde820e3a7f8194964ec9dcc8539dd4af2b8 (diff)
downloadclasspath-5093bf804963cd90f1c6c6053c0417f78b945ca6.tar.gz
2006-02-18 Guilhem Lavaux <guilhem@kaffe.org>
* 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.
-rw-r--r--ChangeLog.native16
-rw-r--r--native/jni/java-net/java_net_VMInetAddress.c85
-rw-r--r--native/jni/java-net/javanet.c9
-rw-r--r--native/jni/native-lib/cpnet.h34
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 <guilhem@kaffe.org>
+
+ * 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 <guilhem@kaffe.org>
* 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]);