mturk 2005/06/11 00:02:56
Modified: jni/native/src sslnetwork.c
Log:
Use polleset for network events.
Revision Changes Path
1.7 +78 -32 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.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- sslnetwork.c 10 Jun 2005 18:42:42 -0000 1.6
+++ sslnetwork.c 11 Jun 2005 07:02:56 -0000 1.7
@@ -24,6 +24,7 @@
#include "apr_file_io.h"
#include "apr_portable.h"
#include "apr_thread_mutex.h"
+#include "apr_poll.h"
#include "tcn.h"
@@ -141,9 +142,12 @@
con->ctx = ctx;
con->ssl = ssl;
con->shutdown_type = ctx->shutdown_type;
+ apr_pollset_create(&(con->pollset), 1, pool, 0);
+
apr_pool_cleanup_register(pool, (const void *)con,
ssl_socket_cleanup,
apr_pool_cleanup_null);
+ SSL_set_app_data2(ssl, (void *)con);
#ifdef TCN_DO_STATISTICS
ssl_created++;
@@ -151,6 +155,42 @@
return con;
}
+static apr_status_t wait_for_io_or_timeout(tcn_ssl_conn_t *con,
+ apr_interval_time_t t,
+ int for_what)
+{
+ apr_interval_time_t timeout = t;
+ apr_pollfd_t pfd;
+ int type = for_what == SSL_ERROR_WANT_WRITE ? APR_POLLOUT : APR_POLLIN;
+ apr_status_t status;
+
+ if (timeout < 0)
+ apr_socket_timeout_get(con->sock, &timeout);
+ pfd.desc_type = APR_POLL_SOCKET;
+ pfd.desc.s = con->sock;
+ pfd.reqevents = type;
+
+ /* Remove the object if it was in the pollset, then add in the new
+ * object with the correct reqevents value. Ignore the status result
+ * on the remove, because it might not be in there (yet).
+ */
+ apr_pollset_remove(con->pollset, &pfd);
+
+ /* ### check status code */
+ apr_pollset_add(con->pollset, &pfd);
+
+ do {
+ int numdesc;
+ const apr_pollfd_t *pdesc;
+
+ status = apr_pollset_poll(con->pollset, timeout, &numdesc, &pdesc);
+ if (numdesc == 1 && (pdesc[0].rtnevents & type) != 0)
+ return APR_SUCCESS;
+ } while (APR_STATUS_IS_EINTR(status));
+
+ return status;
+}
+
TCN_IMPLEMENT_CALL(jint, SSLSocket, shutdown)(TCN_STDARGS, jlong sock,
jint how)
{
@@ -230,7 +270,7 @@
apr_socket_t *sock=b->ptr;
printf("jbs_apr_write\n");
fflush(stdout);
- return(apr_socket_send(sock, in, &j));
+ return(apr_socket_send(sock, in, &j));
}
static int jbs_apr_read(BIO *b, char *out, int outl)
@@ -262,7 +302,7 @@
fflush(stdout);
if (cmd==BIO_CTRL_FLUSH || cmd==BIO_CTRL_DUP)
return 1;
- else
+ else
return 0;
}
static BIO_METHOD jbs_apr_methods = {
@@ -333,13 +373,14 @@
tcn_ThrowException(e, "Create SSL_accept failed");
return 0;
}
-
+
cleanup:
return P2J(con);
}
-#else
-TCN_IMPLEMENT_CALL(jlong, SSLSocket, accept)(TCN_STDARGS, jlong ctx,
+#endif /* JFC_TEST */
+
+TCN_IMPLEMENT_CALL(jlong, SSLSocket, attach)(TCN_STDARGS, jlong ctx,
jlong sock, jlong pool)
{
tcn_ssl_ctxt_t *c = J2P(ctx, tcn_ssl_ctxt_t *);
@@ -359,40 +400,45 @@
con->sock = s;
SSL_set_fd(con->ssl, (int)oss);
- SSL_set_accept_state(con->ssl);
+ if (c->mode)
+ SSL_set_accept_state(con->ssl);
+ else
+ SSL_set_connect_state(con->ssl);
- /* TODO: Do SSL_accept() */
cleanup:
return P2J(con);
}
-#endif /* JFC_TEST */
-TCN_IMPLEMENT_CALL(jlong, SSLSocket, connect)(TCN_STDARGS, jlong ctx,
- jlong sock, jlong pool)
+TCN_IMPLEMENT_CALL(jint, SSLSocket, handshake)(TCN_STDARGS, jlong sock)
{
- tcn_ssl_ctxt_t *c = J2P(ctx, tcn_ssl_ctxt_t *);
- apr_socket_t *s = J2P(sock, apr_socket_t *);
- apr_pool_t *p = J2P(pool, apr_pool_t *);
- tcn_ssl_conn_t *con;
- apr_os_sock_t oss;
-
- UNREFERENCED(o);
- TCN_ASSERT(pool != 0);
- TCN_ASSERT(ctx != 0);
+ tcn_ssl_conn_t *con = J2P(sock, tcn_ssl_conn_t *);
+ int s, i;
+ apr_status_t rv;
+ UNREFERENCED_STDARGS;
TCN_ASSERT(sock != 0);
- if ((con = ssl_create(e, c, p)) == NULL)
- return 0;
- TCN_THROW_IF_ERR(apr_os_sock_get(&oss, s), c);
- con->sock = s;
-
- SSL_set_fd(con->ssl, (int)oss);
- SSL_set_connect_state(con->ssl);
-
- /* TODO: Do SSL_connect() */
-
-cleanup:
- return P2J(con);
+ for (;;) {
+ if ((s = SSL_do_handshake(con->ssl)) != 0) {
+ i = SSL_get_error(con->ssl, s);
+ switch (i) {
+ case SSL_ERROR_NONE:
+ return APR_SUCCESS;
+ break;
+ case SSL_ERROR_WANT_READ:
+ case SSL_ERROR_WANT_WRITE:
+ if ((rv = wait_for_io_or_timeout(con, -1, i)) !=
APR_SUCCESS) {
+ return rv;
+ }
+ break;
+ default:
+ return SSL_TO_APR_ERROR(i);
+ break;
+ }
+ }
+ else
+ break;
+ }
+ return APR_SUCCESS;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]