blob: e11e7a8cf8f69c06579a1c91755de8981c42c58e [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.
*/
#ifndef MOD_PERL_H
#define MOD_PERL_H
#include "modperl_apache_includes.h"
#include "modperl_common_includes.h"
#include "modperl_apache_compat.h"
#ifdef WIN32
#define MP_THREADED 1
#else
#define MP_THREADED (defined(USE_ITHREADS) && APR_HAS_THREADS)
#endif
extern module AP_MODULE_DECLARE_DATA perl_module;
#include "modperl_error.h"
#include "modperl_flags.h"
#include "modperl_hooks.h"
#include "modperl_perl_global.h"
#include "modperl_perl_pp.h"
#include "modperl_sys.h"
#include "modperl_const.h"
#include "modperl_constants.h"
/* both perl and apr have largefile support enabled */
#if defined(USE_LARGE_FILES) && APR_HAS_LARGE_FILES
#define MP_LARGE_FILES_ENABLED
#endif
/* both perl and apr have largefile support disabled */
#if (!defined(USE_LARGE_FILES)) && !APR_HAS_LARGE_FILES
#define MP_LARGE_FILES_DISABLED
#endif
/* perl largefile support is enabled, apr support is disabled */
#if defined(USE_LARGE_FILES) && !APR_HAS_LARGE_FILES
#define MP_LARGE_FILES_PERL_ONLY
#endif
/* apr largefile support is enabled, perl support is disabled */
#if (!defined(USE_LARGE_FILES)) && APR_HAS_LARGE_FILES
#define MP_LARGE_FILES_APR_ONLY
#endif
/* conflict due to not have either both perl and apr
* support enabled or both disabled
*/
#if defined(MP_LARGE_FILES_APR_ONLY) || defined(MP_LARGE_FILES_PERL_ONLY)
#define MP_LARGE_FILES_CONFLICT
#endif
#ifdef MP_USE_GTOP
#include "modperl_gtop.h"
#endif
#include "modperl_time.h"
#include "modperl_types.h"
#include "modperl_util.h"
#include "modperl_config.h"
#include "modperl_cmd.h"
#include "modperl_handler.h"
#include "modperl_callback.h"
#include "modperl_tipool.h"
#include "modperl_interp.h"
#include "modperl_log.h"
#include "modperl_options.h"
#include "modperl_directives.h"
#include "modperl_io.h"
#include "modperl_io_apache.h"
#include "modperl_filter.h"
#include "modperl_bucket.h"
#include "modperl_pcw.h"
#include "modperl_mgv.h"
#include "modperl_global.h"
#include "modperl_env.h"
#include "modperl_cgi.h"
#include "modperl_perl.h"
#include "modperl_svptr_table.h"
#include "modperl_module.h"
#include "modperl_debug.h"
int modperl_threads_started(void);
int modperl_threaded_mpm(void);
int modperl_post_post_config_phase(void);
#define MP_CROAK_IF_THREADS_STARTED(what) \
if (modperl_threads_started()) { \
Perl_croak(aTHX_ "Can't run '%s' in the threaded " \
"environment after server startup", what); \
}
#define MP_CROAK_IF_THREADED_MPM(what) \
if (modperl_threaded_mpm()) { \
Perl_croak(aTHX_ "Can't run '%s' in a threaded mpm", \
what); \
}
#define MP_CROAK_IF_POST_POST_CONFIG_PHASE(what) \
if (modperl_post_post_config_phase()) { \
Perl_croak(aTHX_ "Can't run '%s' after server startup", \
what); \
}
int modperl_init_vhost(server_rec *s, apr_pool_t *p,
server_rec *base_server);
void modperl_init(server_rec *s, apr_pool_t *p);
void modperl_init_globals(server_rec *s, apr_pool_t *pconf);
int modperl_run(void);
int modperl_is_running(void);
int modperl_hook_init(apr_pool_t *pconf, apr_pool_t *plog,
apr_pool_t *ptemp, server_rec *s);
int modperl_hook_pre_config(apr_pool_t *p, apr_pool_t *plog,
apr_pool_t *ptemp);
void modperl_register_hooks(apr_pool_t *p);
apr_pool_t *modperl_server_pool(void);
apr_pool_t *modperl_server_user_pool(void);
PerlInterpreter *modperl_startup(server_rec *s, apr_pool_t *p);
int modperl_perl_destruct_level(void);
void xs_init(pTHX);
void modperl_response_init(request_rec *r);
apr_status_t modperl_response_finish(request_rec *r);
int modperl_response_handler(request_rec *r);
int modperl_response_handler_cgi(request_rec *r);
#define MgTypeExt(mg) (mg->mg_type == '~')
typedef void MP_FUNC_NONSTD_T(modperl_var_modify_t) (apr_table_t *,
apr_table_t *,
const char *,
const char *);
/* we need to hook a few internal things before APR_HOOK_REALLY_FIRST */
#define MODPERL_HOOK_REALLY_REALLY_FIRST (-20)
#ifdef USE_ITHREADS
APR_DECLARE_OPTIONAL_FN(apr_status_t,modperl_interp_unselect,(void *));
APR_DECLARE_OPTIONAL_FN(modperl_interp_t *,modperl_thx_interp_get,(PerlInterpreter *));
#endif
/*
* perl context overriding and restoration is required when
* PerlOptions +Parent/+Clone is used in vhosts, and perl is used to
* at the server startup. So that <Perl> sections, PerlLoadModule,
* PerlModule and PerlRequire are all run using the right perl context
* and restore to the original context when they are done.
*
* As of perl-5.8.3 it's unfortunate that it uses PERL_GET_CONTEXT and
* doesn't rely on the passed pTHX internally. When and if perl is
* fixed to always use pTHX if available, this context switching mess
* can be removed.
*/
#ifdef USE_ITHREADS
#define MP_PERL_CONTEXT_DECLARE \
PerlInterpreter *orig_perl = NULL; \
pTHX;
#define MP_PERL_CONTEXT_STORE \
orig_perl = PERL_GET_CONTEXT;
#define MP_PERL_CONTEXT_OVERRIDE(new_perl) \
aTHX = new_perl; \
PERL_SET_CONTEXT(aTHX);
#define MP_PERL_CONTEXT_STORE_OVERRIDE(new_perl) \
MP_PERL_CONTEXT_STORE; \
MP_PERL_CONTEXT_OVERRIDE(new_perl)
#define MP_PERL_CONTEXT_RESTORE \
if (orig_perl) { \
PERL_SET_CONTEXT(orig_perl); \
}
#else /* #ifdef USE_ITHREADS */
#define MP_PERL_CONTEXT_DECLARE
#define MP_PERL_CONTEXT_STORE
#define MP_PERL_CONTEXT_OVERRIDE(new_perl)
#define MP_PERL_CONTEXT_STORE_OVERRIDE(new_perl)
#define MP_PERL_CONTEXT_RESTORE
#endif /* end of #ifdef USE_ITHREADS */
#endif /* MOD_PERL_H */
/*
* Local Variables:
* c-basic-offset: 4
* indent-tabs-mode: nil
* End:
*/