costin 02/05/28 15:34:59 Modified: jk/native2/jni jk_jni_aprImpl.c org_apache_jk_apr_AprImpl.h Log: Removed the ( duplicated ) unix socket code. We'll use jk_channel_un instead ( directly ). Fixes in initialization ( make sure workerEnv is init, log ). Added a 'raw' param to jkInvoke - to support unprocessed buffers. If raw is set the jk component will use the buffer as a byte[], not ajp messages ( for example channel.read() is doing that ). No need to copy the data from the JNI buffer to msg. Use the new jk_bean.invoke() directly instead of the dispatch. I think it's cleaner. Revision Changes Path 1.26 +49 -260 jakarta-tomcat-connectors/jk/native2/jni/jk_jni_aprImpl.c Index: jk_jni_aprImpl.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/jni/jk_jni_aprImpl.c,v retrieving revision 1.25 retrieving revision 1.26 diff -u -r1.25 -r1.26 --- jk_jni_aprImpl.c 27 May 2002 15:54:44 -0000 1.25 +++ jk_jni_aprImpl.c 28 May 2002 22:34:59 -0000 1.26 @@ -77,6 +77,7 @@ #include "jk_global.h" #include "jk_map.h" #include "jk_pool.h" +#include "jk_logger.h" #ifndef WIN32 #include <unistd.h> @@ -131,7 +132,9 @@ return JK_ERR; } - env->l=jkb->object;; + env->l=jkb->object; + env->l->name="stderr"; + env->l->level=JK_LOG_DEBUG_LEVEL; env->alias( env, "logger.file:", "logger"); jkb=env->createBean2( env, env->globalPool,"workerEnv", ""); @@ -142,6 +145,8 @@ } workerEnv=jkb->object; + + workerEnv->init( env, workerEnv ); } /* fprintf( stderr, "XXX aprImpl: %p %p\n", env, workerEnv); */ return 0; @@ -155,6 +160,7 @@ } /* -------------------- Signals -------------------- */ +/* XXX Move it to jk_signal.c */ #ifdef HAVE_SIGNALS static struct sigaction jkAction; @@ -248,6 +254,7 @@ /* -------------------- User related functions -------------------- */ +/* XXX move it to jk_user.c */ JNIEXPORT jint JNICALL Java_org_apache_jk_apr_AprImpl_getPid(JNIEnv *jniEnv, jobject _jthis) @@ -290,251 +297,6 @@ return (jint)rc; } -/* -------------------- interprocess mutexes -------------------- */ - -/* ==================== Unix sockets ==================== */ -/* It seems apr doesn't support them yet, so this code will use the - 'native' calls. For 'tcp' sockets we just use what java provides. -*/ - -/* XXX @deprecated !!! All this will move to jk_channel_un, and we'll - use the same dispatch that we use for the jni channel !!! -*/ - -JNIEXPORT jlong JNICALL -Java_org_apache_jk_apr_AprImpl_unSocketClose(JNIEnv *jniEnv, jobject _jthis, - jlong socketJ, jint typeJ ) -{ - int socket=(int)socketJ; - int type=(int)typeJ; - /* shutdown( socket, type ); */ - close(socket); - return 0L; -} - -JNIEXPORT jlong JNICALL -Java_org_apache_jk_apr_AprImpl_unSocketListen(JNIEnv *jniEnv, jobject _jthis, - jstring hostJ, jint backlog ) -{ - const char *host; - int status; - int unixSocket=-1L; -#ifdef HAVE_UNIXSOCKETS - struct sockaddr_un unixAddr; - mode_t omask; - - memset(& unixAddr, 0, sizeof(struct sockaddr_un)); - unixAddr.sun_family=AF_UNIX; - - host=(*jniEnv)->GetStringUTFChars(jniEnv, hostJ, 0); - strcpy(unixAddr.sun_path, host); - (*jniEnv)->ReleaseStringUTFChars(jniEnv, hostJ, host); - - /* remove the exist socket. (it had been moved in ChannelUn.java). - if (unlink(unixAddr.sun_path) < 0 && errno != ENOENT) { - // The socket cannot be remove... Well I hope that no problems ;-) - } - */ - - unixSocket = socket(AF_UNIX, SOCK_STREAM, 0); - if (unixSocket<0) { - return 0L; - } - - omask = umask(0117); /* so that only Apache can use socket */ - - status=bind(unixSocket, - (struct sockaddr *)& unixAddr, - strlen( unixAddr.sun_path ) + - sizeof( unixAddr.sun_family) ); - - umask(omask); /* can't fail, so can't clobber errno */ - if (status<0) - return -errno; - - listen( unixSocket, (int)backlog ); - - fprintf(stderr, "Listening on %d \n", - unixSocket); -#endif - return (jlong)unixSocket; -} - -JNIEXPORT jlong JNICALL -Java_org_apache_jk_apr_AprImpl_unSocketConnect(JNIEnv *jniEnv, jobject _jthis, - jstring hostJ ) -{ - const char *host; - int status; - int unixSocket=-1L; -#ifdef HAVE_UNIXSOCKETS - struct sockaddr_un unixAddr; - - memset(& unixAddr, 0, sizeof(struct sockaddr_un)); - unixAddr.sun_family=AF_UNIX; - - host=(*jniEnv)->GetStringUTFChars(jniEnv, hostJ, 0); - if( host==NULL ) - return -1; - - strcpy(unixAddr.sun_path, host); - (*jniEnv)->ReleaseStringUTFChars(jniEnv, hostJ, host); - - unixSocket = socket(AF_UNIX, SOCK_STREAM, 0); - - if (unixSocket<0) { - return 0L; - } - - status=connect(unixSocket, - (struct sockaddr *)& unixAddr, - strlen( unixAddr.sun_path ) + - sizeof( unixAddr.sun_family) ); - - if( status < 0 ) { - /* Return error */ - return -1; - } - -#endif - return (jlong)unixSocket; -} - -JNIEXPORT jlong JNICALL -Java_org_apache_jk_apr_AprImpl_unAccept(JNIEnv *jniEnv, jobject _jthis, - jlong unSocketJ) -{ -#ifdef HAVE_UNIXSOCKETS - int listenUnSocket=(int)unSocketJ; - struct sockaddr_un client; - int clientlen; - - /* What to do with the address ? We could return an object, or do more. - For now we'll ignore it */ - - while( 1 ) { - int connfd; - - fprintf(stderr, "unAccept %d\n", listenUnSocket ); - - clientlen=sizeof( client ); - - connfd=accept( listenUnSocket, (struct sockaddr *)&client, &clientlen ); - /* XXX Should we return EINTR ? This would allow us to stop - */ - if( connfd < 0 ) { - fprintf(stderr, "unAccept: error %d\n", connfd); - if( errno==EINTR ) { - fprintf(stderr, "EINTR\n"); - continue; - } else { - fprintf(stderr, "Error accepting %d %d %s\n", - listenUnSocket, errno, strerror(errno)); - return (jlong)-errno; - } - } - fprintf(stderr, "unAccept: accepted %d\n", connfd); - return (jlong)connfd; - } -#endif - return 0L; -} - -JNIEXPORT jint JNICALL -Java_org_apache_jk_apr_AprImpl_unRead(JNIEnv *jniEnv, jobject _jthis, - jlong unSocketJ, - jbyteArray jbuf, jint from, jint cnt) -{ -#ifdef HAVE_UNIXSOCKETS - jbyte *nbuf; - int rd; - jboolean iscopy; - - /* We can't use Critical with blocking ops. - */ - nbuf = (*jniEnv)->GetByteArrayElements(jniEnv, jbuf, &iscopy); - if( ! nbuf ) { - return -1; - } - - if( iscopy==JNI_TRUE ) - fprintf( stderr, "aprImpl.unRead() get java bytes iscopy %d\n", iscopy); - - while( 1 ) { - /* Read */ - rd=read( (int)unSocketJ, nbuf + from, cnt ); - if( rd < 0 ) { - if( errno==EINTR ) { - fprintf(stderr, "EINTR\n"); - continue; - } else { - fprintf(stderr, "Error reading %d %d %s\n", - (int)unSocketJ, errno, strerror(errno)); - (*jniEnv)->ReleaseByteArrayElements(jniEnv, jbuf, nbuf, 0); - return -1; - } - } -/* fprintf(stderr, "Read %d from %d\n", */ -/* rd, unSocketJ); */ - - (*jniEnv)->ReleaseByteArrayElements(jniEnv, jbuf, nbuf, 0); - return (jint)rd; - } -#endif - return (jint)0; -} - -JNIEXPORT jint JNICALL -Java_org_apache_jk_apr_AprImpl_unWrite(JNIEnv *jniEnv, jobject _jthis, - jlong unSocketJ, jbyteArray jbuf, jint from, jint cnt) -{ - apr_status_t status; - jbyte *nbuf; - int rd=0; -#ifdef HAVE_UNIXSOCKETS - jboolean iscopy; - - nbuf = (*jniEnv)->GetByteArrayElements(jniEnv, jbuf, &iscopy); - if( ! nbuf ) { - return -1; - } - - /* write */ - write( (int) unSocketJ, nbuf + from, cnt ); - - (*jniEnv)->ReleaseByteArrayElements(jniEnv, jbuf, nbuf, 0); -#endif - return (jint)rd; -} - -/** - * setSoLinger - */ -JNIEXPORT jint JNICALL -Java_org_apache_jk_apr_AprImpl_unSetSoLingerNative ( - JNIEnv *env, - jobject ignored, - jint sd, - jint l_onoff, - jint l_linger) -{ -#ifdef HAVE_UNIXSOCKETS - struct linger { - int l_onoff; /* linger active */ - int l_linger; /* how many seconds to linger for */ - } lin; - int rc; - - lin.l_onoff = l_onoff; - lin.l_linger = l_linger; - rc=setsockopt(sd, SOL_SOCKET, SO_LINGER, &lin, sizeof(lin)); - if( rc < 0) { - return -errno; - } -#endif - return 0; -} - /* -------------------- Access jk components -------------------- */ /* @@ -653,12 +415,15 @@ jk_bean_t *component=(jk_bean_t *)(void *)(long)componentP; char *name=(char *)(*jniEnv)->GetStringUTFChars(jniEnv, nameJ, 0); char *value=(char *)(*jniEnv)->GetStringUTFChars(jniEnv, valueJ, 0); - int rc; + int rc=JK_OK; if( component->setAttribute ==NULL ) return JK_OK; - - rc=component->setAttribute( env, component, name, value ); + + if( component->setAttribute!=NULL ) { + rc=component->setAttribute( env, component, name, + component->pool->pstrdup( env, component->pool, value ) ); + } (*jniEnv)->ReleaseStringUTFChars(jniEnv, nameJ, name); (*jniEnv)->ReleaseStringUTFChars(jniEnv, valueJ, value); @@ -675,12 +440,11 @@ jk_env_t *env=(jk_env_t *)(void *)(long)xEnv; jk_bean_t *component=(jk_bean_t *)(void *)(long)componentP; int rc; - + if( component->init ==NULL ) return JK_OK; rc=component->init( env, component ); - return rc; } @@ -734,21 +498,25 @@ */ JNIEXPORT jint JNICALL Java_org_apache_jk_apr_AprImpl_jkInvoke - (JNIEnv *jniEnv, jobject o, jlong envJ, jlong componentP, jlong endpointP, jint code, jbyteArray data, jint len) + (JNIEnv *jniEnv, jobject o, jlong envJ, jlong componentP, jlong endpointP, jint code, + jbyteArray data, jint off, jint len, + jint raw) { jk_env_t *env = (jk_env_t *)(void *)(long)envJ; jk_bean_t *compCtx=(jk_bean_t *)(void *)(long)endpointP; void *target=(void *)(long)componentP; + jk_bean_t *bean=(jk_bean_t *)target; jk_endpoint_t *ep; jbyte *nbuf; jboolean iscopy; int cnt=0; - jint rc = -1; + jint rc = 0; unsigned acc = 0; + char *oldBuf; - if( compCtx==NULL || data==NULL || endpointP==NULL ) { + if( compCtx==NULL || data==NULL ) { env->l->jkLog(env, env->l, JK_LOG_ERROR,"jni.jkInvoke() NPE\n"); return JK_ERR; } @@ -772,26 +540,47 @@ return -1; } - ep->reply->reset(env, ep->reply); + if( raw==0 ) { + ep->reply->reset(env, ep->reply); + } + + // memcpy( ep->reply->buf, nbuf , len ); + oldBuf=ep->reply->buf; + ep->reply->buf = nbuf; - memcpy( ep->reply->buf, nbuf , len ); - rc=ep->reply->checkHeader( env, ep->reply, ep ); + if( raw == 0 ) { + rc=ep->reply->checkHeader( env, ep->reply, ep ); + } else { + ep->reply->len = len; + ep->reply->pos= off; + } + /* ep->reply->dump( env, ep->reply ,"MESSAGE"); */ if( rc < 0 ) { env->l->jkLog(env, env->l, JK_LOG_ERROR, "jkInvoke() invalid data\n"); /* we just can't recover, unset recover flag */ (*jniEnv)->ReleaseByteArrayElements(jniEnv, data, nbuf, 0); + ep->reply->buf=oldBuf; return JK_ERR; } - /* env->l->jkLog(env, env->l, JK_LOG_INFO, */ - /* "jkInvoke() component dispatch %d %d\n", rc, code); */ + env->l->jkLog(env, env->l, JK_LOG_INFO, + "jkInvoke() component dispatch %d %d %p\n", rc, code, bean->invoke); + + if( bean->invoke != NULL ) { + rc=bean->invoke( env, bean, ep, code, ep->reply, raw ); + } else { + /* Backward compat for AJP13 messages, where the code is used to + locate a handler. Deprecated, use the invoke() method ! */ + rc=workerEnv->dispatch( env, workerEnv, target, ep, code, ep->reply ); + } + /* XXX Copy back the response, if any */ - rc=workerEnv->dispatch( env, workerEnv, target, ep, code, ep->reply ); (*jniEnv)->ReleaseByteArrayElements(jniEnv, data, nbuf, 0); + ep->reply->buf=oldBuf; /* env->l->jkLog(env, env->l, JK_LOG_INFO, "jkInvoke() done\n"); */ 1.4 +3 -1 jakarta-tomcat-connectors/jk/native2/jni/org_apache_jk_apr_AprImpl.h Index: org_apache_jk_apr_AprImpl.h =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/jni/org_apache_jk_apr_AprImpl.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- org_apache_jk_apr_AprImpl.h 26 May 2002 07:38:17 -0000 1.3 +++ org_apache_jk_apr_AprImpl.h 28 May 2002 22:34:59 -0000 1.4 @@ -139,7 +139,9 @@ * Signature: (JJJI[BI)I */ JNIEXPORT jint JNICALL Java_org_apache_jk_apr_AprImpl_jkInvoke - (JNIEnv *, jclass, jlong, jlong, jlong, jint, jbyteArray, jint); + (JNIEnv *jniEnv, jobject o, jlong envJ, jlong componentP, jlong endpointP, jint code, + jbyteArray data, jint off, jint len, + jint raw); #ifdef __cplusplus }
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>