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>