diff options
author | Brian Jones <cbj@gnu.org> | 2003-01-30 13:19:45 +0000 |
---|---|---|
committer | Brian Jones <cbj@gnu.org> | 2003-01-30 13:19:45 +0000 |
commit | 92fbbdf31d88c0c6bf3024a6649be2d0e17a50f7 (patch) | |
tree | c310951197ea0dee1461de9aa5db503146be7157 | |
parent | f4a3fd8a65ebe7203c703a2a788341a0bae6b24d (diff) | |
download | classpath-92fbbdf31d88c0c6bf3024a6649be2d0e17a50f7.tar.gz |
* java/net/SocketImpl.java (localport): set to -1 by default
* native/jni/java-net/javanet.h (SOCKOPT_SO_KEEPALIVE): new #define
* native/jni/java-net/javanet.c (_javanet_set_option): case SO_KEEPALIVE
(_javanet_get_option): case SO_KEEPALIVE
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | java/net/SocketImpl.java | 2 | ||||
-rw-r--r-- | native/jni/java-net/javanet.c | 31 | ||||
-rw-r--r-- | native/jni/java-net/javanet.h | 1 |
4 files changed, 40 insertions, 1 deletions
@@ -1,5 +1,12 @@ 2003-01-30 C. Brian Jones <cbj@gnu.org> + * java/net/SocketImpl.java (localport): set to -1 by default + * native/jni/java-net/javanet.h (SOCKOPT_SO_KEEPALIVE): new #define + * native/jni/java-net/javanet.c (_javanet_set_option): case SO_KEEPALIVE + (_javanet_get_option): case SO_KEEPALIVE + +2003-01-30 C. Brian Jones <cbj@gnu.org> + * native/jni/java-net/javanet.c (_javanet_bind): following gcj's example and setting SO_REUSEADDR before binding the port, testing with JDK seems to indicate it does this as well diff --git a/java/net/SocketImpl.java b/java/net/SocketImpl.java index f0f1a3c87..12dcb0b9a 100644 --- a/java/net/SocketImpl.java +++ b/java/net/SocketImpl.java @@ -74,7 +74,7 @@ public abstract class SocketImpl implements SocketOptions /** * The port number the socket is bound to locally */ - protected int localport; + protected int localport = -1; /** * The port number of the remote end of the socket connection diff --git a/native/jni/java-net/javanet.c b/native/jni/java-net/javanet.c index 2db6eecbc..3ffe446a9 100644 --- a/native/jni/java-net/javanet.c +++ b/native/jni/java-net/javanet.c @@ -1024,6 +1024,21 @@ _javanet_set_option(JNIEnv *env, jobject this, jint option_id, jobject val) sizeof(int)); break; + case SOCKOPT_SO_KEEPALIVE: + mid = (*env)->GetMethodID(env, cls, "booleanValue", "()Z"); + if (mid == NULL) + { JCL_ThrowException(env, IO_EXCEPTION, + "Internal error: _javanet_set_option()"); return; } + + /* Should be a 0 or a 1 */ + optval = (*env)->CallBooleanMethod(env, val, mid); + if ((*env)->ExceptionOccurred(env)) + return; + + rc = setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (void*)&optval, + sizeof(int)); + break; + default: JCL_ThrowException(env, SOCKET_EXCEPTION, "Unrecognized option"); return; @@ -1183,6 +1198,22 @@ _javanet_get_option(JNIEnv *env, jobject this, jint option_id) break; + case SOCKOPT_SO_KEEPALIVE: + optlen = sizeof(int); + rc = getsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (void*)&optval, &optlen); + if (rc == -1) + { + JCL_ThrowException(env, SOCKET_EXCEPTION, strerror(errno)); + return(0); + } + + if (optval) + return(_javanet_create_boolean(env, JNI_TRUE)); + else + return(_javanet_create_boolean(env, JNI_FALSE)); + + break; + default: JCL_ThrowException(env, SOCKET_EXCEPTION, "No such option" ); return(0); diff --git a/native/jni/java-net/javanet.h b/native/jni/java-net/javanet.h index c0e295143..f27f811e2 100644 --- a/native/jni/java-net/javanet.h +++ b/native/jni/java-net/javanet.h @@ -63,6 +63,7 @@ exception statement from your version. */ #define SOCKOPT_SO_RCVBUF 4098 #define SOCKOPT_SO_REUSEADDR 4 #define SOCKOPT_IP_MULTICAST_IF 16 +#define SOCKOPT_SO_KEEPALIVE 8 /* Internal option identifiers. Not needed for JDK compatibility */ #define SOCKOPT_IP_TTL 7777 |