mturk 2005/06/13 00:31:11
Modified: jni/java/org/apache/tomcat/jni SSLSocket.java
jni/native/src sslnetwork.c
Log:
Copy/paste the rest of the recv*/send* methods from APR sockets.
Revision Changes Path
1.7 +134 -1
jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/SSLSocket.java
Index: SSLSocket.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/SSLSocket.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- SSLSocket.java 12 Jun 2005 10:31:16 -0000 1.6
+++ SSLSocket.java 13 Jun 2005 07:31:11 -0000 1.7
@@ -89,6 +89,68 @@
public static native int send(long sock, byte[] buf, int offset, int
len);
/**
+ * Send data over a network.
+ * <PRE>
+ * This functions acts like a blocking write by default. To change
+ * this behavior, use apr_socket_timeout_set() or the APR_SO_NONBLOCK
+ * socket option.
+ *
+ * It is possible for both bytes to be sent and an error to be returned.
+ *
+ * APR_EINTR is never returned.
+ * </PRE>
+ * @param sock The socket to send the data over.
+ * @param buf The buffer which contains the data to be sent.
+ * @param offset Offset in the byte buffer.
+ * @param len The number of bytes to write; (-1) for full array.
+ * @return The number of bytes send.
+ *
+ */
+ public static native int send(long sock, byte[] buf, int offset, int
len);
+
+ /**
+ * Send data over a network.
+ * <PRE>
+ * This functions acts like a blocking write by default. To change
+ * this behavior, use apr_socket_timeout_set() or the APR_SO_NONBLOCK
+ * socket option.
+ *
+ * It is possible for both bytes to be sent and an error to be returned.
+ *
+ * APR_EINTR is never returned.
+ * </PRE>
+ * @param sock The socket to send the data over.
+ * @param buf The Byte buffer which contains the data to be sent.
+ * @param offset The offset within the buffer array of the first buffer
from
+ * which bytes are to be retrieved; must be non-negative
+ * and no larger than buf.length
+ * @param len The maximum number of buffers to be accessed; must be
non-negative
+ * and no larger than buf.length - offset
+ * @return The number of bytes send.
+ *
+ */
+ public static native int sendb(long sock, ByteBuffer buf,
+ int offset, int len);
+
+ /**
+ * Send multiple packets of data over a network.
+ * <PRE>
+ * This functions acts like a blocking write by default. To change
+ * this behavior, use apr_socket_timeout_set() or the APR_SO_NONBLOCK
+ * socket option.
+ * The number of bytes actually sent is stored in argument 3.
+ *
+ * It is possible for both bytes to be sent and an error to be returned.
+ *
+ * APR_EINTR is never returned.
+ * </PRE>
+ * @param sock The socket to send the data over.
+ * @param vec The array from which to get the data to send.
+ *
+ */
+ public static native int sendv(long sock, byte[][] vec);
+
+ /**
* Read data from a network.
*
* <PRE>
@@ -110,4 +172,75 @@
*/
public static native int recv(long sock, byte[] buf, int offset, int
nbytes);
+ /**
+ * Read data from a network with timeout.
+ *
+ * <PRE>
+ * This functions acts like a blocking read by default. To change
+ * this behavior, use apr_socket_timeout_set() or the APR_SO_NONBLOCK
+ * socket option.
+ * The number of bytes actually received is stored in argument 3.
+ *
+ * It is possible for both bytes to be received and an APR_EOF or
+ * other error to be returned.
+ *
+ * APR_EINTR is never returned.
+ * </PRE>
+ * @param sock The socket to read the data from.
+ * @param buf The buffer to store the data in.
+ * @param offset Offset in the byte buffer.
+ * @param nbytes The number of bytes to read (-1) for full array.
+ * @param timeout The socket timeout in microseconds.
+ * @return the number of bytes received.
+ */
+ public static native int recvt(long sock, byte[] buf, int offset,
+ int nbytes, long timeout);
+
+ /**
+ * Read data from a network.
+ *
+ * <PRE>
+ * This functions acts like a blocking read by default. To change
+ * this behavior, use apr_socket_timeout_set() or the APR_SO_NONBLOCK
+ * socket option.
+ * The number of bytes actually received is stored in argument 3.
+ *
+ * It is possible for both bytes to be received and an APR_EOF or
+ * other error to be returned.
+ *
+ * APR_EINTR is never returned.
+ * </PRE>
+ * @param sock The socket to read the data from.
+ * @param buf The buffer to store the data in.
+ * @param offset Offset in the byte buffer.
+ * @param nbytes The number of bytes to read (-1) for full array.
+ * @return the number of bytes received.
+ */
+ public static native int recvb(long sock, ByteBuffer buf,
+ int offset, int nbytes);
+
+ /**
+ * Read data from a network with timeout.
+ *
+ * <PRE>
+ * This functions acts like a blocking read by default. To change
+ * this behavior, use apr_socket_timeout_set() or the APR_SO_NONBLOCK
+ * socket option.
+ * The number of bytes actually received is stored in argument 3.
+ *
+ * It is possible for both bytes to be received and an APR_EOF or
+ * other error to be returned.
+ *
+ * APR_EINTR is never returned.
+ * </PRE>
+ * @param sock The socket to read the data from.
+ * @param buf The buffer to store the data in.
+ * @param offset Offset in the byte buffer.
+ * @param nbytes The number of bytes to read (-1) for full array.
+ * @param timeout The socket timeout in microseconds.
+ * @return the number of bytes received.
+ */
+ public static native int recvbt(long sock, ByteBuffer buf,
+ int offset, int nbytes, long timeout);
+
}
1.10 +149 -1 jakarta-tomcat-connectors/jni/native/src/sslnetwork.c
Index: sslnetwork.c
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jni/native/src/sslnetwork.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- sslnetwork.c 12 Jun 2005 10:31:17 -0000 1.9
+++ sslnetwork.c 13 Jun 2005 07:31:11 -0000 1.10
@@ -600,6 +600,66 @@
}
}
+TCN_IMPLEMENT_CALL(jint, SSLSocket, sendv)(TCN_STDARGS, jlong sock,
+ jobjectArray bufs)
+{
+ tcn_ssl_conn_t *s = J2P(sock, tcn_ssl_conn_t *);
+ jsize nvec = (*e)->GetArrayLength(e, bufs);
+ jsize i;
+ jobject ba;
+ apr_size_t written = 0;
+ apr_status_t ss;
+
+ UNREFERENCED(o);
+ TCN_ASSERT(sock != 0);
+
+ if (nvec >= APR_MAX_IOVEC_SIZE)
+ return (jint)(-APR_ENOMEM);
+ for (i = 0; i < nvec; i++) {
+ apr_size_t len;
+ jbyte *buf;
+ ba = (*e)->GetObjectArrayElement(e, bufs, i);
+ len = (*e)->GetArrayLength(e, ba);
+ buf = (*e)->GetByteArrayElements(e, ba, NULL);
+ ss = ssl_socket_send(s, buf, &len);
+ (*e)->ReleaseByteArrayElements(e, ba, buf, JNI_ABORT);
+ if (ss == APR_SUCCESS)
+ written += len;
+ else
+ break;
+ }
+
+ if (ss == APR_SUCCESS)
+ return (jint)written;
+ else {
+ TCN_ERROR_WRAP(ss);
+ return -(jint)ss;
+ }
+}
+
+TCN_IMPLEMENT_CALL(jint, SSLSocket, sendb)(TCN_STDARGS, jlong sock,
+ jobject buf, jint offset, jint
len)
+{
+ tcn_ssl_conn_t *s = J2P(sock, tcn_ssl_conn_t *);
+ apr_size_t nbytes = (apr_size_t)len;
+ char *bytes;
+ apr_status_t ss;
+
+ UNREFERENCED(o);
+ TCN_ASSERT(sock != 0);
+ TCN_ASSERT(buf != NULL);
+ bytes = (char *)(*e)->GetDirectBufferAddress(e, buf);
+ ss = ssl_socket_send(s, bytes + offset, &nbytes);
+
+ if (ss == APR_SUCCESS)
+ return (jint)nbytes;
+ else {
+ TCN_ERROR_WRAP(ss);
+ return -(jint)ss;
+ }
+}
+
+
TCN_IMPLEMENT_CALL(jint, SSLSocket, recv)(TCN_STDARGS, jlong sock,
jbyteArray buf, jint offset,
jint toread)
@@ -624,6 +684,94 @@
}
}
+TCN_IMPLEMENT_CALL(jint, SSLSocket, recvt)(TCN_STDARGS, jlong sock,
+ jbyteArray buf, jint offset,
+ jint toread, jlong timeout)
+{
+ tcn_ssl_conn_t *s = J2P(sock, tcn_ssl_conn_t *);
+ apr_size_t nbytes = (apr_size_t)toread;
+ jbyte *bytes = (*e)->GetByteArrayElements(e, buf, NULL);
+ apr_status_t ss;
+ apr_interval_time_t t;
+
+ UNREFERENCED(o);
+ TCN_ASSERT(sock != 0);
+ TCN_ASSERT(buf != NULL);
+ TCN_ASSERT(bytes != NULL);
+
+ if ((ss = apr_socket_timeout_get(s->sock, &t)) != APR_SUCCESS)
+ goto cleanup;
+ if ((ss = apr_socket_timeout_set(s->sock, J2T(timeout))) != APR_SUCCESS)
+ goto cleanup;
+ ss = ssl_socket_recv(s, bytes + offset, &nbytes);
+ /* Resore the original timeout */
+ apr_socket_timeout_set(s->sock, t);
+cleanup:
+ (*e)->ReleaseByteArrayElements(e, buf, bytes,
+ nbytes ? 0 : JNI_ABORT);
+ if (ss == APR_SUCCESS)
+ return (jint)nbytes;
+ else {
+ TCN_ERROR_WRAP(ss);
+ return -(jint)ss;
+ }
+}
+
+TCN_IMPLEMENT_CALL(jint, SSLSocket, recvb)(TCN_STDARGS, jlong sock,
+ jobject buf, jint offset, jint
len)
+{
+ tcn_ssl_conn_t *s = J2P(sock, tcn_ssl_conn_t *);
+ apr_status_t ss;
+ apr_size_t nbytes = (apr_size_t)len;
+ char *bytes;
+
+ UNREFERENCED(o);
+ TCN_ASSERT(sock != 0);
+ TCN_ASSERT(buf != NULL);
+ bytes = (char *)(*e)->GetDirectBufferAddress(e, buf);
+ TCN_ASSERT(bytes != NULL);
+ ss = ssl_socket_recv(s, bytes + offset, &nbytes);
+
+ if (ss == APR_SUCCESS)
+ return (jint)nbytes;
+ else {
+ TCN_ERROR_WRAP(ss);
+ return -(jint)ss;
+ }
+}
+
+TCN_IMPLEMENT_CALL(jint, SSLSocket, recvbt)(TCN_STDARGS, jlong sock,
+ jobject buf, jint offset,
+ jint len, jlong timeout)
+{
+ tcn_ssl_conn_t *s = J2P(sock, tcn_ssl_conn_t *);
+ apr_status_t ss;
+ apr_size_t nbytes = (apr_size_t)len;
+ char *bytes;
+ apr_interval_time_t t;
+
+ UNREFERENCED(o);
+ TCN_ASSERT(sock != 0);
+ TCN_ASSERT(buf != NULL);
+ bytes = (char *)(*e)->GetDirectBufferAddress(e, buf);
+ TCN_ASSERT(bytes != NULL);
+
+ if ((ss = apr_socket_timeout_get(s->sock, &t)) != APR_SUCCESS)
+ return -(jint)ss;
+ if ((ss = apr_socket_timeout_set(s->sock, J2T(timeout))) != APR_SUCCESS)
+ return -(jint)ss;
+ ss = ssl_socket_recv(s, bytes + offset, &nbytes);
+ /* Resore the original timeout */
+ apr_socket_timeout_set(s->sock, t);
+
+ if (ss == APR_SUCCESS)
+ return (jint)nbytes;
+ else {
+ TCN_ERROR_WRAP(ss);
+ return -(jint)ss;
+ }
+}
+
#else
/* OpenSSL is not supported
* If someday we make OpenSSL optional
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]