/*################################################################################### # # Embperl - Copyright (c) 1997-2008 Gerald Richter / ecos gmbh www.ecos.de # Embperl - Copyright (c) 2008-2015 Gerald Richter # Embperl - Copyright (c) 2015-2023 actevy.io # # You may distribute under the terms of either the GNU General Public # License or the Artistic License, as specified in the Perl README file. # For use with Apache httpd and mod_perl, see also Apache copyright. # # THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED # WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. # ###################################################################################*/ #ifndef __EPDAT2_H #define __EPDAT2_H #ifdef PERL_IMPLICIT_CONTEXT #ifdef USE_THREADS #define tPerlInterpreter struct perl_thread #else #define tPerlInterpreter PerlInterpreter #endif #else #define tPerlInterpreter void #endif #ifdef PerlIO #define FILEIO PerlIO #else #define FILEIO FILE #endif struct tReq; /* forward */ /*-----------------------------------------------------------------*/ /* */ /* Parser data structures */ /* */ /*-----------------------------------------------------------------*/ typedef unsigned char tCharMap [256/(sizeof(unsigned char)*8)] ; struct tToken ; struct tTokenTable { void * pCompilerInfo ; /* stores tables of the compiler , !!!must be first item!!! */ SV * _perlsv ; /**< The perl reference to this structure */ const char * sName ; /* name of syntax */ const char * sRootNode ; /* name of root node */ tCharMap cStartChars ; /* for every vaild start char there is one bit set */ tCharMap cAllChars ; /* for every vaild char there is one bit set */ struct tToken * pTokens ; /* table with all tokens */ int numTokens ; /* number of tokens in above table */ int bLSearch ; /* when set perform a linear, instead of a binary search */ int nDefNodeType ; /* either ntypCDATA or ntypText */ struct tToken * pContainsToken ;/* pointer to the token that has a pContains defined (could be only one per table) */ } ; typedef struct tTokenTable tTokenTable ; typedef struct tComponentConfig { SV * _perlsv ; /**< The perl reference to this structure */ tMemPool * pPool ; /**< pool for memorymanagement */ bool bUseEnv ; /**< Take configuration values out of the environment */ bool bUseRedirectEnv ; /**< Take configuration values out of the environment. Remove REDIRECT_ prefix. */ char * sPackage ; char * sTopInclude ; /**< Include this text at the top of the page */ unsigned bDebug ; unsigned bOptions ; int nCleanup ; int nEscMode ; int nInputEscMode ; char * sInputCharset ; int bEP1Compat; char * sCacheKey ; unsigned bCacheKeyOptions; CV * pExpiredFunc ; CV * pCacheKeyFunc ; int nExpiresIn ; char * sExpiresFilename ; char * sSyntax ; SV * pRecipe ; char * sXsltstylesheet ; char * sXsltproc ; char * sCompartment ; SV * pOpcodeMask ; /* Opcode mask (if any) */ } tComponentConfig ; typedef struct tReqConfig { SV * _perlsv ; /**< The perl reference to this structure */ tMemPool * pPool ; /**< pool for memorymanagement */ bool bUseEnv ; /**< Take configuration values out of the environment */ bool bUseRedirectEnv ; /**< Take configuration values out of the environment. Remove REDIRECT_ prefix. */ CV * pAllow ; CV * pUriMatch ; char cMultFieldSep ; AV * pPathAV ; int nOutputMode ; /**< 0 = html 1 = xml */ int nOutputEscCharset ; /**< 0 = utf-8 (min) 1 = latin1 2 = latin2 */ unsigned bDebug ; unsigned bOptions ; int nSessionMode ; /**< sets how to pass the session id, see smodeXXX constants */ } tReqConfig ; typedef struct tReqParam { SV * _perlsv ; /**< The perl reference to this structure */ tMemPool * pPool ; /**< pool for memorymanagement */ char * sFilename ; char * sUnparsedUri ; char * sUri ; char * sServerAddr ; /**< protocol://server:port */ char * sPathInfo ; char * sQueryInfo ; char * sLanguage ; /**< Language for the current request */ HV * pCookies ; /**< Received Cookies */ SV * pCGISV ; /**< CGI Object which hold upload data */ } tReqParam ; typedef struct tAppConfig { SV * _perlsv ; /**< The perl reference to this structure */ tMemPool * pPool ; /**< pool for memorymanagement */ char * sAppName ; bool bUseEnv ; /**< Take configuration values out of the environment */ bool bUseRedirectEnv ; /**< Take configuration values out of the environment. Remove REDIRECT_ prefix. */ char * sAppHandlerClass ; char * sSessionHandlerClass ; HV * pSessionArgs ; AV * pSessionClasses ; char * sSessionConfig ; char * sCookieName ; char * sCookieDomain ; char * sCookiePath ; char * sCookieExpires ; /**< Argument given in config for cookie expires **/ bool bCookieSecure ; char * sLog ; unsigned bDebug ; char * sMailhost ; char * sMailhelo ; char * sMailfrom ; bool bMaildebug ; char * sMailErrorsTo ; int nMailErrorsLimit ; int nMailErrorsResetTime ; int nMailErrorsResendTime ; char * sObjectBase ; char * sObjectApp ; AV * pObjectAddpathAV ; /**< add to search path */ AV * pObjectReqpathAV ; /**< search this directries for requested documents */ char * sObjectStopdir ; char * sObjectFallback ; char * sObjectHandlerClass ; } tAppConfig ; typedef struct tComponentParam { SV * _perlsv ; /**< The perl reference to this structure */ tMemPool * pPool ; /**< pool for memorymanagement */ char * sInputfile ; /**< name of sourcefile */ char * sOutputfile ; /**< name of outputfile */ char * sSubreq ; /**< sub request uri */ SV * pInput ; SV * pOutput ; char * sSub ; /* subroutine to call */ int nImport ; char * sObject ; /**< create an object */ char * sISA ; /**< make this a base class */ AV * pErrArray ; /**< return error messages in this hash */ int nFirstLine ; int nMtime ; /**< last modification time of pInput */ AV * pParam ; /**< parameters passed via Execute */ HV * pFormHash; /**< fdat for this component */ AV * pFormArray ; /**< ffld for this component */ HV * pXsltParam ; /**< parameter for xslt proc */ } tComponentParam ; typedef struct tThreadData { SV * _perlsv ; /**< The perl reference to this structure */ tPerlInterpreter * pPerlTHX ; /* pointer to Perl interpreter */ tMemPool * pPool ; /**< pool for memorymanagement */ tMemPool * pMainPool ; /**< global pool. Only use during initialisation! */ HV * pApplications ; /**< Hash with available applications */ struct tReq * pCurrReq ; /**< Current running request if any */ pid_t nPid ; /**< process/thread id */ /* --- Embperl special hashs/arrays --- */ HV * pEnvHash ; /* environment from CGI Script */ HV * pFormHash ; /* Formular data */ GV * pFormHashGV ; HV * pFormSplitHash ; /* Formular data split up at \t */ HV * pInputHash ; /* Data of input fields */ AV * pFormArray ; /* Fieldnames */ GV * pFormArrayGV ; HV * pHeaderHash ;/* http headers */ SV * pReqRV ; /* the request object global */ SV * pAppRV ; /* the application object global */ AV * pParamArray ; GV * pParamArrayGV ; } tThreadData ; typedef struct tApp { SV * _perlsv ; /**< The perl reference to this structure */ tPerlInterpreter * pPerlTHX ; /* pointer to Perl interpreter */ tMemPool * pPool ; /**< pool for memorymanagement */ tThreadData * pThread ; struct tReq * pCurrReq ; /**< Current running request if any */ tAppConfig Config ; /**< application configuration data */ FILEIO * lfd ; /**< log file handle */ HV * pUserHash ; /**< Session User data */ SV * pUserObj ; /**< Session User object */ HV * pStateHash ; /**< Session State data */ SV * pStateObj ; /**< Session State object */ HV * pAppHash ; /**< Session Application data */ SV * pAppObj ; /**< Session Application object */ int nErrorsCount ; /**< Number of errors */ int nErrorsLastTime ; /**< Time last error has occured */ int nErrorsLastSendTime ;/**< Time last error was send via mail */ } tApp ; typedef struct tComponentOutput { SV * _perlsv ; /**< The perl reference to this structure */ tMemPool * pPool ; /**< pool for memorymanagement */ bool bDisableOutput ; /* no output is generated */ struct tBuf * pFirstBuf ; /* First buffer */ struct tBuf * pLastBuf ; /* Last written buffer */ struct tBuf * pFreeBuf ; /* List of unused buffers */ struct tBuf * pLastFreeBuf ; /* End of list of unused buffers */ char * pMemBuf ; /* temporary output */ char * pMemBufPtr ; /* temporary output */ size_t nMemBufSize ; /* size of pMemBuf */ size_t nMemBufSizeFree;/* remaining space in pMemBuf */ int nMarker ; /* Makers for rollback output */ FILEIO * ofd ; /* output file descriptor */ int no_ofd_close ; /* do not close output file handle, because it's ownd by perl */ SV * ofdobj ; /* perl object that is tied to stdout, if any */ } tComponentOutput ; struct tComponent { SV * _perlsv ; /**< The perl reference to this structure */ tMemPool * pPool ; /**< pool for memorymanagement */ tComponentConfig Config ; /**< request configuration data */ tComponentParam Param ; /**< parameter passed to current request */ tComponentOutput * pOutput ; /**< output channel for this component */ tReq * pReq ; bool bReqRunning ; /* we are inside of a request */ bool bSubReq ; /* This is a sub request (called inside an Embperl page) */ int nInsideSub ; /* Are we inside of a sub? */ int bSubNotEmpty ; /* Sub has some output */ int bExit ; /* We should exit the page */ int nPathNdx ; /* gives the index in the path where the current file is found */ char * sCWD ; /**< Current working directory */ char sResetDir[PATH_MAX] ; /**< Reset directory to */ #ifdef WIN32 char nResetDrive ; /**< Reset drive to */ #endif bool bEP1Compat ; /* run in Embperl 1.x compatible mode */ int nPhase ; /* which phase of the request we are in */ /* --- source --- */ char * sSourcefile ; /**< Contains the current sourefilename */ char * pBuf ; /**< Contains a pointer to the start of the current source in memory */ char * pEndPos ; /**< First byte after sourcebuffer */ char * pCurrPos ; /**< Current position in sourcebuffer */ int nSourceline ; /**< Currentline in sourcefile */ char * pSourcelinePos ; /**< Positon of nSourceline in sourcebuffer */ char * pLineNoCurrPos ; /**< save pCurrPos for line no calculation */ /* --- DomTree ---*/ tNode xDocument ; /* Document node */ tNode xCurrNode ; /* node that was last executed */ tRepeatLevel nCurrRepeatLevel ; /* repeat level for node that was last executed */ tIndex nCurrCheckpoint ; /* next checkpoint that should be passed if execution order is unchanged (i.e. no loop/if) */ tIndex xCurrDomTree ; /* DomTree we are currently working on */ tIndex xSourceDomTree ;/* DomTree which contains the source */ struct tCacheItem * pOutputCache ; /**< Cache which hold the final output */ SV * pOutputSV ; /**< set if output is text and not a tree */ struct tTokenTable * pTokenTable ; /**< holds the current syntax */ /* --- Escaping --- */ struct tCharTrans * pCurrEscape ; /* pointer to current escape table */ struct tCharTrans * pNextEscape ; /* pointer to next escape table (after end of block) */ int nCurrEscMode ; /* current active escape mode */ int bEscModeSet ; /* escape mode already set in this block */ int bEscInUrl ; /* we are inside an url */ /* --- i/o filehandles --- */ FILEIO * ifd ; /* input file */ SV * ifdobj ; /* perl object that is tied to stdin, if any */ bool bAppendToMainReq ; /* append output to main request */ /* ------------------------ */ struct tComponent * pPrev ; /* Component from which this one is called */ /* ------------------------ */ /* --- more infos for eval --- */ int bStrict ; /* aply use strict in each eval */ char op_mask_buf[MAXO + 100]; /* save buffer for opcode mask - maxo shouldn't differ from MAXO but leave room anyway (see BOOT:) */ char * sImportPackage ; /**< name of caller macro that should be used to import new subs */ HV * pImportStash ; /* stash for package, where new subs should be imported */ HV * pExportHash ; /* --- compiler --- */ char * sCurrPackage ; /**< Package name for current sourcefile */ char * sEvalPackage ; /**< Package for eval (normally same sCurrPackage, differs when running in a safe namespace */ STRLEN nEvalPackage ; /**< Length of package name for eval */ char * sMainSub ; /**< Name of sub to call when executing the current source */ char * * pProg ; /* pointer into currently compiled code */ char * pProgRun ; /* pointer into currently compiled run code */ char * pProgDef ; /* pointer into currently compiled define code */ SV * pCodeSV ; /* contains currently compiled line */ } ; struct tReq { SV * _perlsv ; /**< The perl reference to this structure */ tPerlInterpreter * pPerlTHX ; /* pointer to Perl interpreter */ tMemPool * pPool ; /**< pool for memorymanagement */ request_rec * pApacheReq ; /* apache request record */ SV * pApacheReqSV ; tApacheDirConfig * pApacheConfig ; tReq * pPrevReq ; /**< Stack in case a new request is startet, when a request is active */ tReqConfig Config ; /**< request configuration data */ tReqParam Param ; /**< request parameter data */ tComponent Component ; tApp * pApp ; tThreadData * pThread ; int nRequestCount ; /**< increments by one on each request */ time_t nRequestTime ; /**< time when request starts */ int nIOType ; int nSessionMgnt ; /* how to retrieve the session id */ char * sSessionID ; /**< stores session name and id for status session data */ char * sSessionUserID ; /**< received id of user session data */ char * sSessionStateID ; /**< received id of state session data */ char * sCookieExpires ; /**< Time when cookie expires **/ int bExit ; /**< We should exit the request */ long nLogFileStartPos ; /**< file position of logfile, when logfile started */ int bError ; /* Error has occured somewhere */ AV * pErrArray ; /* Errors to show on Error response */ char errdat1 [ERRDATLEN] ; /* Additional error information */ char errdat2 [ERRDATLEN] ; char lastwarn [ERRDATLEN] ; /* last warning */ SV * pErrSV ; /* in case error is an object it is copied to here */ AV * pDomTreeAV ; /* holds all DomTrees alocated during the request */ AV * pCleanupAV ; /* set all sv's that are conatined in that array to undef after the whole request */ HV * pCleanupPackagesHV ; /* packages that should be cleaned up at end of request */ char * sInitialCWD ; /**< Reset directory to */ AV * pMessages ; AV * pDefaultMessages ; /* --- for statistics --- */ clock_t startclock ; I32 stsv_count ; #if defined (_MDEBUG) && defined (WIN32) _CrtMemState MemCheckpoint ; /* memory leak debugging */ #endif #ifdef DMALLOC unsigned long MemCheckpoint ; /* memory leak debugging */ #endif } ; #endif