Hi,
Here are some fixes for the NATIVE-LAYER branch concerning the exactness
of exception which should be thrown.
Regards,
Guilhem.
2006-07-09 Guilhem Lavaux <[EMAIL PROTECTED]>
* 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.
Index: native/jni/java-net/gnu_java_net_VMPlainDatagramSocketImpl.c
===================================================================
RCS file:
/cvsroot/classpath/classpath/native/jni/java-net/gnu_java_net_VMPlainDatagramSocketImpl.c,v
retrieving revision 1.5.2.1
diff -u -r1.5.2.1 gnu_java_net_VMPlainDatagramSocketImpl.c
--- native/jni/java-net/gnu_java_net_VMPlainDatagramSocketImpl.c 28 Jan
2006 16:38:25 -0000 1.5.2.1
+++ native/jni/java-net/gnu_java_net_VMPlainDatagramSocketImpl.c 9 Jul
2006 16:23:20 -0000
@@ -185,20 +185,20 @@
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 @@
if (length == 0 && (*bytes_read) == -1)
*bytes_read = 0;
-
if ((*bytes_read) == -1)
{
(*env)->ReleaseIntArrayElements(env, receivedFromPort, (jint*)port, 0);
@@ -224,6 +223,9 @@
return;
}
+ if ((*env)->ExceptionOccurred(env))
+ return;
+
*port = cpnet_addressGetPort (addr);
/* Store the address */
@@ -236,11 +238,6 @@
(*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 @@
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 @@
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;
Index: native/jni/java-net/javanet.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/java-net/javanet.c,v
retrieving revision 1.32.2.10
diff -u -r1.32.2.10 javanet.c
--- native/jni/java-net/javanet.c 16 Jun 2006 18:07:47 -0000
1.32.2.10
+++ native/jni/java-net/javanet.c 9 Jul 2006 16:23:20 -0000
@@ -800,9 +800,9 @@
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 @@
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 @@
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 @@
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 @@
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)
Index: native/jni/java-net/javanet.h
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/java-net/javanet.h,v
retrieving revision 1.12.2.3
diff -u -r1.12.2.3 javanet.h
--- native/jni/java-net/javanet.h 6 Jun 2006 20:30:30 -0000 1.12.2.3
+++ native/jni/java-net/javanet.h 9 Jul 2006 16:23:20 -0000
@@ -55,6 +55,7 @@
#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