summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Jones <cbj@gnu.org>2003-01-30 13:19:45 +0000
committerBrian Jones <cbj@gnu.org>2003-01-30 13:19:45 +0000
commit92fbbdf31d88c0c6bf3024a6649be2d0e17a50f7 (patch)
treec310951197ea0dee1461de9aa5db503146be7157
parentf4a3fd8a65ebe7203c703a2a788341a0bae6b24d (diff)
downloadclasspath-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--ChangeLog7
-rw-r--r--java/net/SocketImpl.java2
-rw-r--r--native/jni/java-net/javanet.c31
-rw-r--r--native/jni/java-net/javanet.h1
4 files changed, 40 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index f78d91650..3a2b2cf5d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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