#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <memory.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
#ifndef PERL_VERSION
#include <patchlevel.h>
#ifndef PERL_VERSION
#define PERL_VERSION PATCHLEVEL
#define PERL_SUBVERSION SUBVERSION
#endif
#endif
#if !defined(PERLIO_IS_STDIO) && PERL_VERSION < 8
#define PERLIO_IS_STDIO
#endif
#ifdef EP2
#define PERL_NO_GET_CONTEXT
#endif
#ifdef __cplusplus
extern
"C"
{
#endif
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#ifdef __cplusplus
}
#endif
#undef AP_DEBUG
#ifdef APACHE
#undef S_ISREG
#undef DIR
#undef VOIDUSED
#undef pregexec
#undef pregfree
#undef pregcomp
#undef setregid
#undef setreuid
#undef sync
#undef my_memcmp
#undef RETURN
#undef die
#undef __attribute__
#undef isnan
#if defined(EPAPACHE_SSL) || defined(APACHE_SSL)
#undef TRUE
#undef FALSE
#endif
#ifdef WIN32
#ifdef uid_t
#define apache_uid_t uid_t
#undef uid_t
#endif
#define uid_t apache_uid_t
#ifdef gid_t
#define apache_gid_t gid_t
#undef gid_t
#endif
#define gid_t apache_gid_t
#ifdef mode_t
#define apache_mode_t mode_t
#undef mode_t
#endif
#define mode_t apache_mode_t
#ifdef stat
#define apache_stat stat
#undef stat
#endif
#ifdef lstat
#define apache_lstat lstat
#undef lstat
#endif
#ifdef sleep
#define apache_sleep sleep
#undef sleep
#endif
#if PERL_VERSION >= 6
#ifdef opendir
#define apache_opendir opendir
#undef opendir
#endif
#ifdef readdir
#define apache_readdir readdir
#undef readdir
#endif
#ifdef closedir
#define apache_closedir closedir
#undef closedir
#endif
#ifdef crypt
#define apache_crypt crypt
#undef crypt
#endif
#ifndef WIN32
#ifdef errno
#define apache_errno errno
#undef errno
#endif
#endif
#endif /* endif PERL_VERSION >= 6 */
#endif /* endif WIN32 */
#include <httpd.h>
#include <http_config.h>
#include <http_protocol.h>
#include <http_log.h>
#if MODULE_MAGIC_NUMBER >= 19980713
#include "ap_compat.h"
#elif MODULE_MAGIC_NUMBER >= 19980413
#include "compat.h"
#endif
#ifdef APACHE2
#include <apr_strings.h>
#endif
#endif
#ifdef WIN32
#define PATH_MAX _MAX_DIR
#endif
#ifndef PATH_MAX
#define PATH_MAX 512
#endif
#include "eptypes.h"
#include "epnames.h"
#if defined (_MDEBUG) && defined (WIN32)
#define _CRTDBG_MAP_ALLOC
#undef malloc
#undef calloc
#undef realloc
#undef free
#include <crtdbg.h>
#endif
#ifdef DMALLOC
#define DMALLOC_FUNC_CHECK
#include "dmalloc.h"
#endif
#ifdef EP2
#include "epdom.h"
#include "eppublic.h"
#include "epdat2.h"
#include "eppriv.h"
#else
#include "epdat.h"
#endif
#include "embperl.h"
#define nInitialScanOutputSize 2048
int
Init (
int
nIOType,
const
char
* sLogFile,
int
nDebugDefault) ;
int
ResetHandler (
SV * pApacheReqSV) ;
int
Term (
void
) ;
int
ExecuteReq (
register
req * r,
SV * pReqSV) ;
int
embperl_SendHttpHeader (
register
req * r) ;
char
* LogError (
register
req * r,
int
rc) ;
char
* LogErrorParam (
struct
tApp * a,
int
rc,
const
char
* errdata1,
const
char
* errdata2) ;
void
CommitError (
register
req * r) ;
void
RollbackError (
register
req * r) ;
int
ProcessBlock (
register
req * r,
int
nBlockStart,
int
nBlockSize,
int
nBlockNo) ;
void
NewEscMode (
register
req * r,
SV * pSV) ;
int
AddMagicAV (
register
req * r,
char
* sVarName,
MGVTBL * pVirtTab) ;
struct
tBuf
{
struct
tBuf * pNext ;
int
nSize ;
int
nMarker ;
int
nCount ;
} ;
int
OpenInput (
register
req * r,
const
char
* sFilename) ;
int
CloseInput (
register
req * r) ;
int
iread (
register
req * r,
void
* ptr,
size_t
size) ;
char
* igets (
register
req * r,
char
* s,
int
size) ;
int
ReadHTML (
register
req * r,
char
* sInputfile,
size_t
* nFileSize,
SV * * ppBuf) ;
int
OpenOutput (
register
req * r,
const
char
* sFilename) ;
int
CloseOutput (
tReq * r, tComponentOutput * pOutput) ;
int
owrite (
register
req * r,
const
void
* ptr,
size_t
size) ;
void
oflush (
register
req * r) ;
void
oputc (
register
req * r,
char
c) ;
int
oputs (
register
req * r,
const
char
* str) ;
void
OutputToMemBuf (
register
req * r,
char
* pBuf,
size_t
nBufSize) ;
char
* OutputToStd (
register
req * r) ;
struct
tBuf * oBegin (
register
req * r) ;
void
oRollback (
register
req * r,
struct
tBuf * pBuf) ;
void
oRollbackOutput (
register
req * r,
struct
tBuf * pBuf) ;
void
oCommit (
register
req * r,
struct
tBuf * pBuf) ;
void
oCommitToMem (
register
req * r,
struct
tBuf * pBuf,
char
* pOut) ;
int
GetContentLength (
register
req * r) ;
int
OpenLog (
tApp * a) ;
int
CloseLog (
tApp * a) ;
int
FlushLog (
tApp * a) ;
int
lprintf (
tApp * a,
const
char
* sFormat,
...) ;
int
lwrite (
tApp * a,
const
void
* ptr,
size_t
size) ;
long
GetLogFilePos (
tApp * a) ;
int
GetLogHandle (
tApp * a) ;
void
_free (
register
req * r,
void
* p) ;
void
* _malloc (
register
req * r,
size_t
size) ;
void
* _realloc (
register
req * r,
void
* ptr,
size_t
oldsize,
size_t
size) ;
char
* _memstrcat (
register
req * r,
const
char
*s, ...) ;
char
* _ep_strdup (
register
req * r,
const
char
* str) ;
char
* _ep_strndup (
register
req * r,
const
char
* str,
int
len) ;
struct
tCharTrans
{
char
c ;
char
* sHtml ;
} ;
extern
struct
tCharTrans Char2Html [] ;
extern
struct
tCharTrans Char2HtmlLatin2 [] ;
extern
struct
tCharTrans Char2HtmlMin [] ;
extern
struct
tCharTrans Char2Url [] ;
extern
struct
tCharTrans Char2XML [] ;
extern
struct
tCharTrans Html2Char [] ;
extern
int
sizeHtml2Char ;
#ifndef EP2
int
SearchCmd (
register
req * r,
const
char
* sCmdName,
int
nCmdLen,
const
char
* sArg,
int
bIgnore,
struct
tCmd * * ppCmd) ;
int
ProcessCmd (
register
req * r,
struct
tCmd * pCmd,
const
char
* sArg) ;
SV * SplitFdat (
register
req * r,
SV ** ppSVfdat,
SV ** ppSVerg,
char
* pName,
STRLEN nlen) ;
#endif
const
char
* strnstr (
const
char
* pString,
const
char
* pSubString,
int
nMax) ;
char
* GetHashValue (
tReq * r,
HV * pHash,
const
char
* sKey,
int
nMaxLen,
char
* sValue) ;
char
* GetHashValueLen (
tReq * r,
HV * pHash,
const
char
* sKey,
int
nLen,
int
nMaxLen,
char
* sValue) ;
IV GetHashValueInt (
pTHX_
HV * pHash,
const
char
* sKey,
IV nDefault) ;
UV GetHashValueUInt (
tReq * r,
HV * pHash,
const
char
* sKey,
UV nDefault) ;
#define GetHashValuePtr(r,pHash,sKey,nDefault) (void *)GetHashValueUInt(r,pHash,sKey,(UV)nDefault)
char
* GetHashValueStr (
pTHX_
HV * pHash,
const
char
* sKey,
char
* sDefault) ;
char
* GetHashValueStrDup (
pTHX_
tMemPool * pPool,
HV * pHash,
const
char
* sKey,
char
* sDefault) ;
char
* GetHashValueStrDupA (
pTHX_
HV * pHash,
const
char
* sKey,
char
* sDefault) ;
SV * GetHashValueSVinc (
tReq * r,
HV * pHash,
const
char
* sKey,
SV * sDefault) ;
SV * GetHashValueSV (
tReq * r,
HV * pHash,
const
char
* sKey) ;
void
GetHashValueStrOrHash (
tReq * r,
HV * pHash,
const
char
* sKey,
char
* * sValue,
HV * * pHV) ;
int
GetHashValueHREF (
req * r,
HV * pHash,
const
char
* sKey,
HV * * ppHV) ;
int
GetHashValueCREF (
req * r,
HV * pHash,
const
char
* sKey,
CV * * ppCV) ;
enum
tHashItemType
{
hashtstr,
hashtint,
hashtsv
} ;
SV * CreateHashRef (
tReq * r,
char
* sKey, ...) ;
void
SetHashValueStr (
tReq * r,
HV * pHash,
const
char
* sKey,
char
* sValue) ;
void
SetHashValueInt (
tReq * r,
HV * pHash,
const
char
* sKey,
IV nValue) ;
const
char
* GetHtmlArg (
const
char
* pTag,
const
char
* pArg,
int
* pLen) ;
void
OutputToHtml (
register
req * r,
const
char
* sData) ;
void
OutputEscape (
register
req * r,
const
char
* sData,
int
nDataLen,
struct
tCharTrans * pEscTab,
char
cEscChar) ;
SV * Escape (
register
req * r,
const
char
* sData,
int
nDataLen,
int
nEscMode,
struct
tCharTrans * pEscTab,
char
cEscChar) ;
int
TransHtml (
register
req * r,
char
* sData,
int
nLen) ;
void
TransHtmlSV (
register
req * r,
SV * pSV) ;
int
GetLineNo (
register
req * r) ;
int
GetLineNoOf (
register
req * r,
char
* pPos) ;
#ifndef WIN32
#define strnicmp strncasecmp
#define stricmp strcasecmp
#else
#define strnicmp _strnicmp
#define stricmp _stricmp
#endif
void
Dirname (
const
char
* filename,
char
* dirname,
int
size) ;
char
* sstrdup (
tReq * r,
char
* pString) ;
int
SetSubTextPos (
register
req * r,
const
char
* sName,
int
sPos) ;
int
GetSubTextPos (
register
req * r,
const
char
* sName) ;
void
ClearSymtab (
register
req * r,
const
char
* sPackage,
int
bDebug) ;
void
UndefSub (
register
req * r,
const
char
* sName,
const
char
* sPackage) ;
void
ChdirToSource (
register
req * r,
char
* sInputfile) ;
void
embperl_SetCWDToFile (
register
req * r,
const
char
* sFilename) ;
char
* embperl_File2Abs (
register
req * r,
tMemPool * pPool,
const
char
* sFilename) ;
char
* embperl_PathSearch (
register
req * r,
tMemPool * pPool,
const
char
* sFilename,
int
nPathNdx) ;
char
* embperl_PathStr (
register
req * r,
const
char
* sFilename) ;
AV * embperl_String2AV (
tApp * pApp,
const
char
* sData,
const
char
* sSeparator) ;
HV * embperl_String2HV (
tApp * a,
const
char
* sData,
char
cSeparator,
HV * pHV) ;
int
CallCV (
register
req * r,
const
char
* sArg,
CV * pSub,
int
flags,
SV ** pRet) ;
int
EvalOnly (
register
req * r,
const
char
* sArg,
SV ** ppSV,
int
flags,
const
char
* sName) ;
int
EvalDirect (
register
req * r,
SV * pArg,
int
numArgs,
SV ** pArgs) ;
int
EvalNum (
register
req * r,
char
* sArg,
int
nFilepos,
int
* pNum) ;
int
Eval (
register
req * r,
const
char
* sArg,
int
nFilepos,
SV ** pRet) ;
#ifdef EP2
int
EvalStore (
register
req * r,
const
char
* sArg,
int
nFilepos,
SV ** pRet) ;
#endif
int
EvalTrans (
register
req * r,
char
* sArg,
int
nFilepos,
SV ** pRet) ;
int
EvalTransFlags (
register
req * r,
char
* sArg,
int
nFilepos,
int
flags,
SV ** pRet) ;
int
EvalTransOnFirstCall (
register
req * r,
char
* sArg,
int
nFilepos,
SV ** pRet) ;
int
EvalBool (
register
req * r,
char
* sArg,
int
nFilepos,
int
* pTrue) ;
int
EvalSub (
register
req * r,
const
char
* sArg,
int
nFilepos,
const
char
* sName) ;
int
EvalMain (
register
req * r) ;
int
EvalConfig (
tApp * a,
SV * pSV,
int
numArgs,
SV ** pArgs,
const
char
* sContext,
CV ** pCV) ;
int
EvalRegEx (
tApp * a,
char
* sRegex,
const
char
* sContext,
CV ** ppCV) ;
#ifdef EP2
int
CallStoredCV (
register
req * r,
const
char
* sArg,
CV * pSub,
int
numArgs,
SV ** pArgs,
int
flags,
SV ** pRet) ;
#endif
int
SetupDebugger (
register
req * r) ;
#ifdef EP2
#include "ep2.h"
#endif
#ifdef DMALLOC
SV * AddDMallocMagic (
SV * pSV,
char
* sText,
char
* sFile,
int
nLine) ;
#undef newSV
#define newSV(len) AddDMallocMagic(Perl_newSV(aTHX_ (len)), "newSV ", __FILE__, __LINE__)
#undef newSViv
#define newSViv(i) AddDMallocMagic(Perl_newSViv(aTHX_ (i)), "newSViv ", __FILE__, __LINE__)
#define newSVivDBG1(i,txt) AddDMallocMagic(Perl_newSViv(aTHX_ (i)), txt, __FILE__, __LINE__)
#undef newSVnv
#define newSVnv(n) AddDMallocMagic(Perl_newSVnv(aTHX_ (n)), "newSVnv ", __FILE__, __LINE__)
#undef newSVpv
#define newSVpv(s,len) AddDMallocMagic(Perl_newSVpv(aTHX_ (s),(len)), "newSVpv ", __FILE__, __LINE__)
#undef newSVpvn
#define newSVpvn(s,len) AddDMallocMagic(Perl_newSVpvn(aTHX_ (s),(len)), "newSVpvn ", __FILE__, __LINE__)
#undef newSVrv
#define newSVrv(rv,c) AddDMallocMagic(Perl_newSVrv(aTHX_ (rv),(c)), "newSVrv ", __FILE__, __LINE__)
#undef newSVsv
#define newSVsv(sv) AddDMallocMagic(Perl_newSVsv(aTHX_ (sv)), "newSVsv ", __FILE__, __LINE__)
#undef newSVpvf2
#define newSVpvf2(sv) AddDMallocMagic((sv), "newSVsvf ", __FILE__, __LINE__) ; SvTAINTED_off (sv)
#undef perl_get_sv
#undef perl_get_cv
#undef perl_get_hv
#undef perl_get_av
#define perl_get_sv(name,create) AddDMallocMagic(Perl_get_sv(aTHX_ name,create), "perl_get_sv ", __FILE__, __LINE__)
#define perl_get_cv(name,create) (CV *)AddDMallocMagic((SV *)Perl_get_cv(aTHX_ name,create), "perl_get_cv ", __FILE__, __LINE__)
#define perl_get_hv(name,create) (HV *)AddDMallocMagic((SV *)Perl_get_hv(aTHX_ name,create), "perl_get_hv ", __FILE__, __LINE__)
#define perl_get_av(name,create) (AV *)AddDMallocMagic((SV *)Perl_get_av(aTHX_ name,create), "perl_get_av ", __FILE__, __LINE__)
#undef newHV
#define newHV() (HV *)AddDMallocMagic((SV *)Perl_newHV(aTHX), "newHV ", __FILE__, __LINE__)
#undef newAV
#define newAV() (AV *)AddDMallocMagic((SV *)Perl_newAV(aTHX), "newAV ", __FILE__, __LINE__)
#else
#define newSVivDBG1(i,txt) newSViv(i)
#define newSVpvf2(sv)
#endif