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]