diff options
author | Guilhem Lavaux <guilhem@kaffe.org> | 2006-07-09 16:23:33 +0000 |
---|---|---|
committer | Guilhem Lavaux <guilhem@kaffe.org> | 2006-07-09 16:23:33 +0000 |
commit | 4714fb23de2d811f49438611ac0d13ccd302e1ea (patch) | |
tree | 89df2b9afc4eaddb66e574a5255dcedc9f92bbcf | |
parent | cf7a1bcdc5948bada2d0a6bb2a860c248d82c233 (diff) | |
download | classpath-4714fb23de2d811f49438611ac0d13ccd302e1ea.tar.gz |
2006-07-09 Guilhem Lavaux <guilhem@kaffe.org>
* native/jni/java-net/gnu_java_net_VMPlainDatagramSocketImpl.c
(nativeReceive): Fixed the type of the arrays (use java types).
(nativeSendTo): Force throwing an exception if port is 0.
* native/jni/java-net/javanet.c:
(_javanet_accept): Throw SocketTimeoutException if ETIMEDOUT is
returned.
(_javanet_recvfrom): Likewise.
(_javanet_sendto): Throw a NullPointerException if the socket is
not connected and no address is given.
* native/jni/java-net/javanet.h
(NULL_EXCEPTION): Defined.
-rw-r--r-- | ChangeLog.native | 16 | ||||
-rw-r--r-- | native/jni/java-net/gnu_java_net_VMPlainDatagramSocketImpl.c | 28 | ||||
-rw-r--r-- | native/jni/java-net/javanet.c | 25 | ||||
-rw-r--r-- | native/jni/java-net/javanet.h | 1 |
4 files changed, 49 insertions, 21 deletions
diff --git a/ChangeLog.native b/ChangeLog.native index e6e08e090..c11c45c2b 100644 --- a/ChangeLog.native +++ b/ChangeLog.native @@ -1,3 +1,19 @@ +2006-07-09 Guilhem Lavaux <guilhem@kaffe.org> + + * native/jni/java-net/gnu_java_net_VMPlainDatagramSocketImpl.c + (nativeReceive): Fixed the type of the arrays (use java types). + (nativeSendTo): Force throwing an exception if port is 0. + + * native/jni/java-net/javanet.c: + (_javanet_accept): Throw SocketTimeoutException if ETIMEDOUT is + returned. + (_javanet_recvfrom): Likewise. + (_javanet_sendto): Throw a NullPointerException if the socket is + not connected and no address is given. + + * native/jni/java-net/javanet.h + (NULL_EXCEPTION): Defined. + 2006-06-16 Guilhem Lavaux <guilhem@kaffe.org> * native/jni/java-net/java_net_VMInetAddress.c diff --git a/native/jni/java-net/gnu_java_net_VMPlainDatagramSocketImpl.c b/native/jni/java-net/gnu_java_net_VMPlainDatagramSocketImpl.c index e608e1dde..3a451c763 100644 --- a/native/jni/java-net/gnu_java_net_VMPlainDatagramSocketImpl.c +++ b/native/jni/java-net/gnu_java_net_VMPlainDatagramSocketImpl.c @@ -185,20 +185,20 @@ Java_gnu_java_net_VMPlainDatagramSocketImpl_nativeReceive(JNIEnv *env, jintArray receivedLength) { #ifndef WITHOUT_NETWORK - int *port, *bytes_read; + jint *port, *bytes_read; cpnet_address *addr; jbyte *addressBytes; addr = 0; - port = (int*)(*env)->GetIntArrayElements(env, receivedFromPort, NULL); + port = (jint*)(*env)->GetIntArrayElements(env, receivedFromPort, NULL); if (port == NULL) { JCL_ThrowException(env, IO_EXCEPTION, "Internal error: could not access receivedFromPort array"); return; } - bytes_read = (int*)(*env)->GetIntArrayElements(env, receivedLength, NULL); + bytes_read = (jint*)(*env)->GetIntArrayElements(env, receivedLength, NULL); if (bytes_read == NULL) { (*env)->ReleaseIntArrayElements(env, receivedFromPort, (jint*)port, 0); @@ -215,7 +215,6 @@ Java_gnu_java_net_VMPlainDatagramSocketImpl_nativeReceive(JNIEnv *env, if (length == 0 && (*bytes_read) == -1) *bytes_read = 0; - if ((*bytes_read) == -1) { (*env)->ReleaseIntArrayElements(env, receivedFromPort, (jint*)port, 0); @@ -224,6 +223,9 @@ Java_gnu_java_net_VMPlainDatagramSocketImpl_nativeReceive(JNIEnv *env, return; } + if ((*env)->ExceptionOccurred(env)) + return; + *port = cpnet_addressGetPort (addr); /* Store the address */ @@ -236,11 +238,6 @@ Java_gnu_java_net_VMPlainDatagramSocketImpl_nativeReceive(JNIEnv *env, (*env)->ReleaseIntArrayElements(env, receivedFromPort, (jint*)port, 0); (*env)->ReleaseIntArrayElements(env, receivedLength, (jint*)bytes_read, 0); - if ((*env)->ExceptionOccurred(env)) - { - return; - } - DBG("PlainDatagramSocketImpl.receive(): Received packet\n"); #else /* not WITHOUT_NETWORK */ @@ -266,13 +263,20 @@ Java_gnu_java_net_VMPlainDatagramSocketImpl_nativeSendTo(JNIEnv *env, cpnet_address *netAddress; /* check if address given, tr 7.3.2005 */ - if (addr != NULL) + if (addr != NULL ) { netAddress = _javanet_get_ip_netaddr(env, addr); if ((*env)->ExceptionOccurred(env)) - { + { return; } + if (port == 0) + { + JCL_ThrowException(env, IO_EXCEPTION, + "Invalid port number"); + cpnet_freeAddress(env, netAddress); + return; + } cpnet_addressSetPort (netAddress, port); } else @@ -283,6 +287,8 @@ Java_gnu_java_net_VMPlainDatagramSocketImpl_nativeSendTo(JNIEnv *env, DBG("PlainDatagramSocketImpl.sendto(): have addr\n"); _javanet_sendto(env, obj, buf, offset, len, netAddress); + if (netAddress != NULL) + cpnet_freeAddress(env, netAddress); if ((*env)->ExceptionOccurred(env)) { return; diff --git a/native/jni/java-net/javanet.c b/native/jni/java-net/javanet.c index 162af1ef0..a8213044f 100644 --- a/native/jni/java-net/javanet.c +++ b/native/jni/java-net/javanet.c @@ -800,9 +800,9 @@ _javanet_accept (JNIEnv * env, jobject this, jobject impl) result = cpnet_accept (env, fd, &newfd); if (result != CPNATIVE_OK && result != CPNATIVE_EINTR) { - if (result == ETIMEDOUT) + if (result == ETIMEDOUT || result == EAGAIN) JCL_ThrowException (env, "java/net/SocketTimeoutException", - "Timeout"); + "Accept operation timed out"); else JCL_ThrowException (env, IO_EXCEPTION, cpnative_getErrorString (result)); @@ -951,13 +951,11 @@ _javanet_recvfrom (JNIEnv * env, jobject this, jarray buf, int offset, result = cpnet_recv (env, fd, p + offset, len, &received_bytes); } } - while ((received_bytes == -1) && - (result == CPNATIVE_EINTR)); - - if (received_bytes == -1) + while (result == CPNATIVE_EINTR); + if (result != 0) { - if (result == EAGAIN) - JCL_ThrowException (env, "java/net/SocketTimeoutException", "Timeout"); + if (result == EAGAIN || result == ETIMEDOUT) + JCL_ThrowException (env, "java/net/SocketTimeoutException", "Receive operation timed out"); else JCL_ThrowException (env, IO_EXCEPTION, cpnative_getErrorString (result)); @@ -980,7 +978,7 @@ _javanet_recvfrom (JNIEnv * env, jobject this, jarray buf, int offset, if (received_bytes == 0) received_bytes = -1; - return (received_bytes); + return received_bytes; #else /* not WITHOUT_NETWORK */ #endif /* not WITHOUT_NETWORK */ } @@ -1024,7 +1022,7 @@ _javanet_sendto (JNIEnv * env, jobject this, jarray buf, int offset, int len, while (len > 0) { /* Send the data */ - if (addr == 0) + if (addr == NULL) { DBG ("_javanet_sendto(): Sending....\n"); result = cpnet_send (env, fd, p + offset, len, &bytes_sent); @@ -1035,6 +1033,13 @@ _javanet_sendto (JNIEnv * env, jobject this, jarray buf, int offset, int len, result = cpnet_sendTo (env, fd, p + offset, len, addr, &bytes_sent); } + if (result == EDESTADDRREQ) + { + JCL_ThrowException (env, NULL_EXCEPTION, + "Socket is not connected and no address is given"); + break; + } + if (bytes_sent < 0) { if (result != CPNATIVE_EINTR) diff --git a/native/jni/java-net/javanet.h b/native/jni/java-net/javanet.h index 3f9c9d57c..411c6c651 100644 --- a/native/jni/java-net/javanet.h +++ b/native/jni/java-net/javanet.h @@ -55,6 +55,7 @@ exception statement from your version. */ #define CONNECT_EXCEPTION "java/net/ConnectException" #define SOCKET_EXCEPTION "java/net/SocketException" #define UNKNOWN_HOST_EXCEPTION "java/net/UnknownHostException" +#define NULL_EXCEPTION "java/lang/NullPointerException" /* Socket Option Identifiers - Don't change or binary compatibility with the JDK will be broken! These also need to |