Current Path : /usr/local/include/apache/modules/perl/ |
FreeBSD hs32.drive.ne.jp 9.1-RELEASE FreeBSD 9.1-RELEASE #1: Wed Jan 14 12:18:08 JST 2015 root@hs32.drive.ne.jp:/sys/amd64/compile/hs32 amd64 |
Current File : //usr/local/include/apache/modules/perl/mod_perl.h |
/* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 1996-2000 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * 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 acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" 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 apache@apache.org. * * 5. Products derived from this software may not be called "Apache", * nor may "Apache" appear in their name, 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. * ==================================================================== */ #ifdef WIN32 #define NO_PERL_CHILD_INIT #define NO_PERL_CHILD_EXIT #ifdef JW_PERL_OBJECT #include <winsock2.h> #include <malloc.h> #include <win32.h> #include <win32iop.h> #include <fcntl.h> // For O_BINARY #include "EXTERN.h" #include "perl.h" #include <iperlsys.h> #else #include "dirent.h" #endif #endif #ifndef IS_MODULE #define IS_MODULE #endif #ifndef SHARED_MODULE #define SHARED_MODULE #endif #ifdef PERL_THREADS #include "apache_inc.h" #define _INCLUDE_APACHE_FIRST #endif #include "EXTERN.h" #include "perl.h" #ifdef PERL_OBJECT #define NO_XSLOCKS #endif #include "XSUB.h" #ifndef MOD_PERL_STRING_VERSION #include "mod_perl_version.h" #endif #ifndef MOD_PERL_VERSION #define MOD_PERL_VERSION "TRUE" #endif /* patchlevel.h causes a -Wall warning, * plus chance that another patchlevel.h might be in -I paths * so try to avoid it if possible */ #ifdef PERLV #if PERLV >= 500476 #include "perl_PL.h" #endif #else #define PERL_PATCHLEVEL_H_IMPLICIT /* ignore local_patches */ #include "patchlevel.h" #undef PERL_PATCHLEVEL_H_IMPLICIT #ifndef PATCHLEVEL #define PATCHLEVEL PERL_VERSION #undef SUBVERSION #define SUBVERSION PERL_SUBVERSION #endif #if ((PATCHLEVEL >= 4) && (SUBVERSION >= 76)) || (PATCHLEVEL >= 5) #include "perl_PL.h" #endif #endif /*PERLV*/ #ifdef PERL_OBJECT #include <perlhost.h> #include "win32iop.h" #include <fcntl.h> #define PerlInterpreter CPerlHost #define perl_alloc() perl->PerlCreate() ? perl : NULL #define perl_parse(host, xsi, argc, argv, env) \ host->PerlParse(xsi, argc, argv, env); #define perl_run(host) \ host->PerlRun() #define perl_destruct(host) \ host->PerlDestroy() #define perl_free(host) #endif /* perl hides it's symbols in libperl when these macros are * expanded to Perl_foo * but some cause conflict when expanded in other headers files */ #undef S_ISREG #undef DIR #undef VOIDUSED #undef pregexec #undef pregfree #undef pregcomp #undef setregid #undef setreuid #undef sync #undef my_memcmp #undef my_bcopy #undef my_memset #undef RETURN #undef die #undef __attribute__ #ifdef pTHX_ #define PERL_IS_5_6 #endif #ifndef _INCLUDE_APACHE_FIRST #include "apache_inc.h" #endif #ifndef PERL_IS_5_6 #define pTHX_ #define aTHXo_ #define aTHX #define pTHX #define CopFILEGV(cop) cop->cop_filegv #define CopLINE(cop) cop->cop_line #define CopLINE_set(c,l) (CopLINE(c) = (l)) #define SAVECOPFILE(cop) SAVESPTR(CopFILEGV(curcop)); #define SAVECOPLINE(cop) SAVEI16(CopLINE(cop)) #endif #ifdef USE_5005THREADS #define dTHRCTX struct perl_thread *thr = PERL_GET_CONTEXT #else #define dTHRCTX #endif #ifndef dTHR #define dTHR extern int errno #endif #ifndef ERRSV #define ERRSV GvSV(errgv) #endif #ifndef ERRHV #define ERRHV GvHV(errgv) #endif #ifndef AvFILLp #define AvFILLp(av) ((XPVAV*) SvANY(av))->xav_fill #endif #ifndef PERL_MG_UFUNC #define PERL_MG_UFUNC(name,ix,sv) I32 name(IV ix, SV *sv) #endif #ifdef eval_pv # ifndef perl_eval_pv # define perl_eval_pv eval_pv # endif #endif #ifdef eval_sv # ifndef perl_eval_sv # define perl_eval_sv eval_sv # endif #endif #define MP_EXISTS_ERROR(k) \ ERRHV && hv_exists(ERRHV, k, strlen(k)) #define MP_STORE_ERROR(k,v) \ hv_store(ERRHV, k, strlen(k), newSVsv(v), FALSE) #define MP_FETCH_ERROR(k) \ *hv_fetch(ERRHV, k, strlen(k), FALSE) #define MP_CLEAR_ERROR(k) \ (void)hv_delete(ERRHV, k, strlen(k), G_DISCARD) #ifndef PERL_AUTOPRELOAD #define PERL_AUTOPRELOAD perl_get_sv("Apache::Server::AutoPreLoad", FALSE) #endif #ifndef ERRSV_CAN_BE_HTTP # ifdef WIN32 # define ERRSV_CAN_BE_HTTP perl_get_sv("Apache::ERRSV_CAN_BE_HTTP", FALSE) # else # define ERRSV_CAN_BE_HTTP 1 # endif #endif #ifndef PERL_DESTRUCT_LEVEL #define PERL_DESTRUCT_LEVEL 0 #endif #ifndef DO_INTERNAL_REDIRECT #define DO_INTERNAL_REDIRECT perl_get_sv("Apache::DoInternalRedirect", FALSE) #endif typedef struct { table *utable; array_header *arr; table_entry *elts; int ix; } TiedTable; typedef request_rec * Apache; typedef request_rec * Apache__SubRequest; typedef conn_rec * Apache__Connection; typedef server_rec * Apache__Server; typedef cmd_parms * Apache__CmdParms; typedef TiedTable * Apache__Table; typedef table * Apache__table; typedef module * Apache__Module; typedef handler_rec * Apache__Handler; typedef command_rec * Apache__Command; #define SvCLASS(o) HvNAME(SvSTASH(SvRV(o))) #define GvHV_init(name) gv_fetchpv(name, GV_ADDMULTI, SVt_PVHV) #define GvSV_init(name) gv_fetchpv(name, GV_ADDMULTI, SVt_PV) #define GvSV_setiv(gv,val) sv_setiv(GvSV(gv), val) #define sv_is_http_code(sv) \ ((SvIOK(sv) && (SvIVX(sv) >= 100) && (SvIVX(sv) <= 600)) ? SvIVX(sv) : FALSE) #define Apache__ServerStarting(val) \ { \ GV *sgv = GvSV_init("Apache::Server::Starting"); \ GV *agv = GvSV_init("Apache::ServerStarting"); \ GvSV_setiv(sgv, val); \ GvSV(agv) = GvSV(sgv); \ } #define Apache__ServerReStarting(val) \ { \ GV *sgv = GvSV_init("Apache::Server::ReStarting"); \ GV *agv = GvSV_init("Apache::ServerReStarting"); \ GvSV_setiv(sgv, val); \ GvSV(agv) = GvSV(sgv); \ if(perl_is_running == PERL_DONE_STARTUP) \ Apache__ServerStarting((val == FALSE ? FALSE : PERL_RUNNING())); \ } #define PUSHif(arg) \ if(arg) \ XPUSHs(sv_2mortal(newSVpv(arg,0))) #define iniHV(hv) hv = (HV*)sv_2mortal((SV*)newHV()) #define iniAV(av) av = (AV*)sv_2mortal((SV*)newAV()) #define AvTRUE(av) (av && (AvFILL(av) > -1) && SvREFCNT(av)) #define av_copy_array(av) av_make(av_len(av)+1, AvARRAY(av)) #ifndef newRV_noinc #define newRV_noinc(sv) ((Sv = newRV(sv)), --SvREFCNT(SvRV(Sv)), Sv) #endif #ifndef SvTAINTED_on #define SvTAINTED_on(sv) if (tainting) sv_magic(sv, Nullsv, 't', Nullch, 0) #endif #define HV_SvTAINTED_on(hv,key,klen) \ SvTAINTED_on(*hv_fetch(hv, key, klen, 0)) #if 0 #define mp_setenv(key, val) \ mp_magic_setenv(key, val, 1) #define mp_SetEnv(key, val) \ mp_magic_setenv(key, val, 0) #define mp_PassEnv(key) \ { \ char *val = getenv(key); \ mp_magic_setenv(key, val?val:"", 0); \ } #else #define mp_setenv(key, val) \ { \ int klen = strlen(key); \ SV *sv = newSVpv(val,0); \ hv_store(GvHV(envgv), key, klen, sv, FALSE); \ HV_SvTAINTED_on(GvHV(envgv), key, klen); \ my_setenv(key, SvPVX(sv)); \ } #define mp_SetEnv(key, val) \ hv_store(GvHV(envgv), key, strlen(key), newSVpv(val,0), FALSE); \ my_setenv(key, val) #define mp_PassEnv(key) \ { \ char *val = getenv(key); \ hv_store(GvHV(envgv), key, strlen(key), newSVpv(val?val:"",0), FALSE); \ } #endif #define mp_debug mod_perl_debug_flags extern U32 mp_debug; #ifdef PERL_TRACE /* -Wall */ #undef dNOOP #define dNOOP extern int __attribute__ ((unused)) Perl___notused #define MP_TRACE(a) if (mp_debug) a #define MP_TRACE_d(a) if (mp_debug & 1) a /* directives */ #define MP_TRACE_s(a) if (mp_debug & 2) a /* perl sections */ #define MP_TRACE_h(a) if (mp_debug & 4) a /* handlers */ #define MP_TRACE_g(a) if (mp_debug & 8) a /* globals and allocation */ #define MP_TRACE_c(a) if (mp_debug & 16) a /* directive handlers */ #ifndef PERL_MARK_WHERE #define PERL_MARK_WHERE #endif #ifndef PERL_TIE_SCRIPTNAME #define PERL_TIE_SCRIPTNAME #endif #else #define MP_TRACE(a) #define MP_TRACE_d(a) #define MP_TRACE_s(a) #define MP_TRACE_h(a) #define MP_TRACE_g(a) #define MP_TRACE_c(a) #endif #ifdef PERL_MARK_WHERE #define MARK_WHERE(w,s) \ ENTER; \ mod_perl_mark_where(w,s) #define UNMARK_WHERE LEAVE #else #define MARK_WHERE(w,s) mod_perl_noop(NULL) #define UNMARK_WHERE mod_perl_noop(NULL) #endif /* cut down on some noise in source */ #define PERL_IS_DSO perl_module.dynamic_load_handle #define dSTATUS \ int dstatus = DECLINED; \ int status = dstatus #define dPPREQ \ perl_request_config *cfg = (perl_request_config *)get_module_config(r->request_config, &perl_module) #define dPPDIR \ perl_dir_config *cld = (perl_dir_config *)get_module_config(r->per_dir_config, &perl_module) #define dPSRV(srv) \ perl_server_config *cls = (perl_server_config *) get_module_config (srv->module_config, &perl_module) /* per-directory flags */ #define MPf_On 1 #define MPf_Off -1 #define MPf_None 0 #define MPf_INCPUSH 0x00000100 /* use lib split ":", $ENV{PERL5LIB} */ #define MPf_SENDHDR 0x00000200 /* is PerlSendHeader On? */ #define MPf_SENTHDR 0x00000400 /* has PerlSendHeader sent the headers? */ #define MPf_ENV 0x00000800 /* PerlSetupEnv */ #define MPf_HASENV 0x00001000 /* do we have any PerlSetEnv's? */ #define MPf_DSTDERR 0x00002000 /* redirect stderr to error_log */ #define MPf_CLEANUP 0x00004000 /* did we register our cleanup ? */ #define MPf_RCLEANUP 0x00008000 /* for $r->register_cleanup */ #define MP_FMERGE(new,add,base,f) \ if((add->flags & f) || (base->flags & f)) \ new->flags |= f #define MP_INCPUSH(d) (d->flags & MPf_INCPUSH) #define MP_INCPUSH_on(d) (d->flags |= MPf_INCPUSH) #define MP_INCPUSH_off(d) (d->flags &= ~MPf_INCPUSH) #if 0 #define MP_SENDHDR(d) (d->flags & MPf_SENDHDR) #define MP_SENDHDR_on(d) (d->flags |= MPf_SENDHDR) #define MP_SENDHDR_off(d) (d->flags &= ~MPf_SENDHDR) #endif #define MP_SENDHDR(d) (d->SendHeader == MPf_On) #define MP_SENDHDR_on(d) (d->SendHeader = MPf_On) #define MP_SENDHDR_off(d) (d->SendHeader = MPf_Off) #define MP_SENTHDR(d) (d->flags & MPf_SENTHDR) #define MP_SENTHDR_on(d) (d->flags |= MPf_SENTHDR) #define MP_SENTHDR_off(d) (d->flags &= ~MPf_SENTHDR) #if 0 #define MP_ENV(d) (d->flags & MPf_ENV) #define MP_ENV_on(d) (d->flags |= MPf_ENV) #define MP_ENV_off(d) (d->flags &= ~MPf_ENV) #endif #define MP_ENV(d) (d->SetupEnv != MPf_Off) #define MP_ENV_on(d) (d->SetupEnv = MPf_On) #define MP_ENV_off(d) (d->SetupEnv = MPf_Off) #define MP_HASENV(d) (d->flags & MPf_HASENV) #define MP_HASENV_on(d) (d->flags |= MPf_HASENV) #define MP_HASENV_off(d) (d->flags &= ~MPf_HASENV) #define MP_DSTDERR(d) (d->flags & MPf_DSTDERR) #define MP_DSTDERR_on(d) (d->flags |= MPf_DSTDERR) #define MP_DSTDERR_off(d) (d->flags &= ~MPf_DSTDERR) #define MP_CLEANUP(d) (d->flags & MPf_CLEANUP) #define MP_CLEANUP_on(d) (d->flags |= MPf_CLEANUP) #define MP_CLEANUP_off(d) (d->flags &= ~MPf_CLEANUP) #define MP_RCLEANUP(d) (d->flags & MPf_RCLEANUP) #define MP_RCLEANUP_on(d) (d->flags |= MPf_RCLEANUP) #define MP_RCLEANUP_off(d) (d->flags &= ~MPf_RCLEANUP) #define PERL_GATEWAY_INTERFACE "CGI-Perl/1.1" /* Apache::SSI */ #define PERL_APACHE_SSI_TYPE "text/x-perl-server-parsed-html" /* PerlSetVar */ #ifndef NO_PERL_DIRECTIVE_HANDLERS #define PERL_DIRECTIVE_HANDLERS #endif #ifndef NO_PERL_STACKED_HANDLERS #define PERL_STACKED_HANDLERS #endif #ifndef NO_PERL_METHOD_HANDLERS #define PERL_METHOD_HANDLERS #endif #ifndef NO_PERL_SECTIONS #define PERL_SECTIONS #endif #ifndef NO_PERL_SSI #undef PERL_SSI #define PERL_SSI #endif #ifdef PERL_SECTIONS # ifndef PERL_SECTIONS_SELF_BOOT # ifdef WIN32 # define PERL_SECTIONS_SELF_BOOT \ (getenv("PERL_SECTIONS_SELF_BOOT") && !perl_sections_self_boot) # else # define PERL_SECTIONS_SELF_BOOT !perl_sections_self_boot # endif # endif #endif #ifdef APACHE_SSL #define PERL_DONE_STARTUP 1 #else #define PERL_DONE_STARTUP 2 #endif /* some 1.2.x/1.3.x compat stuff */ /* once 1.3.0 is here, we can toss most of this junk */ #ifdef MODULE_MAGIC_AT_LEAST #undef MODULE_MAGIC_AT_LEAST #define MODULE_MAGIC_AT_LEAST(major,minor) \ (MODULE_MAGIC_NUMBER_MAJOR >= (major) \ && MODULE_MAGIC_NUMBER_MINOR >= minor) #else #define MODULE_MAGIC_AT_LEAST(major,minor) (0 > 1) #endif #define HAS_MMN(mmn) (MODULE_MAGIC_NUMBER >= mmn) #define MMN_130 19980527 #define MMN_131 19980713 #define MMN_132 19980806 #define MMN_136 19990320 #define HAS_MMN_130 HAS_MMN(MMN_130) #define HAS_MMN_131 HAS_MMN(MMN_131) #define HAS_MMN_132 HAS_MMN(MMN_132) #define HAS_MMN_136 HAS_MMN(MMN_136) #define HAS_CONTEXT MODULE_MAGIC_AT_LEAST(MMN_136,2) #if HAS_CONTEXT #define CAN_SELF_BOOT_SECTIONS (PERL_SECTIONS_SELF_BOOT) #define SECTION_ALLOWED OR_ALL #define USABLE_CONTEXT parms->context #else #define CAN_SELF_BOOT_SECTIONS ((parms->path==NULL)&&PERL_SECTIONS_SELF_BOOT) #define SECTION_ALLOWED RSRC_CONF #define USABLE_CONTEXT parms->server->lookup_defaults #endif #define APACHE_SSL_12X (defined(APACHE_SSL) && (MODULE_MAGIC_NUMBER < MMN_130)) #if MODULE_MAGIC_NUMBER < MMN_130 #undef PERL_IS_DSO #define PERL_IS_DSO 0 #endif #if MODULE_MAGIC_NUMBER >= 19980627 #define MP_CONST_CHAR const char #define MP_CONST_ARRAY_HEADER const array_header #else #define MP_CONST_CHAR char #define MP_CONST_ARRAY_HEADER array_header #endif #if MODULE_MAGIC_NUMBER > 19970912 #define cmd_infile parms->config_file #define cmd_filename parms->config_file->name #define cmd_linenum parms->config_file->line_number #else #define cmd_infile parms->infile #define cmd_filename parms->config_file #define cmd_linenum parms->config_line #endif #ifndef DONE #define DONE -2 #endif #if MODULE_MAGIC_NUMBER >= 19980713 #include "ap_compat.h" #elif MODULE_MAGIC_NUMBER >= 19980413 #include "compat.h" #endif #if MODULE_MAGIC_NUMBER > 19970909 #define mod_perl_warn(s,msg) \ aplog_error(APLOG_MARK, APLOG_WARNING | APLOG_NOERRNO, s, "%s", msg) #define mod_perl_error(s,msg) \ aplog_error(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, s, "%s", msg) #define mod_perl_notice(s,msg) \ aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_NOTICE, s, "%s", msg) #define mod_perl_debug(s,msg) \ aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, s, "%s", msg) #define mod_perl_log_reason(msg, file, r) \ aplog_error(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, r->server, \ "access to %s failed for %s, reason: %s", \ file, \ get_remote_host(r->connection, \ r->per_dir_config, REMOTE_NAME), \ msg) #else #define mod_perl_error(s,msg) log_error(msg,s) #define mod_perl_debug mod_perl_error #define mod_perl_warn mod_perl_error #define mod_perl_notice mod_perl_error #define mod_perl_log_reason log_reason #endif #if MODULE_MAGIC_NUMBER < 19970719 #define is_initial_req(r) ((r->main == NULL) && (r->prev == NULL)) #endif #ifndef API_EXPORT #define API_EXPORT(type) type #endif #ifndef MODULE_VAR_EXPORT #define MODULE_VAR_EXPORT #endif #ifndef API_VAR_EXPORT #define API_VAR_EXPORT #endif #ifdef WIN32 #if MODULE_MAGIC_NUMBER < 19980317 #undef PERL_SECTIONS #define NO_PERL_SECTIONS #endif #include "multithread.h" extern void *mod_perl_mutex; #else #define mod_perl_mutex NULL extern void *mod_perl_dummy_mutex; #ifndef MULTITHREAD_H #define MULTI_OK (0) #undef create_mutex #undef acquire_mutex #undef release_mutex #define create_mutex(name) ((void *)mod_perl_dummy_mutex) #define acquire_mutex(mutex_id) ((int)MULTI_OK) #define release_mutex(mutex_id) ((int)MULTI_OK) #endif /* MULTITHREAD_H */ #endif /* WIN32 */ #if MODULE_MAGIC_NUMBER < 19971226 char *ap_cpystrn(char *dst, const char *src, size_t dst_size); #endif #if MODULE_MAGIC_NUMBER >= 19980304 #ifndef SERVER_BUILT #define SERVER_BUILT apapi_get_server_built() #endif #endif #define PERL_CUR_HOOK_SV \ perl_get_sv("Apache::__CurrentCallback", TRUE) #define PERL_SET_CUR_HOOK(h) \ if (r->notes) ap_table_setn(r->notes, "PERL_CUR_HOOK", h); \ else sv_setpv(PERL_CUR_HOOK_SV, h) #define PERL_GET_CUR_HOOK \ (r->notes ? \ ap_table_get(r->notes, "PERL_CUR_HOOK") : \ SvPVX(PERL_CUR_HOOK_SV)) #ifdef PERL_STACKED_HANDLERS #ifndef PERL_GET_SET_HANDLERS #define PERL_GET_SET_HANDLERS #endif #define PERL_TAKE ITERATE #define PERL_CMD_INIT Nullav #define PERL_CMD_TYPE AV #define mod_perl_can_stack_handlers(sv) (SvTRUE(sv) && 1) /* always enable child_init for perl_init_ids */ #if (MODULE_MAGIC_NUMBER >= 19970719) && !defined(WIN32) #define perl_init_ids # ifdef NO_PERL_CHILD_INIT # undef NO_PERL_CHILD_INIT # endif # ifdef NO_PERL_CHILD_EXIT # undef NO_PERL_CHILD_EXIT # endif #endif #ifndef perl_init_ids #define perl_init_ids mod_perl_init_ids() #endif #define NO_HANDLERS -666 #define PERL_CALLBACK(h,name) \ PERL_SET_CUR_HOOK(h); \ (void)acquire_mutex(mod_perl_mutex); \ if(AvTRUE(name)) { \ status = perl_run_stacked_handlers(h, r, name); \ } \ if((status != OK) && (status != DECLINED)) { \ MP_TRACE_h(fprintf(stderr, "%s handlers returned %d\n", h, status)); \ } \ else { \ dstatus = perl_run_stacked_handlers(h, r, Nullav); \ if(dstatus != NO_HANDLERS) status = dstatus; \ } \ (void)release_mutex(mod_perl_mutex); \ MP_TRACE_h(fprintf(stderr, "%s handlers returned %d\n", h, status)) #else #define PERL_TAKE TAKE1 #define PERL_CMD_INIT NULL #define PERL_CMD_TYPE char #define mod_perl_can_stack_handlers(sv) (SvTRUE(sv) && 0) #define PERL_CALLBACK(h,name) \ PERL_SET_CUR_HOOK(h); \ if(name != NULL) { \ SV *sv; \ (void)acquire_mutex(mod_perl_mutex); \ sv = newSVpv(name,0); \ MARK_WHERE(h, sv); \ dstatus = status = perl_call_handler(sv, r, Nullav); \ UNMARK_WHERE; \ SvREFCNT_dec(sv); \ (void)release_mutex(mod_perl_mutex); \ MP_TRACE_h(fprintf(stderr, "perl_call %s '%s' returned: %d\n", h,name,status)); \ } \ else { \ MP_TRACE_h(fprintf(stderr, "mod_perl: declining to handle %s, no callback defined\n", h)); \ } #endif #if MODULE_MAGIC_NUMBER >= 19961007 #define CHAR_P const char * #else #define CHAR_P char * #endif #define PUSHelt(key,val,klen) \ { \ SV *psv = (SV*)newSVpv(val, 0); \ SvTAINTED_on(psv); \ XPUSHs(sv_2mortal((SV*)newSVpv(key, klen))); \ XPUSHs(sv_2mortal((SV*)psv)); \ } /* on/off switches for callback hooks during server startup/shutdown */ #ifndef NO_PERL_DISPATCH #define PERL_DISPATCH #define PERL_DISPATCH_HOOK perl_dispatch #define PERL_DISPATCH_CMD_ENTRY \ "PerlDispatchHandler", (crft) perl_cmd_dispatch_handlers, \ NULL, \ OR_ALL, TAKE1, "the Perl Dispatch handler routine name" #define PERL_DISPATCH_CREATE(s) s->PerlDispatchHandler = NULL #else #define PERL_DISPATCH_HOOK NULL #define PERL_DISPATCH_CMD_ENTRY NULL #define PERL_DISPATCH_CREATE(s) #endif #ifndef NO_PERL_CHILD_INIT #define PERL_CHILD_INIT #define PERL_CHILD_INIT_HOOK perl_child_init #define PERL_CHILD_INIT_CMD_ENTRY \ "PerlChildInitHandler", (crft) perl_cmd_child_init_handlers, \ NULL, \ RSRC_CONF, PERL_TAKE, "the Perl Child init handler routine name" #define PERL_CHILD_INIT_CREATE(s) s->PerlChildInitHandler = PERL_CMD_INIT #else #define PERL_CHILD_INIT_HOOK NULL #define PERL_CHILD_INIT_CMD_ENTRY NULL #define PERL_CHILD_INIT_CREATE(s) #endif #ifndef NO_PERL_CHILD_EXIT #define PERL_CHILD_EXIT #define PERL_CHILD_EXIT_HOOK perl_child_exit #define PERL_CHILD_EXIT_CMD_ENTRY \ "PerlChildExitHandler", (crft) perl_cmd_child_exit_handlers, \ NULL, \ RSRC_CONF, PERL_TAKE, "the Perl Child exit handler routine name" #define PERL_CHILD_EXIT_CREATE(s) s->PerlChildExitHandler = PERL_CMD_INIT #else #define PERL_CHILD_EXIT_HOOK NULL #define PERL_CHILD_EXIT_CMD_ENTRY NULL #define PERL_CHILD_EXIT_CREATE(s) #endif #ifndef NO_PERL_RESTART #define PERL_RESTART #define PERL_RESTART_CMD_ENTRY \ "PerlRestartHandler", (crft) perl_cmd_restart_handlers, \ NULL, \ RSRC_CONF, PERL_TAKE, "the Perl Restart handler routine name" #define PERL_RESTART_CREATE(s) s->PerlRestartHandler = PERL_CMD_INIT #else #define PERL_RESTART_CMD_ENTRY NULL #define PERL_RESTART_CREATE(s) #endif /* on/off switches for callback hooks during request stages */ #if !defined(NO_PERL_TRANS) && (MODULE_MAGIC_NUMBER > 19980207) #undef NO_PERL_POST_READ_REQUEST #endif #ifndef NO_PERL_POST_READ_REQUEST #define PERL_POST_READ_REQUEST #define PERL_POST_READ_REQUEST_HOOK perl_post_read_request #define PERL_POST_READ_REQUEST_CMD_ENTRY \ "PerlPostReadRequestHandler", (crft) perl_cmd_post_read_request_handlers, \ NULL, \ RSRC_CONF, PERL_TAKE, "the Perl Post Read Request handler routine name" #define PERL_POST_READ_REQUEST_CREATE(s) s->PerlPostReadRequestHandler = PERL_CMD_INIT #else #define PERL_POST_READ_REQUEST_HOOK NULL #define PERL_POST_READ_REQUEST_CMD_ENTRY NULL #define PERL_POST_READ_REQUEST_CREATE(s) #endif #ifndef NO_PERL_TRANS #define PERL_TRANS #define PERL_TRANS_HOOK perl_translate #define PERL_TRANS_CMD_ENTRY \ "PerlTransHandler", (crft) perl_cmd_trans_handlers, \ NULL, \ RSRC_CONF, PERL_TAKE, "the Perl Translation handler routine name" #define PERL_TRANS_CREATE(s) s->PerlTransHandler = PERL_CMD_INIT #else #define PERL_TRANS_HOOK NULL #define PERL_TRANS_CMD_ENTRY NULL #define PERL_TRANS_CREATE(s) #endif #ifndef NO_PERL_AUTHEN #define PERL_AUTHEN #define PERL_AUTHEN_HOOK perl_authenticate #define PERL_AUTHEN_CMD_ENTRY \ "PerlAuthenHandler", (crft) perl_cmd_authen_handlers, \ NULL, \ OR_ALL, PERL_TAKE, "the Perl Authentication handler routine name" #define PERL_AUTHEN_CREATE(s) s->PerlAuthenHandler = PERL_CMD_INIT #else #define PERL_AUTHEN_HOOK NULL #define PERL_AUTHEN_CMD_ENTRY NULL #define PERL_AUTHEN_CREATE(s) #endif #ifndef NO_PERL_AUTHZ #define PERL_AUTHZ #define PERL_AUTHZ_HOOK perl_authorize #define PERL_AUTHZ_CMD_ENTRY \ "PerlAuthzHandler", (crft) perl_cmd_authz_handlers, \ NULL, \ OR_ALL, PERL_TAKE, "the Perl Authorization handler routine name" #define PERL_AUTHZ_CREATE(s) s->PerlAuthzHandler = PERL_CMD_INIT #else #define PERL_AUTHZ_HOOK NULL #define PERL_AUTHZ_CMD_ENTRY NULL #define PERL_AUTHZ_CREATE(s) #endif #ifndef NO_PERL_ACCESS #define PERL_ACCESS #define PERL_ACCESS_HOOK perl_access #define PERL_ACCESS_CMD_ENTRY \ "PerlAccessHandler", (crft) perl_cmd_access_handlers, \ NULL, \ OR_ALL, PERL_TAKE, "the Perl Access handler routine name" #define PERL_ACCESS_CREATE(s) s->PerlAccessHandler = PERL_CMD_INIT #else #define PERL_ACCESS_HOOK NULL #define PERL_ACCESS_CMD_ENTRY NULL #define PERL_ACCESS_CREATE(s) #endif /* un-tested hooks */ #ifndef NO_PERL_TYPE #define PERL_TYPE #define PERL_TYPE_HOOK perl_type_checker #define PERL_TYPE_CMD_ENTRY \ "PerlTypeHandler", (crft) perl_cmd_type_handlers, \ NULL, \ OR_ALL, PERL_TAKE, "the Perl Type check handler routine name" #define PERL_TYPE_CREATE(s) s->PerlTypeHandler = PERL_CMD_INIT #else #define PERL_TYPE_HOOK NULL #define PERL_TYPE_CMD_ENTRY NULL #define PERL_TYPE_CREATE(s) #endif #ifndef NO_PERL_FIXUP #define PERL_FIXUP #define PERL_FIXUP_HOOK perl_fixup #define PERL_FIXUP_CMD_ENTRY \ "PerlFixupHandler", (crft) perl_cmd_fixup_handlers, \ NULL, \ OR_ALL, PERL_TAKE, "the Perl Fixup handler routine name" #define PERL_FIXUP_CREATE(s) s->PerlFixupHandler = PERL_CMD_INIT #else #define PERL_FIXUP_HOOK NULL #define PERL_FIXUP_CMD_ENTRY NULL #define PERL_FIXUP_CREATE(s) #endif #ifndef NO_PERL_LOG #define PERL_LOG #define PERL_LOG_HOOK perl_logger #define PERL_LOG_CMD_ENTRY \ "PerlLogHandler", (crft) perl_cmd_log_handlers, \ NULL, \ OR_ALL, PERL_TAKE, "the Perl Log handler routine name" #define PERL_LOG_CREATE(s) s->PerlLogHandler = PERL_CMD_INIT #else #define PERL_LOG_HOOK NULL #define PERL_LOG_CMD_ENTRY NULL #define PERL_LOG_CREATE(s) #endif #ifndef NO_PERL_CLEANUP #define PERL_CLEANUP #define PERL_CLEANUP_HOOK perl_cleanup #define PERL_CLEANUP_CMD_ENTRY \ "PerlCleanupHandler", (crft) perl_cmd_cleanup_handlers, \ NULL, \ OR_ALL, PERL_TAKE, "the Perl Cleanup handler routine name" #define PERL_CLEANUP_CREATE(s) s->PerlCleanupHandler = PERL_CMD_INIT #else #define PERL_CLEANUP_HOOK NULL #define PERL_CLEANUP_CMD_ENTRY NULL #define PERL_CLEANUP_CREATE(s) #endif #ifndef NO_PERL_INIT #define PERL_INIT #define PERL_INIT_HOOK perl_init #define PERL_INIT_CMD_ENTRY \ "PerlInitHandler", (crft) perl_cmd_init_handlers, \ NULL, \ OR_ALL, PERL_TAKE, "the Perl Init handler routine name" #define PERL_INIT_CREATE(s) s->PerlInitHandler = PERL_CMD_INIT #else #define PERL_INIT_HOOK NULL #define PERL_INIT_CMD_ENTRY NULL #define PERL_INIT_CREATE(s) #endif #ifndef NO_PERL_HEADER_PARSER #define PERL_HEADER_PARSER #define PERL_HEADER_PARSER_HOOK perl_header_parser #define PERL_HEADER_PARSER_CMD_ENTRY \ "PerlHeaderParserHandler", (crft) perl_cmd_header_parser_handlers, \ NULL, \ OR_ALL, PERL_TAKE, "the Perl Header Parser handler routine name" #define PERL_HEADER_PARSER_CREATE(s) s->PerlHeaderParserHandler = PERL_CMD_INIT #else #define PERL_HEADER_PARSER_HOOK NULL #define PERL_HEADER_PARSER_CMD_ENTRY NULL #define PERL_HEADER_PARSER_CREATE(s) #endif typedef struct { array_header *PerlPassEnv; array_header *PerlRequire; array_header *PerlModule; int PerlTaintCheck; int PerlWarn; int FreshRestart; PERL_CMD_TYPE *PerlInitHandler; PERL_CMD_TYPE *PerlPostReadRequestHandler; PERL_CMD_TYPE *PerlTransHandler; PERL_CMD_TYPE *PerlChildInitHandler; PERL_CMD_TYPE *PerlChildExitHandler; PERL_CMD_TYPE *PerlRestartHandler; char *PerlOpmask; table *vars; } perl_server_config; typedef struct { char *PerlDispatchHandler; PERL_CMD_TYPE *PerlHandler; PERL_CMD_TYPE *PerlAuthenHandler; PERL_CMD_TYPE *PerlAuthzHandler; PERL_CMD_TYPE *PerlAccessHandler; PERL_CMD_TYPE *PerlTypeHandler; PERL_CMD_TYPE *PerlFixupHandler; PERL_CMD_TYPE *PerlLogHandler; PERL_CMD_TYPE *PerlCleanupHandler; PERL_CMD_TYPE *PerlHeaderParserHandler; PERL_CMD_TYPE *PerlInitHandler; table *env; table *vars; U32 flags; int SendHeader; int SetupEnv; char *location; } perl_dir_config; typedef struct { Sighandler_t h; I32 signo; } perl_request_sigsave; typedef struct { HV *pnotes; int setup_env; table *dir_env; array_header *sigsave; } perl_request_config; typedef struct { int is_method; int is_anon; int in_perl; SV *pclass; char *method; } mod_perl_handler; typedef struct { SV *obj; char *pclass; } mod_perl_perl_dir_config; typedef struct { char *subname; char *info; } mod_perl_cmd_info; extern module MODULE_VAR_EXPORT perl_module; /* a couple for -Wall sanity sake */ #ifndef WIN32 int translate_name (request_rec *); int log_transaction (request_rec *r); #endif /* mod_perl prototypes */ /* perlxsi.c */ #ifdef aTHX_ void xs_init (pTHX); #else void xs_init (void); #endif /* mod_perl.c */ /* generic handler stuff */ int perl_handler_ismethod(HV *pclass, char *sub); int perl_call_handler(SV *sv, request_rec *r, AV *args); request_rec *mp_fake_request_rec(server_rec *s, pool *p, char *hook); /* stacked handler stuff */ int mod_perl_push_handlers(SV *self, char *hook, SV *sub, AV *handlers); SV *mod_perl_pop_handlers(SV *self, SV *hook); void *mod_perl_clear_handlers(SV *self, SV *hook); SV *mod_perl_fetch_handlers(SV *self, SV *hook); int perl_run_stacked_handlers(char *hook, request_rec *r, AV *handlers); /* plugin slots */ void perl_module_init(server_rec *s, pool *p); void perl_startup(server_rec *s, pool *p); int perl_handler(request_rec *r); void perl_child_init(server_rec *, pool *); void perl_child_exit(server_rec *, pool *); int perl_translate(request_rec *r); int perl_authenticate(request_rec *r); int perl_authorize(request_rec *r); int perl_access(request_rec *r); int perl_type_checker(request_rec *r); int perl_fixup(request_rec *r); int perl_post_read_request(request_rec *r); int perl_logger(request_rec *r); int perl_header_parser(request_rec *r); int perl_hook(char *name); int PERL_RUNNING(void); /* per-request gunk */ int mod_perl_sent_header(request_rec *r, int val); int mod_perl_seqno(SV *self, int inc); request_rec *perl_request_rec(request_rec *); void perl_setup_env(request_rec *r); SV *perl_bless_request_rec(request_rec *); void perl_set_request_rec(request_rec *); void mod_perl_cleanup_sv(void *data); void mod_perl_cleanup_handler(void *data); void mod_perl_end_cleanup(void *data); void mod_perl_register_cleanup(request_rec *r, SV *sv); void mod_perl_noop(void *data); SV *mod_perl_resolve_handler(request_rec *r, SV *sv, mod_perl_handler *h); mod_perl_handler *mod_perl_new_handler(request_rec *r, SV *sv); void mod_perl_destroy_handler(void *data); /* perl_util.c */ SV *array_header2avrv(array_header *arr); array_header *avrv2array_header(SV *avrv, pool *p); table *hvrv2table(SV *rv); void mod_perl_untaint(SV *sv); SV *mod_perl_gensym (char *pack); SV *mod_perl_slurp_filename(request_rec *r); SV *mod_perl_tie_table(table *t); SV *perl_hvrv_magic_obj(SV *rv); void perl_tie_hash(HV *hv, char *pclass, SV *sv); void perl_util_cleanup(void); void mod_perl_clear_rgy_endav(request_rec *r, SV *sv); void perl_stash_rgy_endav(char *s, SV *rgystash); void perl_run_rgy_endav(char *s); void perl_run_endav(char *s); void perl_call_halt(int status); void perl_reload_inc(server_rec *s, pool *p); I32 perl_module_is_loaded(char *name); SV *perl_module2file(char *name); int perl_require_module(char *module, server_rec *s); int perl_load_startup_script(server_rec *s, pool *p, char *script, U8 my_warn); array_header *perl_cgi_env_init(request_rec *r); void perl_clear_env(void); void mp_magic_setenv(char *key, char *val, int is_tainted); void mod_perl_init_ids(void); int perl_eval_ok(server_rec *s); int perl_sv_is_http_code(SV *sv, int *status); void perl_inc_unshift(char *s); SV *mod_perl_sv_name(SV *svp); void mod_perl_mark_where(char *where, SV *sub); /* perlio.c */ void perl_soak_script_output(request_rec *r); void perl_stdin2client(request_rec *r); void perl_stdout2client(request_rec *r); /* perl_config.c */ #define require_Apache(s) \ perl_require_module("Apache", s) char *mod_perl_auth_name(request_rec *r, char *val); char *mod_perl_auth_type(request_rec *r, char *val); module *perl_get_module_ptr(char *name, int len); void *perl_merge_server_config(pool *p, void *basev, void *addv); void *perl_merge_dir_config(pool *p, void *basev, void *addv); void *perl_create_dir_config(pool *p, char *dirname); void *perl_create_server_config(pool *p, server_rec *s); perl_request_config *perl_create_request_config(pool *p, server_rec *s); void perl_perl_cmd_cleanup(void *data); void perl_section_self_boot(cmd_parms *parms, void *dummy, const char *arg); void perl_clear_symtab(HV *symtab); CHAR_P perl_section (cmd_parms *cmd, void *dummy, CHAR_P arg); CHAR_P perl_end_section (cmd_parms *cmd, void *dummy); CHAR_P perl_pod_section (cmd_parms *cmd, void *dummy, CHAR_P arg); CHAR_P perl_pod_end_section (cmd_parms *cmd, void *dummy); CHAR_P perl_cmd_autoload (cmd_parms *parms, void *dummy, const char *arg); CHAR_P perl_config_END (cmd_parms *cmd, void *dummy, CHAR_P arg); CHAR_P perl_limit_section(cmd_parms *cmd, void *dummy, HV *hv); CHAR_P perl_urlsection (cmd_parms *cmd, void *dummy, HV *hv); CHAR_P perl_dirsection (cmd_parms *cmd, void *dummy, HV *hv); CHAR_P perl_filesection (cmd_parms *cmd, void *dummy, HV *hv); void perl_handle_command(cmd_parms *cmd, void *config, char *line); void perl_handle_command_hv(HV *hv, char *key, cmd_parms *cmd, void *config); void perl_handle_command_av(AV *av, I32 n, char *key, cmd_parms *cmd, void *config); void perl_tainting_set(server_rec *s, int arg); CHAR_P perl_cmd_require (cmd_parms *parms, void *dummy, char *arg); CHAR_P perl_cmd_module (cmd_parms *parms, void *dummy, char *arg); CHAR_P perl_cmd_var(cmd_parms *cmd, void *config, char *key, char *val); CHAR_P perl_cmd_setenv(cmd_parms *cmd, perl_dir_config *rec, char *key, char *val); CHAR_P perl_cmd_env (cmd_parms *cmd, perl_dir_config *rec, int arg); CHAR_P perl_cmd_pass_env (cmd_parms *parms, void *dummy, char *arg); CHAR_P perl_cmd_sendheader (cmd_parms *cmd, perl_dir_config *rec, int arg); CHAR_P perl_cmd_opmask (cmd_parms *parms, void *dummy, char *arg); CHAR_P perl_cmd_tainting (cmd_parms *parms, void *dummy, int arg); CHAR_P perl_cmd_warn (cmd_parms *parms, void *dummy, int arg); CHAR_P perl_cmd_fresh_restart (cmd_parms *parms, void *dummy, int arg); CHAR_P perl_cmd_dispatch_handlers (cmd_parms *parms, perl_dir_config *rec, char *arg); CHAR_P perl_cmd_init_handlers (cmd_parms *parms, void *rec, char *arg); CHAR_P perl_cmd_cleanup_handlers (cmd_parms *parms, perl_dir_config *rec, char *arg); CHAR_P perl_cmd_header_parser_handlers (cmd_parms *parms, perl_dir_config *rec, char *arg); CHAR_P perl_cmd_post_read_request_handlers (cmd_parms *parms, void *dumm, char *arg); CHAR_P perl_cmd_trans_handlers (cmd_parms *parms, void *dumm, char *arg); CHAR_P perl_cmd_child_init_handlers (cmd_parms *parms, void *dumm, char *arg); CHAR_P perl_cmd_child_exit_handlers (cmd_parms *parms, void *dumm, char *arg); CHAR_P perl_cmd_restart_handlers (cmd_parms *parms, void *dumm, char *arg); CHAR_P perl_cmd_authen_handlers (cmd_parms *parms, perl_dir_config *rec, char *arg); CHAR_P perl_cmd_authz_handlers (cmd_parms *parms, perl_dir_config *rec, char *arg); CHAR_P perl_cmd_access_handlers (cmd_parms *parms, perl_dir_config *rec, char *arg); CHAR_P perl_cmd_type_handlers (cmd_parms *parms, perl_dir_config *rec, char *arg); CHAR_P perl_cmd_fixup_handlers (cmd_parms *parms, perl_dir_config *rec, char *arg); CHAR_P perl_cmd_handler_handlers (cmd_parms *parms, perl_dir_config *rec, char *arg); CHAR_P perl_cmd_log_handlers (cmd_parms *parms, perl_dir_config *rec, char *arg); CHAR_P perl_cmd_perl_TAKE1(cmd_parms *cmd, mod_perl_perl_dir_config *d, char *one); CHAR_P perl_cmd_perl_TAKE2(cmd_parms *cmd, mod_perl_perl_dir_config *d, char *one, char *two); CHAR_P perl_cmd_perl_TAKE123(cmd_parms *cmd, mod_perl_perl_dir_config *d, char *one, char *two, char *three); CHAR_P perl_cmd_perl_FLAG(cmd_parms *cmd, mod_perl_perl_dir_config *d, int flag); #define perl_cmd_perl_RAW_ARGS perl_cmd_perl_TAKE1 #define perl_cmd_perl_NO_ARGS perl_cmd_perl_TAKE1 #define perl_cmd_perl_ITERATE perl_cmd_perl_TAKE1 #define perl_cmd_perl_ITERATE2 perl_cmd_perl_TAKE2 #define perl_cmd_perl_TAKE12 perl_cmd_perl_TAKE2 #define perl_cmd_perl_TAKE23 perl_cmd_perl_TAKE123 #define perl_cmd_perl_TAKE3 perl_cmd_perl_TAKE123 #define perl_cmd_perl_TAKE13 perl_cmd_perl_TAKE123 void *perl_perl_merge_dir_config(pool *p, void *basev, void *addv); void *perl_perl_merge_srv_config(pool *p, void *basev, void *addv); void mod_perl_dir_env(request_rec *r, perl_dir_config *cld); void mod_perl_pass_env(pool *p, perl_server_config *cls); #define PERL_DIR_MERGE "DIR_MERGE" #define PERL_DIR_CREATE "DIR_CREATE" #define PERL_SERVER_MERGE "SERVER_MERGE" #define PERL_SERVER_CREATE "SERVER_CREATE" #define PERL_DIR_CFG_T 0 #define PERL_SERVER_CFG_T 1 /* Apache.xs */ pool *perl_get_util_pool(void); pool *perl_get_startup_pool(void); server_rec *perl_get_startup_server(void); request_rec *sv2request_rec(SV *in, char *pclass, CV *cv); /* PerlRunXS.xs */ #define ApachePerlRun_name_with_virtualhost() \ perl_get_sv("Apache::Registry::NameWithVirtualHost", FALSE) char *mod_perl_set_opmask(request_rec *r, SV *sv); void mod_perl_init_opmask(server_rec *s, pool *p); void mod_perl_dump_opmask(void); #define dOPMask \ if(!op_mask) Newz(0, op_mask, maxo, char); \ else Zero(op_mask, maxo, char) #ifdef PERL_SAFE_STARTUP #define ENTER_SAFE(s,p) \ dOPMask; \ ENTER; \ SAVEPPTR(op_mask); \ mod_perl_init_opmask(s,p) #define LEAVE_SAFE \ Zero(op_mask, maxo, char); \ LEAVE #else #define ENTER_SAFE(s,p) #define LEAVE_SAFE #endif #ifdef JW_PERL_OBJECT #undef stderr #define stderr PerlIO_stderr() #endif