blob: f52ed0a3400a42ae7a478238d767ad5f345ae6d1 [file] [log] [blame]
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
#if !defined(OS2) && !defined(WIN32) && !defined(BEOS) && !defined(NETWARE)
#include "unixd.h"
#endif
#define mpxs_Apache2__ServerUtil_restart_count modperl_restart_count
#define mpxs_Apache2__ServerRec_method_register(s, methname) \
ap_method_register(s->process->pconf, methname);
#define mpxs_Apache2__ServerRec_add_version_component(s, component) \
ap_add_version_component(s->process->pconf, component);
/* XXX: the mpxs_cleanup_t and mpxs_cleanup_run are almost dups with
* code in APR__Pool.h (minus interpr member which is not used
* here. They should be moved to modperl_common_util - the problem is
* modperl_interp_t *, which can't live in modperl_common_* since it
* creates a dependency on mod_perl. A possible solution is to use
* void * for that slot and cast it to modperl_interp_t * when used
*/
typedef struct {
SV *cv;
SV *arg;
apr_pool_t *p;
#ifdef USE_ITHREADS
PerlInterpreter *perl;
#endif
} mpxs_cleanup2_t;
/**
* callback wrapper for Perl cleanup subroutines
* @param data internal storage
*/
static apr_status_t mpxs_cleanup_run(void *data)
{
int count;
mpxs_cleanup2_t *cdata = (mpxs_cleanup2_t *)data;
#ifdef USE_ITHREADS
dTHXa(cdata->perl);
#endif
dSP;
#ifdef USE_ITHREADS
PERL_SET_CONTEXT(aTHX);
#endif
ENTER;SAVETMPS;
PUSHMARK(SP);
if (cdata->arg) {
XPUSHs(cdata->arg);
}
PUTBACK;
save_gp(PL_errgv, 1); /* local *@ */
count = call_sv(cdata->cv, G_SCALAR|G_EVAL);
SPAGAIN;
if (count == 1) {
(void)POPs; /* the return value is ignored */
}
if (SvTRUE(ERRSV)) {
Perl_warn(aTHX_ "Apache2::ServerUtil: cleanup died: %s",
SvPV_nolen(ERRSV));
}
PUTBACK;
FREETMPS;LEAVE;
SvREFCNT_dec(cdata->cv);
if (cdata->arg) {
SvREFCNT_dec(cdata->arg);
}
/* the return value is ignored by apr_pool_destroy anyway */
return APR_SUCCESS;
}
/* this cleanups registered by this function are run only by the
* parent interpreter */
static MP_INLINE
void mpxs_Apache2__ServerUtil_server_shutdown_cleanup_register(pTHX_ SV *cv,
SV *arg)
{
mpxs_cleanup2_t *data;
apr_pool_t *p;
MP_CROAK_IF_POST_POST_CONFIG_PHASE("server_shutdown_cleanup_register");
p = modperl_server_user_pool();
/* must use modperl_server_user_pool here to make sure that it's run
* before parent perl is destroyed */
data = (mpxs_cleanup2_t *)apr_pcalloc(p, sizeof(*data));
data->cv = SvREFCNT_inc(cv);
data->arg = arg ? SvREFCNT_inc(arg) : (SV *)NULL;
data->p = p;
#ifdef USE_ITHREADS
data->perl = aTHX;
#endif /* USE_ITHREADS */
apr_pool_cleanup_register(p, data, mpxs_cleanup_run,
apr_pool_cleanup_null);
}
static MP_INLINE
int mpxs_Apache2__ServerRec_push_handlers(pTHX_ server_rec *s,
const char *name,
SV *sv)
{
return modperl_handler_perl_add_handlers(aTHX_
NULL, NULL, s,
s->process->pconf,
name, sv,
MP_HANDLER_ACTION_PUSH);
}
static MP_INLINE
int mpxs_Apache2__ServerRec_set_handlers(pTHX_ server_rec *s,
const char *name,
SV *sv)
{
return modperl_handler_perl_add_handlers(aTHX_
NULL, NULL, s,
s->process->pconf,
name, sv,
MP_HANDLER_ACTION_SET);
}
static MP_INLINE
SV *mpxs_Apache2__ServerRec_get_handlers(pTHX_ server_rec *s,
const char *name)
{
MpAV **handp =
modperl_handler_get_handlers(NULL, NULL, s,
s->process->pconf, name,
MP_HANDLER_ACTION_GET);
return modperl_handler_perl_get_handlers(aTHX_ handp,
s->process->pconf);
}
#define mpxs_Apache2__ServerRec_dir_config(s, key, sv_val) \
modperl_dir_config(aTHX_ NULL, s, key, sv_val)
#define mpxs_Apache2__ServerUtil_server(classname) modperl_global_get_server_rec()
#if !defined(OS2) && !defined(WIN32) && !defined(BEOS) && !defined(NETWARE)
#define mpxs_Apache2__ServerUtil_user_id(classname) ap_unixd_config.user_id
#define mpxs_Apache2__ServerUtil_group_id(classname) ap_unixd_config.group_id
#else
#define mpxs_Apache2__ServerUtil_user_id(classname) 0
#define mpxs_Apache2__ServerUtil_group_id(classname) 0
#endif
static MP_INLINE
int mpxs_Apache2__ServerRec_is_perl_option_enabled(pTHX_ server_rec *s,
const char *name)
{
return modperl_config_is_perl_option_enabled(aTHX_ NULL, s, name);
}
static MP_INLINE
void mpxs_Apache2__ServerRec_add_config(pTHX_ server_rec *s, SV *lines)
{
const char *errmsg;
MP_CROAK_IF_POST_POST_CONFIG_PHASE("$s->add_config");
errmsg = modperl_config_insert_server(aTHX_ s, lines);
if (errmsg) {
Perl_croak(aTHX_ "$s->add_config() has failed: %s", errmsg);
}
}
#define mpxs_Apache2__ServerRec_get_server_banner \
ap_get_server_banner()
#define mpxs_Apache2__ServerRec_get_server_description \
ap_get_server_description()
#define mpxs_Apache2__ServerRec_get_server_version \
ap_get_server_version()
static void mpxs_Apache2__ServerUtil_BOOT(pTHX)
{
newCONSTSUB(PL_defstash, "Apache2::ServerUtil::server_root",
newSVpv(ap_server_root, 0));
newCONSTSUB(PL_defstash, "Apache2::ServerUtil::get_server_built",
newSVpv(ap_get_server_built(), 0));
}
#if AP_SERVER_MAJORVERSION_NUMBER>2 || \
(AP_SERVER_MAJORVERSION_NUMBER == 2 && AP_SERVER_MINORVERSION_NUMBER>=3)
static MP_INLINE
int mpxs_Apache2__ServerRec_loglevel(pTHX_ server_rec *s, int loglevel)
{
if (loglevel) {
s->log.level = loglevel;
}
return s->log.level;
}
#endif
/*
* Local Variables:
* c-basic-offset: 4
* indent-tabs-mode: nil
* End:
*/