summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuilhem Lavaux <guilhem@kaffe.org>2006-07-09 16:23:33 +0000
committerGuilhem Lavaux <guilhem@kaffe.org>2006-07-09 16:23:33 +0000
commit4714fb23de2d811f49438611ac0d13ccd302e1ea (patch)
tree89df2b9afc4eaddb66e574a5255dcedc9f92bbcf
parentcf7a1bcdc5948bada2d0a6bb2a860c248d82c233 (diff)
downloadclasspath-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.native16
-rw-r--r--native/jni/java-net/gnu_java_net_VMPlainDatagramSocketImpl.c28
-rw-r--r--native/jni/java-net/javanet.c25
-rw-r--r--native/jni/java-net/javanet.h1
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