You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by co...@apache.org on 2002/06/12 00:09:11 UTC

cvs commit: jakarta-tomcat-connectors/jk/native2/common jk_signal.c jk_user.c

costin      2002/06/11 15:09:11

  Added:       jk/native2/common jk_signal.c jk_user.c
  Log:
  Moved the signal and user handling to 'normal' jk components.
  ( to keep the jni simple )
  
  Revision  Changes    Path
  1.1                  jakarta-tomcat-connectors/jk/native2/common/jk_signal.c
  
  Index: jk_signal.c
  ===================================================================
  /* ========================================================================= *
   *                                                                           *
   *                 The Apache Software License,  Version 1.1                 *
   *                                                                           *
   *          Copyright (c) 1999-2001 The Apache Software Foundation.          *
   *                           All rights reserved.                            *
   *                                                                           *
   * ========================================================================= *
   *                                                                           *
   * Redistribution and use in source and binary forms,  with or without modi- *
   * fication, are permitted provided that the following conditions are met:   *
   *                                                                           *
   * 1. Redistributions of source code  must retain the above copyright notice *
   *    notice, this list of conditions and the following disclaimer.          *
   *                                                                           *
   * 2. Redistributions  in binary  form  must  reproduce the  above copyright *
   *    notice,  this list of conditions  and the following  disclaimer in the *
   *    documentation and/or other materials provided with the distribution.   *
   *                                                                           *
   * 3. The end-user documentation  included with the redistribution,  if any, *
   *    must include the following acknowlegement:                             *
   *                                                                           *
   *       "This product includes  software developed  by the Apache  Software *
   *        Foundation <http://www.apache.org/>."                              *
   *                                                                           *
   *    Alternately, this acknowlegement may appear in the software itself, if *
   *    and wherever such third-party acknowlegements normally appear.         *
   *                                                                           *
   * 4. The names  "The  Jakarta  Project",  "Jk",  and  "Apache  Software     *
   *    Foundation"  must not be used  to endorse or promote  products derived *
   *    from this  software without  prior  written  permission.  For  written *
   *    permission, please contact <ap...@apache.org>.                        *
   *                                                                           *
   * 5. Products derived from this software may not be called "Apache" nor may *
   *    "Apache" appear in their names without prior written permission of the *
   *    Apache Software Foundation.                                            *
   *                                                                           *
   * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES *
   * INCLUDING, BUT NOT LIMITED TO,  THE IMPLIED WARRANTIES OF MERCHANTABILITY *
   * AND FITNESS FOR  A PARTICULAR PURPOSE  ARE DISCLAIMED.  IN NO EVENT SHALL *
   * THE APACHE  SOFTWARE  FOUNDATION OR  ITS CONTRIBUTORS  BE LIABLE  FOR ANY *
   * DIRECT,  INDIRECT,   INCIDENTAL,  SPECIAL,  EXEMPLARY,  OR  CONSEQUENTIAL *
   * DAMAGES (INCLUDING,  BUT NOT LIMITED TO,  PROCUREMENT OF SUBSTITUTE GOODS *
   * OR SERVICES;  LOSS OF USE,  DATA,  OR PROFITS;  OR BUSINESS INTERRUPTION) *
   * HOWEVER CAUSED AND  ON ANY  THEORY  OF  LIABILITY,  WHETHER IN  CONTRACT, *
   * STRICT LIABILITY, OR TORT  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *
   * ANY  WAY  OUT OF  THE  USE OF  THIS  SOFTWARE,  EVEN  IF  ADVISED  OF THE *
   * POSSIBILITY OF SUCH DAMAGE.                                               *
   *                                                                           *
   * ========================================================================= *
   *                                                                           *
   * This software  consists of voluntary  contributions made  by many indivi- *
   * duals on behalf of the  Apache Software Foundation.  For more information *
   * on the Apache Software Foundation, please see <http://www.apache.org/>.   *
   *                                                                           *
   * ========================================================================= */
  
  #include "jk_global.h"
  #include "jk_map.h"
  #include "jk_pool.h"
  #include "jk_channel.h"
  
  
  #ifdef HAVE_SIGNAL
  
  #include "signal.h"
  
  /** Deal with 'signals'. 
   */
  
  static struct sigaction jkAction;
  
  /* We use a jni channel to send the notification to java
   */
  static jk_channel_t *jniChannel;
  
  /* XXX we should sync or use multiple endpoints if multiple signals
     can be concurent
  */
  static jk_endpoint_t *signalEndpoint;
  
  static void jk2_SigAction(int sig) {
      jk_env_t *env;
      
      /* Make a callback using the jni channel */
      fprintf(stderr, "Signal %d\n", sig );
  
      if( jk_env_globalEnv == NULL ) {
          return;
      }
  
      env=jk_env_globalEnv->getEnv( jk_env_globalEnv );
  
      if( jniChannel==NULL ) {
          jniChannel=env->getByName( env, "channel.jni:jni" );
          fprintf(stderr, "Got jniChannel %p\n", jniChannel );
      }
      if( jniChannel==NULL ) {
          return;
      }
      if( signalEndpoint == NULL ) {
          jk_bean_t *component=env->createBean2( env, NULL, "endpoint", NULL );
          if( component == NULL ) {
              fprintf(stderr, "Can't create endpoint\n" );
              return;
          }
          component->init( env, component );
          fprintf(stderr, "Create endpoint %p\n", component->object );
          signalEndpoint=component->object;
      }
  
      /* Channel:jni should be initialized by the caller */
  
      /* XXX make the callback */
      
      jk_env_globalEnv->releaseEnv( jk_env_globalEnv, env );
  
  }
  
  
  /* XXX We need to: - preserve the old signal ( or get them ) - either
       implement "waitSignal" or use invocation in jk2_SigAction
  
       Probably waitSignal() is better ( we can have a thread that waits )
   */
  
  static int jk2_signal_signal(jk_env_t *env, int signalNr )
  {
      memset(& jkAction, 0, sizeof(jkAction));
      jkAction.sa_handler=jk2_SigAction;
      sigaction(signalNr, &jkAction, (void *) NULL);
      return 0;
  }
  
  static int jk2_signal_sendSignal(jk_env_t *env, int target , int signo)
  {
      return kill( (pid_t)target, signo );
  }
  
  
  
  int JK_METHOD jk2_signal_factory( jk_env_t *env ,jk_pool_t *pool,
                                    jk_bean_t *result,
                                    const char *type, const char *name)
  {
      result->setAttribute=NULL;
      result->object="signal_struct_placeholder";
      result->invoke=NULL;
      result->init=NULL;
      result->destroy=NULL;
      
      return JK_OK;
  }
  
  
  
  #else /* ! HAVE_SIGNALS */
  
  int JK_METHOD jk2_signal_factory( jk_env_t *env ,jk_pool_t *pool,
                                    jk_bean_t *result,
                                    const char *type, const char *name)
  {
      result->disabled=JK_TRUE;
  }
  
  #endif
  
  
  
  1.1                  jakarta-tomcat-connectors/jk/native2/common/jk_user.c
  
  Index: jk_user.c
  ===================================================================
  /* ========================================================================= *
   *                                                                           *
   *                 The Apache Software License,  Version 1.1                 *
   *                                                                           *
   *          Copyright (c) 1999-2001 The Apache Software Foundation.          *
   *                           All rights reserved.                            *
   *                                                                           *
   * ========================================================================= *
   *                                                                           *
   * Redistribution and use in source and binary forms,  with or without modi- *
   * fication, are permitted provided that the following conditions are met:   *
   *                                                                           *
   * 1. Redistributions of source code  must retain the above copyright notice *
   *    notice, this list of conditions and the following disclaimer.          *
   *                                                                           *
   * 2. Redistributions  in binary  form  must  reproduce the  above copyright *
   *    notice,  this list of conditions  and the following  disclaimer in the *
   *    documentation and/or other materials provided with the distribution.   *
   *                                                                           *
   * 3. The end-user documentation  included with the redistribution,  if any, *
   *    must include the following acknowlegement:                             *
   *                                                                           *
   *       "This product includes  software developed  by the Apache  Software *
   *        Foundation <http://www.apache.org/>."                              *
   *                                                                           *
   *    Alternately, this acknowlegement may appear in the software itself, if *
   *    and wherever such third-party acknowlegements normally appear.         *
   *                                                                           *
   * 4. The names  "The  Jakarta  Project",  "Jk",  and  "Apache  Software     *
   *    Foundation"  must not be used  to endorse or promote  products derived *
   *    from this  software without  prior  written  permission.  For  written *
   *    permission, please contact <ap...@apache.org>.                        *
   *                                                                           *
   * 5. Products derived from this software may not be called "Apache" nor may *
   *    "Apache" appear in their names without prior written permission of the *
   *    Apache Software Foundation.                                            *
   *                                                                           *
   * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES *
   * INCLUDING, BUT NOT LIMITED TO,  THE IMPLIED WARRANTIES OF MERCHANTABILITY *
   * AND FITNESS FOR  A PARTICULAR PURPOSE  ARE DISCLAIMED.  IN NO EVENT SHALL *
   * THE APACHE  SOFTWARE  FOUNDATION OR  ITS CONTRIBUTORS  BE LIABLE  FOR ANY *
   * DIRECT,  INDIRECT,   INCIDENTAL,  SPECIAL,  EXEMPLARY,  OR  CONSEQUENTIAL *
   * DAMAGES (INCLUDING,  BUT NOT LIMITED TO,  PROCUREMENT OF SUBSTITUTE GOODS *
   * OR SERVICES;  LOSS OF USE,  DATA,  OR PROFITS;  OR BUSINESS INTERRUPTION) *
   * HOWEVER CAUSED AND  ON ANY  THEORY  OF  LIABILITY,  WHETHER IN  CONTRACT, *
   * STRICT LIABILITY, OR TORT  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *
   * ANY  WAY  OUT OF  THE  USE OF  THIS  SOFTWARE,  EVEN  IF  ADVISED  OF THE *
   * POSSIBILITY OF SUCH DAMAGE.                                               *
   *                                                                           *
   * ========================================================================= *
   *                                                                           *
   * This software  consists of voluntary  contributions made  by many indivi- *
   * duals on behalf of the  Apache Software Foundation.  For more information *
   * on the Apache Software Foundation, please see <http://www.apache.org/>.   *
   *                                                                           *
   * ========================================================================= */
  
  #include "jk_global.h"
  #include "jk_map.h"
  #include "jk_pool.h"
  
  #ifndef WIN32
  
  #include <unistd.h>
  #include <pwd.h>
  
  typedef struct jk_user {
      char *user;
      char *group;
  } jk_user_t;
  
  /* -------------------- User related functions -------------------- */
  /* XXX move it to jk_user.c */
  
  static int JK_METHOD jk2_user_setAttribute( jk_env_t *env, jk_bean_t *mbean, char *name, void *valueP ) {
      char *value=(char *)valueP;
      jk_user_t *usr=(jk_user_t *)mbean->object;
      
      if( strcmp( "user", name ) == 0 ) {
          usr->user=value;
      } else if( strcmp( "group", name ) == 0 ) {
          usr->group=value;
      } else {
  	return JK_ERR;
      }
      return JK_OK;   
  
  }
  
  /** This is ugly, we should use a jk_msg to pass string/int/etc
   */
  static void *JK_METHOD jk2_user_getAttribute( jk_env_t *env, jk_bean_t *mbean, char *name ) {
      
      if( strcmp( "pid", name ) == 0 ) {
          char *buf=env->tmpPool->calloc( env, env->tmpPool, 20 );
          sprintf( buf, "%d", getpid());
          return buf;
      }
      return NULL;   
  }
  
  static int JK_METHOD jk2_user_init(jk_env_t *env, jk_bean_t *chB )
  {
      jk_user_t *usr=chB->object;
      struct passwd *passwd;
      int uid;
      int gid;
      int rc;
      
      if( usr->user == NULL ) return JK_OK;
  
      passwd = getpwnam(usr->user);
      if (passwd == NULL ) {
          return JK_ERR;
      }
  
      uid = passwd->pw_uid;
      gid = passwd->pw_gid;
  
      rc = setuid(uid);
  
      return rc;
  }
  
  int JK_METHOD jk2_user_factory( jk_env_t *env ,jk_pool_t *pool,
                                  jk_bean_t *result,
                                  const char *type, const char *name)
  {
      result->setAttribute=jk2_user_setAttribute;
      result->getAttribute=jk2_user_getAttribute;
      result->object=pool->calloc( env, pool, sizeof( jk_user_t ));
      result->invoke=NULL;
      result->init=jk2_user_init;
      result->destroy=NULL;
      
      return JK_OK;
  }
  
  
  
  #else /* ! HAVE_SIGNALS */
  
  int JK_METHOD jk2_user_factory( jk_env_t *env ,jk_pool_t *pool,
                                    jk_bean_t *result,
                                    const char *type, const char *name)
  {
      result->disabled=JK_TRUE;
  }
  
  #endif
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>


RE: cvs commit: jakarta-tomcat-connectors/jk/native2/common jk_signal.c jk_user.c

Posted by co...@covalent.net.
On Wed, 12 Jun 2002, Mladen Turk wrote:

> Can you tell me what is the final goal of implementing the signals?

Well, my first 'itch' was the ability for a java program to send 
a SIGHUP to apache. Beeing able to receive a SIGHUP seemed interesting
too :-) 

> I ask you that because I'm working on a something simillar I hope, and
> more powerfull then standard signals offer. Basically it's a concept of
> apache server module hooks implemented on a module level, with the
> abillity to add the custom callback functions on the C and on the Java
> side.

The signals in jk are only for use by Java, and mostly for experimental
or specialized use. 

One of my goals is to explore using OS-specific features, which are not 
typically available to java programs ( because not portable ). I believe
this will allow better integration between java and the rest of the
world. 

Some may think that eventually all software in the world will be
written in java, and all OS-es will have exactly the same features
since nobody will be able to use specific features. Until this happens,
I think it would be nice to use the full power of the OS and 
integrate with the 'legacy' languages ( or C# will do it ) :-)


> On the other hand it would be platform independent. The only drawback is
> that the APR has to be enabled.

That would be great - and jkjni requires APR anyway. You may notice
the java class is called AprImpl, one of the goals is to expose all
APR features that are not available in java. 

Initially the class was just a jni wrapper to APR functions. Unfortunately
the JNI performance characteristics made this a bad solution, so now we
use all the tricks with buffer pinning to get around this. 

If your abstraction in APR will support signals ( as a particular case ),
then jk_signal will just go away. If not, I think it is valuable
to provide both - unix signals are one of the things that java lacks
and are usefull for integrating java with other applications. 

Costin


--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>


RE: cvs commit: jakarta-tomcat-connectors/jk/native2/common jk_signal.c jk_user.c

Posted by Mladen Turk <mt...@mappingsoft.com>.

> -----Original Message-----
> From: costin@apache.org [mailto:costin@apache.org] 
> Sent: 12. lipanj 2002 0:09
> To: jakarta-tomcat-connectors-cvs@apache.org
> Subject: cvs commit: 
> jakarta-tomcat-connectors/jk/native2/common jk_signal.c jk_user.c
> 
> 
> costin      2002/06/11 15:09:11
> 
>   Added:       jk/native2/common jk_signal.c jk_user.c
>   Log:
>   Moved the signal and user handling to 'normal' jk components.
>   ( to keep the jni simple )
>   
>   Revision  Changes    Path
>   1.1                  
> jakarta-tomcat-connectors/jk/native2/common/jk_signal.c
>   

Can you tell me what is the final goal of implementing the signals?

I ask you that because I'm working on a something simillar I hope, and
more powerfull then standard signals offer. Basically it's a concept of
apache server module hooks implemented on a module level, with the
abillity to add the custom callback functions on the C and on the Java
side.
On the other hand it would be platform independent. The only drawback is
that the APR has to be enabled.

MT.


--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>