mturk 2005/06/17 04:22:30 Modified: jni/native/include tcn.h jni/native/src network.c sslnetwork.c Log: Update SSL socket functions as pointers to the socket implementation. Revision Changes Path 1.20 +4 -8 jakarta-tomcat-connectors/jni/native/include/tcn.h Index: tcn.h =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jni/native/include/tcn.h,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- tcn.h 17 Jun 2005 09:41:30 -0000 1.19 +++ tcn.h 17 Jun 2005 11:22:30 -0000 1.20 @@ -96,7 +96,7 @@ /* On stack buffer size */ #define TCN_BUFFER_SZ 8192 #define TCN_STDARGS JNIEnv *e, jobject o -#define TCN_IMPARGS JNIEnv *e, jobject o, void *opaque +#define TCN_IMPARGS JNIEnv *e, jobject o, void *sock #define TCN_IMPCALL(X) e, o, X->opaque #define TCN_IMPLEMENT_CALL(RT, CL, FN) \ @@ -105,21 +105,17 @@ #define TCN_IMPLEMENT_METHOD(RT, FN) \ static RT method_##FN +#define TCN_GETNET_METHOD(FN) method_##FN + #define TCN_SOCKET_APR 1 #define TCN_SOCKET_SSL 2 #define TCN_SOCKET_UNIX 4 #define TCN_SOCKET_NTPIPE 5 -#define TCN_SOCKET_APR_N "APR socket" -#define TCN_SOCKET_SSL_N "SSL socket" -#define TCN_SOCKET_UNIX_N "UNIX local socket" -#define TCN_SOCKET_NTPIPE_N "NT named pipe" - typedef struct { apr_pool_t *pool; apr_socket_t *sock; void *opaque; - const char *name; int type; apr_status_t (*cleanup)(void *opaque); jint (*shutdown)(TCN_IMPARGS, jint how); 1.28 +13 -7 jakarta-tomcat-connectors/jni/native/src/network.c Index: network.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jni/native/src/network.c,v retrieving revision 1.27 retrieving revision 1.28 diff -u -r1.27 -r1.28 --- network.c 17 Jun 2005 09:41:30 -0000 1.27 +++ network.c 17 Jun 2005 11:22:30 -0000 1.28 @@ -189,7 +189,6 @@ a->sock = s; a->pool = p; a->type = TCN_SOCKET_APR; - a->name = TCN_SOCKET_APR_N; apr_pool_cleanup_register(p, (const void *)a, sp_socket_cleanup, apr_pool_cleanup_null); @@ -225,7 +224,7 @@ UNREFERENCED_STDARGS; TCN_ASSERT(sock != 0); if (s->shutdown) - return (jint)(*s->shutdown)(TCN_IMPCALL(s), how); + return (*s->shutdown)(TCN_IMPCALL(s), how); else return (jint)apr_socket_shutdown(s->sock, (apr_shutdown_how_e)how); } @@ -233,14 +232,20 @@ TCN_IMPLEMENT_CALL(jint, Socket, close)(TCN_STDARGS, jlong sock) { tcn_socket_t *s = J2P(sock, tcn_socket_t *); - + jint rv = APR_SUCCESS; UNREFERENCED_STDARGS; TCN_ASSERT(sock != 0); #ifdef TCN_DO_STATISTICS apr_atomic_inc32(&sp_closed); #endif - return (jint)apr_pool_cleanup_run(s->pool, s, sp_socket_cleanup); + if (s->close) + rv = (*s->close)(TCN_IMPCALL(s)); + if (s->sock) { + rv = (jint)apr_socket_close(s->sock); + s->sock = NULL; + } + return rv; } TCN_IMPLEMENT_CALL(jint, Socket, bind)(TCN_STDARGS, jlong sock, @@ -285,7 +290,6 @@ a->sock = n; a->pool = p; a->type = TCN_SOCKET_APR; - a->name = TCN_SOCKET_APR_N; apr_pool_cleanup_register(p, (const void *)a, sp_socket_cleanup, apr_pool_cleanup_null); @@ -689,7 +693,9 @@ UNREFERENCED(o); TCN_ASSERT(sock != 0); TCN_ASSERT(file != 0); - + + if (s->type != TCN_SOCKET_APR) + return (jint)(-APR_ENOTIMPL); if (headers) nh = (*e)->GetArrayLength(e, headers); if (trailers) 1.13 +75 -84 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.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- sslnetwork.c 17 Jun 2005 09:41:30 -0000 1.12 +++ sslnetwork.c 17 Jun 2005 11:22:30 -0000 1.13 @@ -91,7 +91,7 @@ return rc; } -static apr_status_t ssl_socket_cleanup(void *data) +TCN_IMPLEMENT_METHOD(apr_status_t, cleanup)(void *data) { tcn_ssl_conn_t *con = (tcn_ssl_conn_t *)data; @@ -105,10 +105,6 @@ X509_free(con->peer); con->peer = NULL; } - if (con->sock) { - apr_socket_close(con->sock); - con->sock = NULL; - } } #ifdef TCN_DO_STATISTICS @@ -140,9 +136,6 @@ 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_data(ssl, (void *)con); if (ctx->mode) { @@ -212,11 +205,10 @@ return status; } -TCN_IMPLEMENT_CALL(jint, SSLSocket, shutdown)(TCN_STDARGS, jlong sock, - jint how) +TCN_IMPLEMENT_METHOD(jint, shutdown)(TCN_IMPARGS, jint how) { apr_status_t rv = APR_SUCCESS; - tcn_ssl_conn_t *con = J2P(sock, tcn_ssl_conn_t *); + tcn_ssl_conn_t *con = (tcn_ssl_conn_t *)sock; UNREFERENCED_STDARGS; TCN_ASSERT(sock != 0); @@ -231,9 +223,9 @@ return (jint)rv; } -TCN_IMPLEMENT_CALL(jint, SSLSocket, close)(TCN_STDARGS, jlong sock) +TCN_IMPLEMENT_METHOD(jint, close)(TCN_IMPARGS) { - tcn_ssl_conn_t *con = J2P(sock, tcn_ssl_conn_t *); + tcn_ssl_conn_t *con = (tcn_ssl_conn_t *)sock; apr_status_t rv = APR_SUCCESS; UNREFERENCED_STDARGS; TCN_ASSERT(sock != 0); @@ -241,7 +233,6 @@ #ifdef TCN_DO_STATISTICS apr_atomic_inc32(&ssl_closed); #endif - apr_pool_cleanup_kill(con->pool, con, ssl_socket_cleanup); if (con->ssl) { rv = ssl_smart_shutdown(con->ssl, con->shutdown_type); SSL_free(con->ssl); @@ -251,22 +242,9 @@ X509_free(con->peer); con->peer = NULL; } - if (con->sock) { - apr_status_t rc; - if ((rc = apr_socket_close(con->sock)) != APR_SUCCESS) - rv = rc; - con->sock = NULL; - } return (jint)rv; } -TCN_IMPLEMENT_CALL(void, SSLSocket, destroy)(TCN_STDARGS, jlong sock) -{ - tcn_ssl_conn_t *con = J2P(sock, tcn_ssl_conn_t *); - UNREFERENCED_STDARGS; - apr_pool_destroy(con->pool); -} - #define JFC_TEST 0 #if JFC_TEST /* @@ -408,45 +386,19 @@ #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 *); - 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_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); - if (c->mode) - SSL_set_accept_state(con->ssl); - else - SSL_set_connect_state(con->ssl); - -cleanup: - return P2J(con); -} - TCN_IMPLEMENT_CALL(jint, SSLSocket, handshake)(TCN_STDARGS, jlong sock) { - tcn_ssl_conn_t *con = J2P(sock, tcn_ssl_conn_t *); + tcn_socket_t *ss = J2P(sock, tcn_socket_t *); + tcn_ssl_conn_t *con; int s; apr_status_t rv; X509 *peer; UNREFERENCED_STDARGS; TCN_ASSERT(sock != 0); - + if (ss->type != TCN_SOCKET_SSL) + return APR_EINVAL; + con = (tcn_ssl_conn_t *)ss->opaque; while (!SSL_is_init_finished(con->ssl)) { if ((s = SSL_do_handshake(con->ssl)) <= 0) { int i = SSL_get_error(con->ssl, s); @@ -496,8 +448,6 @@ con->peer = peer; } } - fprintf(stderr, "Handshake done\n"); - fflush(stderr); return APR_SUCCESS; } @@ -587,11 +537,11 @@ return rv; } -TCN_IMPLEMENT_CALL(jint, SSLSocket, send)(TCN_STDARGS, jlong sock, - jbyteArray buf, jint offset, - jint tosend) +TCN_IMPLEMENT_METHOD(jint, send)(TCN_IMPARGS, + jbyteArray buf, jint offset, + jint tosend) { - tcn_ssl_conn_t *s = J2P(sock, tcn_ssl_conn_t *); + tcn_ssl_conn_t *s = (tcn_ssl_conn_t *)sock; apr_size_t nbytes = (apr_size_t)tosend; jbyte *bytes; apr_int32_t nb; @@ -618,10 +568,10 @@ } } -TCN_IMPLEMENT_CALL(jint, SSLSocket, sendv)(TCN_STDARGS, jlong sock, - jobjectArray bufs) +TCN_IMPLEMENT_METHOD(jint, sendv)(TCN_IMPARGS, + jobjectArray bufs) { - tcn_ssl_conn_t *s = J2P(sock, tcn_ssl_conn_t *); + tcn_ssl_conn_t *s = (tcn_ssl_conn_t *)sock; jsize nvec = (*e)->GetArrayLength(e, bufs); jsize i; jobject ba; @@ -655,10 +605,10 @@ } } -TCN_IMPLEMENT_CALL(jint, SSLSocket, sendb)(TCN_STDARGS, jlong sock, - jobject buf, jint offset, jint len) +TCN_IMPLEMENT_METHOD(jint, sendb)(TCN_IMPARGS, + jobject buf, jint offset, jint len) { - tcn_ssl_conn_t *s = J2P(sock, tcn_ssl_conn_t *); + tcn_ssl_conn_t *s = (tcn_ssl_conn_t *)sock; apr_size_t nbytes = (apr_size_t)len; char *bytes; apr_status_t ss; @@ -678,11 +628,11 @@ } -TCN_IMPLEMENT_CALL(jint, SSLSocket, recv)(TCN_STDARGS, jlong sock, - jbyteArray buf, jint offset, - jint toread) +TCN_IMPLEMENT_METHOD(jint, recv)(TCN_IMPARGS, + jbyteArray buf, jint offset, + jint toread) { - tcn_ssl_conn_t *s = J2P(sock, tcn_ssl_conn_t *); + tcn_ssl_conn_t *s = (tcn_ssl_conn_t *)sock; apr_size_t nbytes = (apr_size_t)toread; jbyte *bytes = (*e)->GetByteArrayElements(e, buf, NULL); apr_status_t ss; @@ -702,11 +652,11 @@ } } -TCN_IMPLEMENT_CALL(jint, SSLSocket, recvt)(TCN_STDARGS, jlong sock, - jbyteArray buf, jint offset, - jint toread, jlong timeout) +TCN_IMPLEMENT_METHOD(jint, recvt)(TCN_IMPARGS, + jbyteArray buf, jint offset, + jint toread, jlong timeout) { - tcn_ssl_conn_t *s = J2P(sock, tcn_ssl_conn_t *); + tcn_ssl_conn_t *s = (tcn_ssl_conn_t *)sock; apr_size_t nbytes = (apr_size_t)toread; jbyte *bytes = (*e)->GetByteArrayElements(e, buf, NULL); apr_status_t ss; @@ -735,8 +685,8 @@ } } -TCN_IMPLEMENT_CALL(jint, SSLSocket, recvb)(TCN_STDARGS, jlong sock, - jobject buf, jint offset, jint len) +TCN_IMPLEMENT_METHOD(jint, recvb)(TCN_IMPARGS, + jobject buf, jint offset, jint len) { tcn_ssl_conn_t *s = J2P(sock, tcn_ssl_conn_t *); apr_status_t ss; @@ -758,9 +708,9 @@ } } -TCN_IMPLEMENT_CALL(jint, SSLSocket, recvbt)(TCN_STDARGS, jlong sock, - jobject buf, jint offset, - jint len, jlong timeout) +TCN_IMPLEMENT_METHOD(jint, recvbt)(TCN_IMPARGS, + jobject buf, jint offset, + jint len, jlong timeout) { tcn_ssl_conn_t *s = J2P(sock, tcn_ssl_conn_t *); apr_status_t ss; @@ -790,6 +740,47 @@ } } +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 *); + tcn_socket_t *s = J2P(sock, tcn_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_ASSERT(sock != 0); + + if ((con = ssl_create(e, c, p)) == NULL) + return 0; + TCN_THROW_IF_ERR(apr_os_sock_get(&oss, s->sock), c); + con->sock = s->sock; + + SSL_set_fd(con->ssl, (int)oss); + if (c->mode) + SSL_set_accept_state(con->ssl); + else + SSL_set_connect_state(con->ssl); + /* Change socket type */ + s->type = TCN_SOCKET_SSL; + s->cleanup = TCN_GETNET_METHOD(cleanup); + s->shutdown = TCN_GETNET_METHOD(shutdown); + s->close = TCN_GETNET_METHOD(close); + s->send = TCN_GETNET_METHOD(send); + s->sendb = TCN_GETNET_METHOD(sendb); + s->sendv = TCN_GETNET_METHOD(sendv); + s->recv = TCN_GETNET_METHOD(recv); + s->recvt = TCN_GETNET_METHOD(recvt); + s->recvb = TCN_GETNET_METHOD(recvb); + s->recvbt = TCN_GETNET_METHOD(recvbt); + +cleanup: + return P2J(con); +} + #else /* OpenSSL is not supported * If someday we make OpenSSL optional
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]