mturk 2005/06/24 01:21:29 Modified: jni/native libtcnative.dsp tcnative.dsp jni/native/src network.c sslnetwork.c Added: jni/native/os/win32 ntpipe.c Log: Added NT Pipe network layer. The same will be done for AF_UNIX/AF_LOCAL. Revision Changes Path 1.13 +4 -0 jakarta-tomcat-connectors/jni/native/libtcnative.dsp Index: libtcnative.dsp =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jni/native/libtcnative.dsp,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- libtcnative.dsp 14 Jun 2005 11:55:54 -0000 1.12 +++ libtcnative.dsp 24 Jun 2005 08:21:29 -0000 1.13 @@ -196,6 +196,10 @@ # PROP Default_Filter "" # Begin Source File +SOURCE=.\os\win32\ntpipe.c +# End Source File +# Begin Source File + SOURCE=.\os\win32\system.c # End Source File # End Group 1.13 +4 -0 jakarta-tomcat-connectors/jni/native/tcnative.dsp Index: tcnative.dsp =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jni/native/tcnative.dsp,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- tcnative.dsp 14 Jun 2005 11:55:54 -0000 1.12 +++ tcnative.dsp 24 Jun 2005 08:21:29 -0000 1.13 @@ -196,6 +196,10 @@ # PROP Default_Filter "" # Begin Source File +SOURCE=.\os\win32\ntpipe.c +# End Source File +# Begin Source File + SOURCE=.\os\win32\system.c # End Source File # End Group 1.1 jakarta-tomcat-connectors/jni/native/os/win32/ntpipe.c Index: ntpipe.c =================================================================== /* Copyright 2000-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** NT Pipes network wrapper * * @author Mladen Turk * @version $Revision: 1.1 $, $Date: 2005/06/24 08:21:29 $ */ #define _WIN32_WINNT 0x0500 #define STRICT #include <windows.h> #include <winsock.h> #include <sddl.h> #include "tcn.h" #include "apr_thread_mutex.h" #include "apr_poll.h" #ifdef TCN_DO_STATISTICS #include "apr_atomic.h" static volatile apr_uint32_t ntp_created = 0; static volatile apr_uint32_t ntp_closed = 0; static volatile apr_uint32_t ntp_cleared = 0; static volatile apr_uint32_t ntp_accepted = 0; void ntp_network_dump_statistics() { fprintf(stderr, "NT Network Statistics ..\n"); fprintf(stderr, "Sockets created : %d\n", ntp_created); fprintf(stderr, "Sockets accepted : %d\n", ntp_accepted); fprintf(stderr, "Sockets closed : %d\n", ntp_closed); fprintf(stderr, "Sockets cleared : %d\n", ntp_cleared); } #endif #define DEFNAME "\\\\.\\PIPE\\TOMCATNATIVEPIPE" #define DEFNAME_FMT "\\\\.\\PIPE\\TOMCATNATIVEPIPE%08X%08X" #define DEFSIZE 8192 #define DEFTIMEOUT 60000 #define TCN_NTP_UNKNOWN 0 #define TCN_NTP_CLIENT 1 #define TCN_NTP_SERVER 2 typedef struct { apr_pool_t *pool; apr_socket_t *sock; /* Dummy socket */ OVERLAPPED rd_o; OVERLAPPED wr_o; HANDLE h_pipe; HANDLE rd_event; HANDLE wr_event; DWORD timeout; int mode; /* Client or server mode */ int nmax; char name[MAX_PATH+1]; SECURITY_ATTRIBUTES sa; } tcn_ntp_conn_t; static const char *NTSD_STRING = "D:" /* Discretionary ACL */ "(D;OICI;GA;;;BG)" /* Deny access to Built-in Guests */ "(D;OICI;GA;;;AN)" /* Deny access to Anonymous Logon */ "(A;OICI;GRGWGX;;;AU)" /* Allow read/write/execute to Authenticated Users */ "(A;OICI;GA;;;BA)" /* Allow full control to Administrators */ "(A;OICI;GA;;;LS)" /* Allow full control to Local service account */ "(A;OICI;GA;;;SY)"; /* Allow full control to Local system */ static apr_status_t APR_THREAD_FUNC ntp_socket_timeout_set(apr_socket_t *sock, apr_interval_time_t t) { tcn_ntp_conn_t *con = (tcn_ntp_conn_t *)sock; if (t < 0) con->timeout = INFINITE; else con->timeout = (DWORD)(apr_time_as_msec(t)); return APR_SUCCESS; } static apr_status_t APR_THREAD_FUNC ntp_socket_timeout_get(apr_socket_t *sock, apr_interval_time_t *t) { tcn_ntp_conn_t *con = (tcn_ntp_conn_t*)sock; if (con->timeout == INFINITE) *t = -1; else *t = con->timeout * 1000; return APR_SUCCESS; } static apr_status_t ntp_cleanup(void *data) { tcn_ntp_conn_t *con = (tcn_ntp_conn_t *)data; if (con) { if (con->h_pipe) { FlushFileBuffers(con->h_pipe); CloseHandle(con->h_pipe); con->h_pipe = NULL; } if (con->rd_event) { CloseHandle(con->rd_event); con->rd_event = NULL; } if (con->wr_event) { CloseHandle(con->wr_event); con->wr_event= NULL; } } #ifdef TCN_DO_STATISTICS apr_atomic_inc32(&ntp_cleared); #endif return APR_SUCCESS; } static apr_status_t APR_THREAD_FUNC ntp_socket_shutdown(apr_socket_t *sock, apr_shutdown_how_e how) { UNREFERENCED(how); return ntp_cleanup(sock);; } static apr_status_t APR_THREAD_FUNC ntp_socket_close(apr_socket_t *sock) { #ifdef TCN_DO_STATISTICS apr_atomic_inc32(&ntp_closed); #endif return ntp_cleanup(sock);; } static apr_status_t APR_THREAD_FUNC ntp_socket_recv(apr_socket_t *sock, char *buf, apr_size_t *len) { tcn_ntp_conn_t *con = (tcn_ntp_conn_t *)sock; DWORD readed; if (!ReadFile(con->h_pipe, buf, *len, &readed, &con->rd_o)) { DWORD err = GetLastError(); if (err == ERROR_IO_PENDING) { DWORD r = WaitForSingleObject(con->rd_event, con->timeout); if (r == WAIT_TIMEOUT) return APR_TIMEUP; else if (r != WAIT_OBJECT_0) return APR_EOF; } else if (err == ERROR_BROKEN_PIPE || err == ERROR_NO_DATA) { /* Server closed the pipe */ return APR_EOF; } GetOverlappedResult(con->h_pipe, &con->rd_o, &readed, FALSE); } *len = readed; return APR_SUCCESS; } static apr_status_t APR_THREAD_FUNC ntp_socket_send(apr_socket_t *sock, const char *buf, apr_size_t *len) { tcn_ntp_conn_t *con = (tcn_ntp_conn_t *)sock; DWORD written; if (!WriteFile(con->h_pipe, buf, *len, &written, &con->wr_o)) { DWORD err = GetLastError(); if (err == ERROR_IO_PENDING) { DWORD r = WaitForSingleObject(con->wr_event, con->timeout); if (r == WAIT_TIMEOUT) return APR_TIMEUP; else if (r != WAIT_OBJECT_0) return APR_EOF; } else if (err == ERROR_BROKEN_PIPE || err == ERROR_NO_DATA) { /* Server closed the pipe */ return APR_EOF; } GetOverlappedResult(con->h_pipe, &con->wr_o, &written, FALSE); } *len = written; return APR_SUCCESS; } static apr_status_t APR_THREAD_FUNC ntp_socket_sendv(apr_socket_t *sock, const struct iovec *vec, apr_int32_t nvec, apr_size_t *len) { tcn_ntp_conn_t *con = (tcn_ntp_conn_t *)sock; apr_status_t rv; apr_size_t written = 0; apr_int32_t i; for (i = 0; i < nvec; i++) { apr_size_t rd = vec[i].iov_len; if ((rv = ntp_socket_send((apr_socket_t *)con, vec[i].iov_base, &rd)) != APR_SUCCESS) { *len = written; return rv; } written += rd; } *len = written; return APR_SUCCESS; } static apr_status_t ntp_socket_cleanup(void *data) { tcn_socket_t *s = (tcn_socket_t *)data; if (s->cleanup) { (*s->cleanup)(s->opaque); s->cleanup = NULL; } #ifdef TCN_DO_STATISTICS apr_atomic_inc32(&ntp_cleared); #endif return APR_SUCCESS; } static BOOL create_DACL(LPSECURITY_ATTRIBUTES psa) { return ConvertStringSecurityDescriptorToSecurityDescriptor( NTSD_STRING, SDDL_REVISION_1, &(psa->lpSecurityDescriptor), NULL); } TCN_IMPLEMENT_CALL(jlong, Local, create)(TCN_STDARGS, jstring name, jlong pool) { apr_pool_t *p = J2P(pool, apr_pool_t *); tcn_socket_t *s = NULL; tcn_ntp_conn_t *con = NULL; TCN_ALLOC_CSTRING(name); UNREFERENCED(o); TCN_ASSERT(pool != 0); #ifdef TCN_DO_STATISTICS ntp_created++; #endif con = (tcn_ntp_conn_t *)apr_pcalloc(p, sizeof(tcn_ntp_conn_t)); con->pool = p; con->mode = TCN_NTP_UNKNOWN; con->nmax = PIPE_UNLIMITED_INSTANCES; con->timeout = DEFTIMEOUT; if (J2S(name)) { strncpy(con->name, J2S(name), MAX_PATH); con->name[MAX_PATH] = '\0'; TCN_FREE_CSTRING(name); } else strcpy(con->name, DEFNAME); con->sa.nLength = sizeof(con->sa); con->sa.bInheritHandle = TRUE; if (!create_DACL(&con->sa)) { tcn_ThrowAPRException(e, apr_get_os_error()); return 0; } s = (tcn_socket_t *)apr_pcalloc(p, sizeof(tcn_socket_t)); s->pool = p; s->type = TCN_SOCKET_NTPIPE; s->cleanup = ntp_cleanup; s->recv = ntp_socket_recv; s->send = ntp_socket_send; s->sendv = ntp_socket_sendv; s->shutdown = ntp_socket_shutdown; s->tmget = ntp_socket_timeout_get; s->tmset = ntp_socket_timeout_set; s->close = ntp_socket_close; s->opaque = con; apr_pool_cleanup_register(p, (const void *)s, ntp_socket_cleanup, apr_pool_cleanup_null); fflush(stderr); return P2J(s); } TCN_IMPLEMENT_CALL(jint, Local, bind)(TCN_STDARGS, jlong sock, jlong sa) { tcn_socket_t *s = J2P(sock, tcn_socket_t *); UNREFERENCED_STDARGS; UNREFERENCED(sa); TCN_ASSERT(sock != 0); if (s->type == TCN_SOCKET_NTPIPE) { tcn_ntp_conn_t *c = (tcn_ntp_conn_t *)s->opaque; c->mode = TCN_NTP_SERVER; return APR_SUCCESS; } else return APR_EINVAL; } TCN_IMPLEMENT_CALL(jint, Local, listen)(TCN_STDARGS, jlong sock, jint backlog) { tcn_socket_t *s = J2P(sock, tcn_socket_t *); UNREFERENCED_STDARGS; TCN_ASSERT(sock != 0); if (s->type == TCN_SOCKET_NTPIPE) { tcn_ntp_conn_t *c = (tcn_ntp_conn_t *)s->opaque; c->mode = TCN_NTP_SERVER; if (backlog > 0) c->nmax = backlog; else c->nmax = PIPE_UNLIMITED_INSTANCES; return APR_SUCCESS; } else return APR_EINVAL; } TCN_IMPLEMENT_CALL(jlong, Local, accept)(TCN_STDARGS, jlong sock) { tcn_socket_t *s = J2P(sock, tcn_socket_t *); apr_pool_t *p = NULL; tcn_socket_t *a = NULL; tcn_ntp_conn_t *con = NULL; UNREFERENCED(o); TCN_ASSERT(sock != 0); TCN_THROW_IF_ERR(apr_pool_create(&p, s->pool), p); if (s->type == TCN_SOCKET_NTPIPE) { tcn_ntp_conn_t *c = (tcn_ntp_conn_t *)s->opaque; con = (tcn_ntp_conn_t *)apr_pcalloc(p, sizeof(tcn_ntp_conn_t)); con->pool = p; con->mode = TCN_NTP_SERVER; con->nmax = c->nmax; con->timeout = c->timeout; strcpy(con->name, c->name); con->h_pipe = CreateNamedPipe(con->name, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, con->nmax, DEFSIZE, DEFSIZE, con->timeout, &c->sa); if (con->h_pipe == INVALID_HANDLE_VALUE) { tcn_ThrowAPRException(e, apr_get_os_error()); goto cleanup; } /* Block until a client connects */ if (!ConnectNamedPipe(con->h_pipe, NULL)) { DWORD err = GetLastError(); if (err != ERROR_PIPE_CONNECTED) { CloseHandle(con->h_pipe); tcn_ThrowAPRException(e, APR_FROM_OS_ERROR(err)); goto cleanup; } } /* Create overlapped events */ con->rd_event = CreateEvent(NULL, TRUE, FALSE, NULL); con->rd_o.hEvent = con->rd_event; con->wr_event = CreateEvent(NULL, TRUE, FALSE, NULL); con->wr_o.hEvent = con->wr_event; } else { tcn_ThrowAPRException(e, APR_ENOTIMPL); goto cleanup; } if (con) { #ifdef TCN_DO_STATISTICS apr_atomic_inc32(&ntp_accepted); #endif a = (tcn_socket_t *)apr_pcalloc(p, sizeof(tcn_socket_t)); a->pool = p; a->type = TCN_SOCKET_NTPIPE; a->cleanup = ntp_cleanup; a->recv = ntp_socket_recv; a->send = ntp_socket_send; a->sendv = ntp_socket_sendv; a->shutdown = ntp_socket_shutdown; a->tmget = ntp_socket_timeout_get; a->tmset = ntp_socket_timeout_set; a->close = ntp_socket_close; a->opaque = con; apr_pool_cleanup_register(p, (const void *)a, ntp_socket_cleanup, apr_pool_cleanup_null); } return P2J(a); cleanup: if (p) apr_pool_destroy(p); return 0; } TCN_IMPLEMENT_CALL(jint, Local, connect)(TCN_STDARGS, jlong sock, jlong sa) { tcn_socket_t *s = J2P(sock, tcn_socket_t *); apr_pool_t *p = NULL; tcn_socket_t *a = NULL; tcn_ntp_conn_t *con = NULL; UNREFERENCED(o); UNREFERENCED(sa); TCN_ASSERT(sock != 0); if (s->type != TCN_SOCKET_NTPIPE) return APR_ENOTSOCK; con = (tcn_ntp_conn_t *)s->opaque; if (con->mode == TCN_NTP_SERVER) return APR_EINVAL; con->mode = TCN_NTP_CLIENT; while (TRUE) { con->h_pipe = CreateFile(con->name, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE , NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (con->h_pipe != INVALID_HANDLE_VALUE) break; if (GetLastError() == ERROR_PIPE_BUSY) { /* All pipe instances are busy, so wait for * timeout value specified by the server process in * the CreateNamedPipe function. */ if (!WaitNamedPipe(con->name, NMPWAIT_USE_DEFAULT_WAIT)) return apr_get_os_error(); } else return apr_get_os_error(); } /* Create overlapped events */ con->rd_event = CreateEvent(NULL, TRUE, FALSE, NULL); con->rd_o.hEvent = con->rd_event; con->wr_event = CreateEvent(NULL, TRUE, FALSE, NULL); con->wr_o.hEvent = con->wr_event; return APR_SUCCESS; } 1.40 +7 -3 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.39 retrieving revision 1.40 diff -u -r1.39 -r1.40 --- network.c 23 Jun 2005 14:10:08 -0000 1.39 +++ network.c 24 Jun 2005 08:21:29 -0000 1.40 @@ -480,7 +480,7 @@ UNREFERENCED(o); TCN_ASSERT(sock != 0); - TCN_ASSERT(s->sock != NULL); + TCN_ASSERT(s->opaque != NULL); #ifdef TCN_DO_STATISTICS sp_max_send = TCN_MAX(sp_max_send, nbytes); sp_min_send = TCN_MIN(sp_min_send, nbytes); @@ -525,6 +525,7 @@ UNREFERENCED(o); TCN_ASSERT(sock != 0); + TCN_ASSERT(s->opaque != NULL); TCN_ASSERT(buf != NULL); #ifdef TCN_DO_STATISTICS sp_max_send = TCN_MAX(sp_max_send, nbytes); @@ -557,6 +558,7 @@ UNREFERENCED(o); TCN_ASSERT(sock != 0); + TCN_ASSERT(s->opaque != NULL); nvec = (*e)->GetArrayLength(e, bufs); if (nvec >= APR_MAX_IOVEC_SIZE) @@ -626,6 +628,7 @@ UNREFERENCED(o); TCN_ASSERT(sock != 0); + TCN_ASSERT(s->opaque != NULL); if (toread <= TCN_BUFFER_SZ) { char sb[TCN_BUFFER_SZ]; @@ -739,6 +742,7 @@ UNREFERENCED(o); TCN_ASSERT(sock != 0); + TCN_ASSERT(s->opaque != NULL); TCN_ASSERT(buf != NULL); bytes = (char *)(*e)->GetDirectBufferAddress(e, buf); @@ -786,7 +790,7 @@ UNREFERENCED(o); TCN_ASSERT(sock != 0); TCN_ASSERT(buf != NULL); - TCN_ASSERT(s->sock != NULL); + TCN_ASSERT(s->opaque != NULL); bytes = (char *)(*e)->GetDirectBufferAddress(e, buf); TCN_ASSERT(bytes != NULL); 1.19 +5 -5 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.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- sslnetwork.c 23 Jun 2005 08:58:05 -0000 1.18 +++ sslnetwork.c 24 Jun 2005 08:21:29 -0000 1.19 @@ -419,19 +419,19 @@ { tcn_ssl_conn_t *con = (tcn_ssl_conn_t *)sock; apr_status_t rv; - apr_size_t readed = 0; + apr_size_t written = 0; apr_int32_t i; for (i = 0; i < nvec; i++) { apr_size_t rd = vec[i].iov_len; if ((rv = ssl_socket_send((apr_socket_t *)con, vec[i].iov_base, &rd)) != APR_SUCCESS) { - *len = readed; + *len = written; return rv; } - readed += rd; + written += rd; } - *len = readed; + *len = written; return APR_SUCCESS; }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]