costin      02/01/06 01:01:52

  Modified:    jk/native2/jni jk_jni_aprImpl.c
  Added:       jk/native2/jni org_apache_jk_apr_AprImpl.h
  Log:
  Added code for unix sockets ( cut & paste from the C version ). It'll be 
replaced/merged
  with jfc's version.
  
  I also added few other methods to AprImpl, now pools seem to work ( it seems the 
first
  step in using APR ). Unix sockets are using 'native' code, not APR, but I hope
  it'll be integrated with apr code and we'll replace this with the plain apr socket.
  
  Other usefull functions we should add and test from APR ( for the short term ):
  - send signals
  - change user id
  
  Probably shared memory will happen in jk3.
  
  Revision  Changes    Path
  1.3       +208 -27   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.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- jk_jni_aprImpl.c  18 Dec 2001 22:51:55 -0000      1.2
  +++ jk_jni_aprImpl.c  6 Jan 2002 09:01:51 -0000       1.3
  @@ -65,22 +65,34 @@
   #include "apr.h"
   #include "apr_pools.h"
   
  +#include "apr_network_io.h"
  +#include "apr_errno.h"
  +#include "apr_general.h"
  +
  +#include <stdio.h>
  +#include <string.h>
  +#include <signal.h>
  +#include <sys/socket.h>
  +#include <sys/un.h>
  +
  +#include "org_apache_jk_apr_AprImpl.h"
  +
   JNIEXPORT jint JNICALL 
  -Java_org_apache_jk_apr_AprImpl_initialize(JNIEnv *env, jobject _jthis)
  +Java_org_apache_jk_apr_AprImpl_initialize(JNIEnv *jniEnv, jobject _jthis)
   {
  -    apr_initialize();
  +/*     apr_initialize(); */
       return 0;
   }
   
   JNIEXPORT jint JNICALL 
  -Java_org_apache_jk_apr_AprImpl_terminate(JNIEnv *env, jobject _jthis)
  +Java_org_apache_jk_apr_AprImpl_terminate(JNIEnv *jniEnv, jobject _jthis)
   {
  -    apr_terminate();
  +/*     apr_terminate(); */
       return 0;
   }
   
   JNIEXPORT jlong JNICALL 
  -Java_org_apache_jk_apr_AprImpl_poolCreate(JNIEnv *env, jobject _jthis, jlong 
parentP)
  +Java_org_apache_jk_apr_AprImpl_poolCreate(JNIEnv *jniEnv, jobject _jthis, jlong 
parentP)
   {
       apr_pool_t *parent;
       apr_pool_t *child;
  @@ -90,34 +102,56 @@
       return (jlong)(long)child;
   }
   
  -JNIEXPORT jint JNICALL 
  -Java_org_apache_jk_apr_AprImpl_poolClear(JNIEnv *env, jobject _jthis,
  +JNIEXPORT jlong JNICALL 
  +Java_org_apache_jk_apr_AprImpl_poolClear(JNIEnv *jniEnv, jobject _jthis,
                                            jlong poolP)
   {
       apr_pool_t *pool;
   
  -    pool=(apr_pool_t *)(void *)poolP;
  +    pool=(apr_pool_t *)(void *)(long)poolP;
       apr_pool_clear( pool );
       return 0;
   }
   
  +static void jkSigAction(int signal) {
  +
  +}
  +
  +static struct sigaction jkAction;
  +
  +/* XXX We need to: - preserve the old signal ( or get them ) - either
  +     implement "waitSignal" or use invocation in jkSigAction
  +
  +     Probably waitSignal() is better ( we can have a thread that waits )
  +*/
  +
   JNIEXPORT jint JNICALL 
  -Java_org_apache_jk_apr_AprImpl_signal(JNIEnv *env, jobject _jthis, jint signo,
  +Java_org_apache_jk_apr_AprImpl_signal(JNIEnv *jniEnv, jobject _jthis, jint bitMask,
                                         jobject func)
   {
  +    memset(& jkAction, 0, sizeof(jkAction));
  +    jkAction.sa_handler=jkSigAction;
  +    sigaction((int)bitMask, &jkAction, (void *) NULL);
  +    return 0;
  +}
  +
  +JNIEXPORT jint JNICALL 
  +Java_org_apache_jk_apr_AprImpl_sendSignal(JNIEnv *jniEnv, jobject _jthis, jint 
signo,
  +                                          jlong target)
  +{
   
       return 0;
   }
   
   JNIEXPORT jlong JNICALL 
  -Java_org_apache_jk_apr_AprImpl_userId(JNIEnv *env, jobject _jthis, jlong pool)
  +Java_org_apache_jk_apr_AprImpl_userId(JNIEnv *jniEnv, jobject _jthis, jlong pool)
   {
  -
  +    
       return 0;
   }
   
   JNIEXPORT jlong JNICALL 
  -Java_org_apache_jk_apr_AprImpl_shmInit(JNIEnv *env, jobject _jthis, jlong pool,
  +Java_org_apache_jk_apr_AprImpl_shmInit(JNIEnv *jniEnv, jobject _jthis, jlong pool,
                                          jlong size, jstring file)
   {
   
  @@ -125,7 +159,7 @@
   }
   
   JNIEXPORT jlong JNICALL 
  -Java_org_apache_jk_apr_AprImpl_shmDestroy(JNIEnv *env, jobject _jthis, jlong pool,
  +Java_org_apache_jk_apr_AprImpl_shmDestroy(JNIEnv *jniEnv, jobject _jthis, jlong 
pool,
                                             jlong size, jstring file)
   {
   
  @@ -133,35 +167,182 @@
   }
   
   
  +/* ==================== 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.
  +*/
  +
  +   
   JNIEXPORT jlong JNICALL 
  -Java_org_apache_jk_apr_AprImpl_socketCreate(JNIEnv *env, jobject _jthis, jint fam,
  -                                            jint type, jlong pool)
  +Java_org_apache_jk_apr_AprImpl_unSocketClose(JNIEnv *jniEnv, jobject _jthis, 
  +                                             jlong poolJ, jlong socketJ, jint typeJ 
)
   {
  -
  -    return 0;
  +    int socket=(int)socketJ;
  +    int type=(int)typeJ;
  +    shutdown( socket, type );
  +    return 0L;
   }
   
   JNIEXPORT jlong JNICALL 
  -Java_org_apache_jk_apr_AprImpl_socketBind(JNIEnv *env, jobject _jthis,
  -                                          jlong socket, jlong sa )
  +Java_org_apache_jk_apr_AprImpl_unSocketListen(JNIEnv *jniEnv, jobject _jthis, 
  +                                              jlong poolJ, jstring hostJ, jint 
backlog )
   {
  -
  -    return 0;
  +    apr_pool_t *pool=(apr_pool_t *)(void *)(long)poolJ;
  +    char *host;
  +    int status;
  +    int unixSocket;
  +    struct sockaddr_un unixAddr;
  +
  +    memset(& unixAddr, 0, sizeof(struct sockaddr_un));
  +    unixAddr.sun_family=AF_UNIX;
  +
  +    host=(*jniEnv)->GetStringUTFChars(jniEnv, hostJ, 0);
  +    strcpy(unixAddr.sun_path, host);
  +    
  +    unixSocket = socket(AF_UNIX, SOCK_STREAM, 0);
  +
  +    (*jniEnv)->ReleaseStringUTFChars(jniEnv, hostJ, host);
  +
  +    if (unixSocket<0) {
  +        return 0L;
  +    }
  +
  +    bind(unixSocket,
  +         (struct sockaddr *)& unixAddr,
  +         strlen( unixAddr.sun_path ) +
  +         sizeof( unixAddr.sun_family) );
  +
  +    listen( unixSocket, (int)backlog );
  +    
  +/*     fprintf(stderr, "Listening on %d \n", */
  +/*             unixSocket); */
  +    return (jlong)unixSocket;
   }
   
   JNIEXPORT jlong JNICALL 
  -Java_org_apache_jk_apr_AprImpl_socketListen(JNIEnv *env, jobject _jthis,
  -                                            jlong socket, jint bl )
  +Java_org_apache_jk_apr_AprImpl_unSocketConnect(JNIEnv *jniEnv, jobject _jthis, 
  +                                               jlong poolJ, jstring hostJ )
   {
  +    apr_pool_t *pool=(apr_pool_t *)(void *)(long)poolJ;
  +    char *host;
  +    int status;
  +    int unixSocket;
  +    struct sockaddr_un unixAddr;
  +
  +    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);
  +    
  +    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;
  +    }
   
  -    return 0;
  +    return (jlong)(long)(void *)unixSocket;
   }
   
   
  +JNIEXPORT jlong JNICALL 
  +Java_org_apache_jk_apr_AprImpl_unAccept(JNIEnv *jniEnv, jobject _jthis, 
  +                                      jlong poolJ, jlong unSocketJ)
  +{
  +    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;
  +
  +        clientlen=sizeof( client );
  +        connfd=accept( listenUnSocket, (struct sockaddr *)&client, &clientlen );
  +        if( connfd < 0 ) {
  +            if( errno==EINTR ) {
  +                fprintf(stderr, "EINTR\n");
  +                continue;
  +            } else {
  +                fprintf(stderr, "Error accepting %d %d %s\n",
  +                        listenUnSocket, errno, strerror(errno));
  +                return -1;
  +            }
  +        }
  +        return (jlong)connfd;
  +    }
  +    return 0L;
  +}
   
  +JNIEXPORT jint JNICALL 
  +Java_org_apache_jk_apr_AprImpl_unRead(JNIEnv *jniEnv, jobject _jthis, 
  +                                      jlong poolJ, jlong unSocketJ, jbyteArray 
bufJ, jint from, jint cnt)
  +{
  +    apr_pool_t *pool=(apr_pool_t *)(void *)(long)poolJ;
  +    jbyte *nbuf;
  +    int rd;
  +    jboolean iscommit;
  +
  +    nbuf = (*jniEnv)->GetByteArrayElements(jniEnv, bufJ, &iscommit);
  +    if( ! nbuf ) {
  +        return -1;
  +    }
  +
  +    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, bufJ, nbuf, 0);
  +                return -1;
  +            }
  +        }
  +/*         fprintf(stderr, "Read %d from %d\n", */
  +/*                 rd, unSocketJ); */
  +    
  +        (*jniEnv)->ReleaseByteArrayElements(jniEnv, bufJ, nbuf, 0);
  +        return (jint)rd;
  +    }
  +}
   
  -
  -
  -
  +JNIEXPORT jint JNICALL 
  +Java_org_apache_jk_apr_AprImpl_unWrite(JNIEnv *jniEnv, jobject _jthis, 
  +                                     jlong poolJ, jlong unSocketJ, jbyteArray bufJ, 
jint from, jint cnt)
  +{
  +    apr_status_t status;
  +    apr_pool_t *pool=(apr_pool_t *)(void *)(long)poolJ;
  +    jbyte *nbuf;
  +    int rd;
  +    jboolean iscommit;
  +
  +    nbuf = (*jniEnv)->GetByteArrayElements(jniEnv, bufJ, &iscommit);
  +    if( ! nbuf ) {
  +        return -1;
  +    }
  +
  +    /* write */
  +    write( (int) unSocketJ, nbuf + from, cnt );
  +    
  +    (*jniEnv)->ReleaseByteArrayElements(jniEnv, bufJ, nbuf, 0);
  +    return (jint)rd;
  +}
   
   
  
  
  
  1.1                  
jakarta-tomcat-connectors/jk/native2/jni/org_apache_jk_apr_AprImpl.h
  
  Index: org_apache_jk_apr_AprImpl.h
  ===================================================================
  /* DO NOT EDIT THIS FILE - it is machine generated */
  #include <jni.h>
  /* Header for class org_apache_jk_apr_AprImpl */
  
  #ifndef _Included_org_apache_jk_apr_AprImpl
  #define _Included_org_apache_jk_apr_AprImpl
  #ifdef __cplusplus
  extern "C" {
  #endif
  /*
   * Class:     org_apache_jk_apr_AprImpl
   * Method:    initialize
   * Signature: ()I
   */
  JNIEXPORT jint JNICALL Java_org_apache_jk_apr_AprImpl_initialize
    (JNIEnv *, jobject);
  
  /*
   * Class:     org_apache_jk_apr_AprImpl
   * Method:    terminate
   * Signature: ()I
   */
  JNIEXPORT jint JNICALL Java_org_apache_jk_apr_AprImpl_terminate
    (JNIEnv *, jobject);
  
  /*
   * Class:     org_apache_jk_apr_AprImpl
   * Method:    poolCreate
   * Signature: (J)J
   */
  JNIEXPORT jlong JNICALL Java_org_apache_jk_apr_AprImpl_poolCreate
    (JNIEnv *, jobject, jlong);
  
  /*
   * Class:     org_apache_jk_apr_AprImpl
   * Method:    poolClear
   * Signature: (J)J
   */
  JNIEXPORT jlong JNICALL Java_org_apache_jk_apr_AprImpl_poolClear
    (JNIEnv *, jobject, jlong);
  
  /*
   * Class:     org_apache_jk_apr_AprImpl
   * Method:    unSocketClose
   * Signature: (JJI)J
   */
  JNIEXPORT jlong JNICALL Java_org_apache_jk_apr_AprImpl_unSocketClose
    (JNIEnv *, jobject, jlong, jlong, jint);
  
  /*
   * Class:     org_apache_jk_apr_AprImpl
   * Method:    unSocketListen
   * Signature: (JLjava/lang/String;I)J
   */
  JNIEXPORT jlong JNICALL Java_org_apache_jk_apr_AprImpl_unSocketListen
    (JNIEnv *, jobject, jlong, jstring, jint);
  
  /*
   * Class:     org_apache_jk_apr_AprImpl
   * Method:    unSocketConnect
   * Signature: (JLjava/lang/String;)J
   */
  JNIEXPORT jlong JNICALL Java_org_apache_jk_apr_AprImpl_unSocketConnect
    (JNIEnv *, jobject, jlong, jstring);
  
  /*
   * Class:     org_apache_jk_apr_AprImpl
   * Method:    unAccept
   * Signature: (JJ)J
   */
  JNIEXPORT jlong JNICALL Java_org_apache_jk_apr_AprImpl_unAccept
    (JNIEnv *, jobject, jlong, jlong);
  
  /*
   * Class:     org_apache_jk_apr_AprImpl
   * Method:    unRead
   * Signature: (JJ[BII)I
   */
  JNIEXPORT jint JNICALL Java_org_apache_jk_apr_AprImpl_unRead
    (JNIEnv *, jobject, jlong, jlong, jbyteArray, jint, jint);
  
  /*
   * Class:     org_apache_jk_apr_AprImpl
   * Method:    unWrite
   * Signature: (JJ[BII)I
   */
  JNIEXPORT jint JNICALL Java_org_apache_jk_apr_AprImpl_unWrite
    (JNIEnv *, jobject, jlong, jlong, jbyteArray, jint, jint);
  
  #ifdef __cplusplus
  }
  #endif
  #endif
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to