richter     02/01/09 07:26:21

  Modified:    .        Tag: Embperl2c epdat2.h epinit.c
  Log:
  data structure rewrite
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.1.2.2   +35 -38    embperl/Attic/epdat2.h
  
  Index: epdat2.h
  ===================================================================
  RCS file: /home/cvs/embperl/Attic/epdat2.h,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- epdat2.h  8 Jan 2002 15:47:13 -0000       1.1.2.1
  +++ epdat2.h  9 Jan 2002 15:26:21 -0000       1.1.2.2
  @@ -53,6 +53,8 @@
       SV *    pInput ;
       SV *    pOutput ;
       char *  sSub ;            /* subroutine to call */
  +    int     nImport ;
  +    int     nFirstLine ;
       } tComponentParam ;
   
   
  @@ -62,6 +64,15 @@
       HV *    pApplications ;     /**< Hash with available applications */
       tReq *  pCurrReq ;          /**< Current running request if any */
       pid_t   nPid ;              /**< process/thread id */
  +
  +    /* --- Embperl special hashs/arrays --- */
  +
  +    HV *    pEnvHash ;        /* environement from CGI Script */
  +    HV *    pFormHash ;  /* Formular data */
  +    HV *    pFormSplitHash ;  /* Formular data split up at \t */
  +    HV *    pInputHash ; /* Data of input fields */
  +    AV *    pFormArray ; /* Fieldnames */
  +    HV *    pHeaderHash ;/* http headers */
       
       } tThreadData ;
   
  @@ -78,6 +89,10 @@
       #endif
       SV *        pUserSession ;  /**< user session object */
       SV *        pStateSession ; /**< state session object */
  +
  +    HV *    pUserHash ;  /* Session User data */
  +    HV *    pStateHash ; /* Session State data */
  +    HV *    pModHash ;   /* Module data */
       } tApp ;
   
   
  @@ -85,75 +100,48 @@
       {
       SV *          pReqSV ;      /* The perl reference to this request structure */
   
  +#ifdef PERL_IMPLICIT_CONTEXT
  +    pTHX ;                      /* pointer to Perl interpreter */
  +#endif
  +
       #ifdef APACHE
       request_rec * pApacheReq ;       /* apache request record */
       SV *          pApacheReqSV ;
       #endif
     
       tReqConfig    ReqConfig ;    /**< request configuration data */
  +    tReqParam     ReqParam ;     /**< request parameter data */
       tApp *        pApp ;
       tThreadData * pThread ;
   
  -    int     nRequestCount ;     /**< increments by one on each request */
  -    time_t  nRequestTime ;      /**< time when request starts */
  -
  -    int          nSessionMgnt ;      /* how to retrieve the session id */
  -    char *  sSessionID ;        /* stores session name and id for status session 
data */
  -
       char *  sUnparsedUri ;
       char *  sUri ;
       char *  sPathInfo ;
       char *  sQueryInfo ;
       
  -    int                bExit ;        /**< We should exit the request */
  -
  -    /* --- memory management --- */
  -
  -    size_t nAllocSize ;             /*  Alloced memory for debugging */
  +    int     nRequestCount ;     /**< increments by one on each request */
  +    time_t  nRequestTime ;      /**< time when request starts */
   
  -    long    nLogFileStartPos ; /* file position of logfile, when logfile started */
  +    int          nSessionMgnt ;      /* how to retrieve the session id */
  +    char *  sSessionID ;        /* stores session name and id for status session 
data */
   
  -    /* --- keep track of errors --- */
  +    int          bExit ;             /**< We should exit the request */
  +    long    nLogFileStartPos ;  /**< file position of logfile, when logfile started 
*/
   
       bool    bError  ;                /* Error has occured somewhere */
  -    I32     nLastErrFill  ;  /* last size of error array */
  -    int     bLastErrState ;  /* last state of error flag */
       AV *    pErrArray ;      /* Errors to show on Error response */
  -    AV *    pErrFill ;               /* AvFILL of pErrArray, index is nMarker */
  -    AV *    pErrState ;      /* bError, index is nMarker  */
  -
  -    /* Everything after here will not automaticly set to zero */
  -    int     zeroend ;
   
       char    errdat1 [ERRDATLEN] ; /* Additional error information */
       char    errdat2 [ERRDATLEN] ;
       char    lastwarn [ERRDATLEN] ; /* last warning */
   
  -    /* --- Embperl special hashs/arrays --- */
  -
  -    HV *    pEnvHash ;        /* environement from CGI Script */
  -    HV *    pFormHash ;  /* Formular data */
  -    HV *    pFormSplitHash ;  /* Formular data split up at \t */
  -    HV *    pInputHash ; /* Data of input fields */
  -    AV *    pFormArray ; /* Fieldnames */
  -    HV *    pUserHash ;  /* Session User data */
  -    HV *    pStateHash ; /* Session State data */
  -    HV *    pModHash ;   /* Module data */
  -    HV *    pHeaderHash ;/* http headers */
  -#ifdef EP2
       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 */
  -#endif
   
       /* --- for statistics --- */
   
       clock_t startclock ;
       I32     stsv_count ;
  -    I32     stsv_objcount ;
  -    I32     lstsv_count ;
  -    I32     lstsv_objcount  ;
  -    int     numEvals ;
  -    int     numCacheHits ;
   
   #if defined (_DEBUG) && defined (WIN32)
       _CrtMemState MemCheckpoint ;             /* memory leak debugging */    
  @@ -188,6 +176,15 @@
   
       bool    bEP1Compat ;     /* run in Embperl 1.x compatible mode */    
       tPhase  nPhase ;         /* which phase of the request we are in */
  +
  +    char *  pCurrPos ;               /* Current position in html file */
  +    int     nSourceline ;       /* Currentline in sourcefile */
  +    char *  pSourcelinePos ;    /* Positon of nSourceline in sourcefile */
  +    char *  pLineNoCurrPos ;    /* save pCurrPos for line no calculation */
  +
  +    char *  sEvalPackage ;      /* Package for eval (normaly same sCurrPackage,
  +                                differs when running in a safe namespace */
  +    STRLEN  nEvalPackage ;      /* Package for eval (length) */
   
       /* --- DomTree ---*/
   
  
  
  
  1.1.2.2   +544 -165  embperl/Attic/epinit.c
  
  Index: epinit.c
  ===================================================================
  RCS file: /home/cvs/embperl/Attic/epinit.c,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- epinit.c  8 Jan 2002 15:47:13 -0000       1.1.2.1
  +++ epinit.c  9 Jan 2002 15:26:21 -0000       1.1.2.2
  @@ -1,8 +1,4 @@
   
  -#define EMBPERL_APP_PACKAGE "HTML::Embperl::Application"
  -#define EMBPERL_REQ_PACKAGE "HTML::Embperl::Req"
  -#define EMBPERL_THREAD_PACKAGE "HTML::Embperl::Thread"
  -
   
   #if !defined (pTHX) || pTHX == ""
   
  @@ -13,6 +9,28 @@
   #endif
   
   
  +#define EMBPERL_PACKAGE_POSTFIX "2"
  +#define EMBPERL_PACKAGE         "HTML::Embperl"EMBPERL_PACKAGE_POSTFIX
  +
  +
  +#define EMBPERL_APP_PACKAGE     EMBPERL_PACKAGE"::Application"
  +#define EMBPERL_REQ_PACKAGE     EMBPERL_PACKAGE"::Req"
  +#define EMBPERL_THREAD_PACKAGE  EMBPERL_PACKAGE"::Thread"
  +
  +#define EMBPERL_FDAT_NAME       EMBPERL_PACKAGE"::fdat"
  +#define EMBPERL_SPLIFDAT_NAME   EMBPERL_PACKAGE"::splitfdat"
  +#define EMBPERL_FFLD_NAME       EMBPERL_PACKAGE"::ffld"
  +#define EMBPERL_HDR_NAME        EMBPERL_PACKAGE"::http_headers_out"
  +#define EMBPERL_IDAT_NAME       EMBPERL_PACKAGE"::idat"
  +#define EMBPERL_ENV_NAME        "ENV"
  +
  +
  +static char sUserHashName  [] = "HTML::Embperl::udat" ;
  +static char sStateHashName [] = "HTML::Embperl::sdat" ;
  +static char sModHashName  []  = "HTML::Embperl::mdat" ;
  +
  +
  +
   /*---------------------------------------------------------------------------
   * embperl_SetupThread
   */
  @@ -62,6 +80,26 @@
           pThread -> pThreadSV     = newRV_noinc ((SV *)pThreadHV) ;
           pThread -> nPid          = getpid () ; 
           pThread -> pApplications = newHV ;
  +
  +        
  +        if ((pThread ->pFormHash = perl_get_hv (EMBPERL_FDAT_NAME, TRUE)) == NULL)
  +            LogError (r, rcHashError) ;
  +
  +        if ((pThread ->pFormSplitHash = perl_get_hv (EMBPERL_SPLIFDAT_NAME, TRUE)) 
== NULL)
  +            LogError (r, rcHashError) ;
  +
  +        if ((pThread ->pFormArray = perl_get_av (EMBPERL_FFLD_NAME, TRUE)) == NULL)
  +            LogError (r, rcArrayError) ;
  +        
  +        if ((pThread ->pHeaderHash = perl_get_hv (EMBPERL_HDR_NAME, TRUE)) == NULL)
  +            LogError (r, rcHashError) ;
  +
  +        if ((pThread ->pInputHash = perl_get_hv (EMBPERL_IDAT_NAME, TRUE)) == NULL)
  +            LogError (r,  rcHashError) ;
  +
  +        if ((pThread ->pEnvHash = perl_get_hv (EMBPERL_ENV_NAME, TRUE)) == NULL)
  +            LogError (r,  rcHashError) ;
  +
           }
   
       return pThread ;
  @@ -111,7 +149,7 @@
           pApp -> pAppSV = newRV_noinc ((SV *)pAppHV) ;
           sv_bless (pApp -> pAppSV, gv_stashpv (EMBPERL_APP_PACKAGE, 0)) ;
   
  -        memcpy (pApp -> AppConfig, pAppCfg, sizeof (*pApp -> AppConfig)) ;
  +        memcpy (&pApp -> AppConfig, pAppCfg, sizeof (pApp -> AppConfig)) ;
   
           pApp -> pThread = pThread ;
   
  @@ -122,46 +160,327 @@
                LogError (NULL, rc) ;
                }
               }
  +
  +        
  +        /*
  +        if ((pApp ->pUserHash = perl_get_hv (sUserHashName, TRUE)) == NULL)
  +            {
  +            LogError (r, rcHashError) ;
  +            }
  +
  +        if ((pApp ->pStateHash = perl_get_hv (sStateHashName, TRUE)) == NULL)
  +            {
  +            LogError (r, rcHashError) ;
  +            }
  +
  +        if ((pApp ->pModHash = perl_get_hv (sModHashName, TRUE)) == NULL)
  +            {
  +            LogError (r, rcHashError) ;
  +            }
  +        */
  +        
  +        
           }
   
       return pApp ;
       }
   
  +/*---------------------------------------------------------------------------
  +* embperl_GetFormData
  +*/
  +/*!
  +*
  +* \_en                                                                          
  +* Takes the given form data and put them in %fdat/@ffld
  +* \endif                                                                       
  +*
  +* \_de                                                                          
  +* Nimmt die �bergebenen Formulardaten und legt sie in %fdat/@ffld ab
  +* \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
   
  +static int embperl_GetFormData (/*i/o*/ register req * r,
  +                     /*in*/ char * pQueryString,
  +                        /*in*/ int    nLen)
   
  +    {
  +    int     num ;
  +    char *  p ;
  +    char *  pMem ;
  +    int     nVal ;
  +    int     nKey ;
  +    char *  pKey ;
  +    char *  pVal ;
  +    SV *    pSVV ;
  +    SV *    pSVK ;
  +    SV * *  ppSV ;
  +
  +    AV *    pFormArray      = r -> pThread -> pFormArray ;
  +    HV *    pFormHash       = r -> pThread -> pFormHash ;
  +    HV *    pFormSplitHash  = r -> pThread -> pFormSplitHash ;
  +    bool    bAll            = r -> pComponent -> ComponentConfig.bOptions & 
optAllFormData ;
  +    bool    bDebug          = r -> pComponent -> ComponentConfig.bDebug & dbgForm ;
  +
  +    hv_clear (pFormHash) ;
  +    hv_clear (pFormSplitHash) ;
  +    av_clear (pFormArray) ;
  +    av_clear (pInputHash) ;
  +
  +    if (nLen == 0)
  +        return ok ;
  +    
  +    if ((pMem = _malloc (r, nLen + 4)) == NULL)
  +        return rcOutOfMemory ;
  +
  +    p = pMem ;
   
   
  -/* ---------------------------------------------------------------------------- */
  -/*                                                                              */
  -/* Setup Request                                                                */
  -/*                                                                              */
  -/* ---------------------------------------------------------------------------- */
  +    nKey = nVal = 0 ;
  +    pKey = pVal = p ;
  +    while (1)
  +        {
  +        switch (nLen > 0?*pQueryString:'\0')
  +            {
  +            case '+':
  +                pQueryString++ ;
  +                nLen-- ;
  +                *p++ = ' ' ;
  +                break ;
  +            
  +            case '%':
  +                pQueryString++ ;
  +                nLen-- ;
  +                num = 0 ;
  +                if (*pQueryString)
  +                    {
  +                    if (toupper (*pQueryString) >= 'A')
  +                        num += (toupper (*pQueryString) - 'A' + 10) << 4 ;
  +                    else
  +                        num += ((*pQueryString) - '0') << 4 ;
  +                    pQueryString++ ;
  +                    }
  +                if (*pQueryString)
  +                    {
  +                    if (toupper (*pQueryString) >= 'A')
  +                        num += (toupper (*pQueryString) - 'A' + 10) ;
  +                    else
  +                        num += ((*pQueryString) - '0') ;
  +                    pQueryString++ ;
  +                    nLen-- ;
  +                    }
  +                *p++ = num ;
  +                break ;
  +            case '=':
  +                nKey = p - pKey ;
  +                *p++ = r -> pReqConfig.cMultFieldSep ;
  +                nVal = 0 ;
  +                pVal = p ;
  +                pQueryString++ ;
  +                nLen-- ;
  +                break ;
  +            case ';':
  +            case '&':
  +                pQueryString++ ;
  +                nLen-- ;
  +            case '\0':
  +                nVal = p - pVal ;
  +                *p++ = '\0' ;
  +            
  +                if (nKey > 0 && (nVal > 0 || (bAll)))
  +                    {
  +                    char * sid = NULL ;
  +                    if (r -> pConf)
  +                        sid = r -> pApp -> AppConfig.sCookieName ;
  +                 if (sid)
  +                     { /* remove session id  */
  +                     if (strncmp (pKey, sid, nKey) != 0)
  +                         sid = NULL ;
  +                     }
  +
  +                 if (sid == NULL)
  +                     { /* field is not the session id */
  +                     if (pVal > pKey)
  +                         pVal[-1] = '\0' ;
  +                    
  +                     if ((ppSV = hv_fetch (pFormHash, pKey, nKey, 0)))
  +                         { /* Field exists already -> append separator and field 
value */
  +                         sv_catpvn (*ppSV, r -> pReqConfig.cMultFieldSep , 1) ;
  +                         sv_catpvn (*ppSV, pVal, nVal) ;
  +                         }
  +                     else
  +                         { /* New Field -> store it */
  +                         pSVV = newSVpv (pVal, nVal) ;
  +                         if (hv_store (pFormHash, pKey, nKey, pSVV, 0) == NULL)
  +                             {
  +                             _free (r, pMem) ;
  +                             return rcHashError ;
  +                             }
  +
  +                         pSVK = newSVpv (pKey, nKey) ;
  +
  +                         av_push (pFormArray, pSVK) ;
  +                         }
  +
  +                
  +                     if (bDebug)
  +                         lprintf (r, "[%d]FORM: %s=%s\n", r -> nPid, pKey, pVal) ; 
  +                     }
  +                    }
  +                pKey = pVal = p ;
  +                nKey = nVal = 0 ;
  +                
  +                if (*pQueryString == '\0')
  +                    {
  +                    _free (r, pMem) ;
  +                    return ok ;
  +                    }
  +                
  +                
  +                break ;
  +            default:
  +                *p++ = *pQueryString++ ;
  +                nLen-- ;
  +                break ;
  +            }
  +        }
  +
  +    return ok ;
  +    }
  +
  +
  +/*---------------------------------------------------------------------------
  +* embperl_SetupFormData
  +*/
  +/*!
  +*
  +* \_en                                                                          
  +* Get the posted form data and put them in %fdat/@ffld
  +* \endif                                                                       
  +*
  +* \_de                                                                          
  +* Lie�t die formular daten ein und legt sie in %fdat/@ffld ab
  +* \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
   
   
  -tReq * embperl_SetupRequest(/*in*/ pTHX_
  -                     /*in*/ SV *             pApacheReqSV,
  -                     /*in*/ tReqConfig *     pReqCfg,
  -                     /*in*/ tApp *           pApp,
  -                     /*in*/ tReqParam *      param)
  +static int embperl_SetupFormData (/*i/o*/ register req * r)
  +
  +    {
  +    char *  p = NULL ;
  +    char *  f ;
  +    int     rc = ok ;
  +    STRLEN  len   = 0 ;
  +    char    sLen [20] ;
  +    
  +
  +    /* print out of env set tainted, so reset it now */
  +    tainted = 0 ;
  +
  +#ifdef APACHE
  +    if (r -> pApacheReq)
  +        {
  +        const char * sLength = table_get(r -> pApacheReq->headers_in, 
"Content-Length") ;
  +     len = sLength?atoi (sLength):0 ;
  +     }
  +    else
  +#endif
  +     {
  +     sLen [0] = '\0' ;
  +     GetHashValue (r -> pThread -> pEnvHash, "CONTENT_LENGTH", sizeof (sLen) - 1, 
sLen) ;
  +     len = atoi (sLen) ;
  +     }
  +
  +    if (len == 0)
  +        {
  +        p = r -> sQueryString ;
  +        len = strlen (p) ;
  +        f = NULL ;
  +        }
  +    else
  +        {
  +        if ((p = _malloc (r, len + 1)) == NULL)
  +            return rcOutOfMemory ;
  +
  +        if ((rc = OpenInput (r, NULL)) != ok)
  +            {
  +            _free (r, p) ;
  +            return rc ;
  +            }
  +        iread (r, p, len) ;
  +        CloseInput (r) ;
  +        
  +        p[len] = '\0' ;
  +        f = p ;
  +        }
  +        
  +    if (r  -> pComponent -> bDebug)
  +        lprintf (r,  "[%d]Formdata... length = %d\n", r -> pThread -> nPid, len) ;  
  
  +
  +    rc = GetFormData (r, p, len) ;
  +    
  +    if (len > 0 && f)
  +     {
  +     r -> sQueryInfo = f ;
  +     f[len] = '\0' ;
  +     }
  +
  +    return rc ;
  +    }
  +
  +
  +
  +/*---------------------------------------------------------------------------
  +* embperl_SetupRequest
  +*/
  +/*!
  +*
  +* \_en                                                                          
  +* setup data for (http-)request object
  +* \endif                                                                       
  +*
  +* \_de                                                                          
  +* Initialisiert das Requestobjekt
  +* \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +
  +int    embperl_SetupRequest (/*in*/ pTHX_
  +                             /*in*/ SV *             pApacheReqSV,
  +                             /*in*/ tReqConfig *     pReqCfg,
  +                             /*in*/ tApp *           pApp,
  +                             /*out*/tReq * *         ppReq)
                        
                        
       {
  -    int     rc ;
  -    tReq *  r ;
  -    char *  sMode ;
  -    tFile * pFile ;
  -    HV * pReqHV  ;
  -#ifdef EP2
  -    SV * * ppSV ;
  -    STRLEN len ;
  -#endif
  +    int             rc ;
  +    tReq *          r ;
  +    HV *            pReqHV  ;
  +    tThreadData *   pThread ;
  +
   #ifdef APACHE
       request_rec * pApacheReq = r -> pApacheReq ;
   #endif
  -    tThreadData * pThread ;
   
       r = malloc (sizeof (*r)) ; 
   
  +    r -> startclock      = clock () ;
  +    r -> stsv_count      = sv_count ;
  +
  +#ifdef PERL_IMPLICIT_CONTEXT
  +    r -> pPerlTHX = aTHX ;
  +#endif
  +
  +#if defined (_DEBUG) && defined (WIN32)
  +    _CrtMemCheckpoint(&r -> MemCheckpoint);    
  +#endif    
  +#ifdef DMALLOC
  +    r -> MemCheckpoint = dmalloc_mark () ;   
  +#endif    
  +
  +
       pReqHV = newHV () ;
       sv_magic ((SV *)pReqHV, NULL, '~', (char *)&r, sizeof (r)) ;
       r -> pReqSV = newRV_noinc ((SV *)pReqHV) ;
  @@ -176,26 +495,11 @@
   #endif
   
       
  -    memcpy (r -> pReqConfig, pReqCfg, sizeof (*r -> pReqConfig)) ;
  +    memcpy (&r -> ReqConfig, pReqCfg, sizeof (r -> ReqConfig)) ;
   
       r -> pApp = pApp ;
       pThread = r -> pThread = pApp -> pThread  ;
   
  -    r -> nPhase  = phInit ;
  -
  -#if defined (_DEBUG) && defined (WIN32)
  -    _CrtMemCheckpoint(&r -> MemCheckpoint);    
  -#endif    
  -#ifdef DMALLOC
  -    r -> MemCheckpoint = dmalloc_mark () ;   
  -#endif    
  -
  -    r -> startclock      = clock () ;
  -    r -> stsv_count      = sv_count ;
  -    r -> stsv_objcount   = sv_objcount ;
  -    r -> lstsv_count     = sv_count ;
  -    r -> lstsv_objcount  = sv_objcount ;
  -
   #ifdef APACHE
       if (pApacheReq)
           {
  @@ -213,166 +517,241 @@
           r -> sQueryInfo   = GetHashValueStr (pThread -> pEnvHash, "QUERY_INFO", "") 
;
           }
       
  -    
  -    ppSV = hv_fetch(r -> pEnvHash, "PATH_INFO", sizeof ("PATH_INFO") - 1, 0) ;  
  -    if (ppSV)
  -        r -> sPathInfo = SvPV (*ppSV ,len) ;
  -    r -> pTokenTable = pTokenTable ;    
  -#else
  -    r -> pTokenTable = (void *)pTokenTable ;    
  -#endif
  -    if (rc != ok)
  -        r -> bDebug = 0 ; /* Turn debbuging off, only errors will go to stderr if 
logfile not open */
  -    r -> bOptions        = pReqCfg -> bOptions ;
  -    /*r -> nIOType         = InitialReq.nIOType ;*/
   
  -    if (r -> pApplication)
  -     {
  -     SvREFCNT_inc (r -> pApplication) ;
  -     }
  +    r -> nRequestCount   = nRequestCount++ ;
  +    r -> nRequestTime    = time(NULL) ;
   
  -    r -> sSubName        = sSubName ;
  -    r -> nSessionMgnt    = nSessionMgnt ;    
  -    r -> pReqCfg           = pReqCfg ;
  -    r -> nInsideSub   = 0 ;
  -    r -> bExit        = 0 ;
  +    r -> pErrArray  = newAV () ;
  +    r -> pDomTreeAV = newAV () ; 
  +    r -> pCleanupAV = newAV () ; 
       
  -    r -> nRequestCount   = nRequestCount++ ;
  -    r -> nRequestTime = time(NULL) ;
  -    getcwd (r->sCWD, sizeof (r->sCWD)-1) ;
  -    r -> sResetDir[0] = '\0' ;
  -    r -> pOutData        = pOut ;
  -    r -> pInData         = pIn ;
  +    r -> bExit        = 0 ;
  +    r -> bError          = 0 ;
  +    r -> errdat1 [0]     = '\0' ; /* Additional error information */
  +    r -> errdat2 [0]     = '\0' ;
  +    r -> lastwarn [0]    = '\0' ; /* last warning */
   
  -    r -> pFiles2Free  = NULL ;
  -    if (r -> bSubReq && sSourcefile[0] == '?' && sSubName && sSubName[0] != '\0')
  -     {
  -     pFile = r -> pLastReq -> Buf.pFile ;
  -     r -> bOptions |= optDisableChdir ;
  -     }
  -    else
  -     {
  -     if ((pFile = SetupFileData (r, sSourcefile, mtime, nFilesize, nFirstLine, 
pReqCfg)) == NULL)
  -            return NULL ;
  -     }
   
  -    if (r -> bSubReq && sOutputfile[0] == 1 && r -> pLastReq && !SvROK (pOut))
  -        {
  -        r -> sOutputfile      = r -> pLastReq -> sOutputfile ;
  -        r -> bAppendToMainReq = TRUE ;
  -        }
  -    else
  -        {
  -        if (sOutputfile[0] == 1)
  -            r -> sOutputfile      = "" ;
  -        else
  -            r -> sOutputfile      = sOutputfile ;
  -        r -> bAppendToMainReq = FALSE ;
  -        }
  +    /*
  +    int          nSessionMgnt ;
  +    char *  sSessionID ;  
  +    */
  +
  +    r -> nLogFileStartPos = GetLogFilePos (pApp) ;
  +
  +
  +    hv_clear (pThread -> pHeaderHash) ;
  +
  +    embperl_SetupFormData (r) ;
  +
  +    ppReq = r ;
  +    
  +    return ok ;
  +    }
       
  -    r -> bReqRunning     = 0 ;
  +/*---------------------------------------------------------------------------
  +* embperl_SetupComponent
  +*/
  +/*!
  +*
  +* \_en                                                                          
  +* setup data for component object
  +* \endif                                                                       
  +*
  +* \_de                                                                          
  +* Initialisiert das Component-Objekt
  +* \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
   
  -    r -> Buf.pFile = pFile ;
   
  -    r -> pOutData        = pOut ;
  -    r -> pInData         = pIn ;
   
  +int    embperl_SetupComponent  (/*in*/ tReq *                 r,
  +                                /*in*/ tComponentConfig *     pComponentCfg,
  +                                /*in*/ tComponentParam *      pComponentParam,
  +                                /*out*/tComponent * *         ppComponent)
  +                     
  +                     
  +    {
  +    tComponent * c = _malloc (r, sizeof (*c)) ;
  +
  +    memset (c, 0, sizeof (*c)) ;
  +
  +    c -> pLast      = r -> pComponent ;
  +    r -> pComponent = c ;
  +
  +
  +    memcpy (&c -> ComponentConfig, pComponentCfg,   sizeof (c -> ComponentConfig)) ;
  +    memcpy (&c -> ComponentParam,  pComponentParam, sizeof (c -> ComponentParam)) ;
       
  -    r -> CmdStack.State.nCmdType      = cmdNorm ;
  -    r -> CmdStack.State.bProcessCmds  = cmdAll ;
  -    r -> HtmlStack.State.nCmdType      = cmdNorm ;
  -    r -> HtmlStack.State.bProcessCmds  = cmdAll ;
  -    r -> nTabMode        = epTabRowDef | epTabColDef ;
  -    r -> nTabMaxRow      = 100 ;
  -    r -> nTabMaxCol      = 10 ;
  +    
  +    getcwd (c->sCWD, sizeof (c->sCWD)-1) ;
  +#ifdef WIN32
  +    c -> nCWDrive = _getdrive () ;
  +#endif
   
  +    if ((rc = embperl_GetSyntax (c -> ComponentConfig.sSyntax, r -> pTokenTable)) 
!= ok)
  +        return rc ; 
   
  -    r -> nEscMode = pReqCfg -> nEscMode ;
  +    c -> nInsideSub   = 0 ;
  +    c -> bExit        = 0 ;
  +    c -> nPhase          = phInit ;
  +    c -> bReqRunning     = 0 ;
       NewEscMode (r, NULL) ;
  -    r -> bEscModeSet = 0 ;
  +    c -> bEscModeSet = 0 ;
   
   
  -    if (r -> bOptions & optSafeNamespace)
  -     {
  -        r -> Buf.sEvalPackage = "main" ;
  -        r -> Buf.nEvalPackage = sizeof ("main") - 1 ;
  -        }
  -    else
  -     {
  -        r -> Buf.sEvalPackage = r -> Buf.pFile -> sCurrPackage ;
  -        r -> Buf.nEvalPackage = r -> Buf.pFile -> nCurrPackage ;
  -        }
  -    
  -    if (sImport && *sImport)
  +    if (c -> ComponentParam.nImport >= 0)
        {
  +        char code[40] ;
  +        SV * pSVImport ;
  +        char * sImport ;
  +
  +        sprintf (code, "caller(%d)", c -> ComponentParam.nImport>0?c -> 
ComponentParam.nImport:0) ; 
  +        /* there is no c api to the caller function, eval it... */
  +        pSVImport = eval_pv(code, 0) ;
  +        sImport = SvPV_nolen (pSVImport) ;
   
  -        if ((r -> pImportStash = gv_stashpv (sImport, 0)) == NULL)
  +        if ((c -> pImportStash = gv_stashpv (sImport, 0)) == NULL)
            {
            strncpy (r -> errdat1, sImport, sizeof (r -> errdat1) - 1);
            LogError (r, rcImportStashErr) ;
            }
  -     r -> bOptions |= optDisableHtmlScan ;
        }
       else
  -     r -> pImportStash = NULL ;
  +     c -> pImportStash = NULL ;
  +
  +    c -> nSourceline = c -> ComponentConfig.nFirstLine ;
  +    c -> pSourcelinePos = NULL ;    
  +    c -> pLineNoCurrPos = NULL ;    
   
  -    r -> Buf.nSourceline = r -> Buf.pFile -> nFirstLine ;
  -    r -> Buf.pSourcelinePos = NULL ;    
  -    r -> Buf.pLineNoCurrPos = NULL ;    
  +    c -> bStrict       = FALSE ;
   
  -    r -> bStrict       = FALSE ;
  +    *ppComponent = c ;
  +
  +    return ok ;
  +    }
  +
  +
  +
  +/*---------------------------------------------------------------------------
  +* embperl_LogStartReq
  +*/
  +/*!
  +*
  +* \_en                                                                          
  +* Log request startup, headers and environment
  +* \endif                                                                       
  +*
  +* \_de                                                                          
  +* Logged den Requeststart, HTTP-Header und Umgebungsvariablen
  +* \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +
  +static void embperl_LogStartReq (/*i/o*/ req * r)
  +
  +    {
   
  -    r -> errdat1 [0]  = '\0' ; /* Additional error information */
  -    r -> errdat2 [0]  = '\0' ;
  -    r -> lastwarn [0] = '\0' ; /* last warning */
       
  -    if (!r -> bSubReq)
  +    if (r -> pComponent -> ComponentConfig.bDebug)
           {
  -        r -> bError = FALSE ;
  -        av_clear (r -> pErrFill) ;
  -        av_clear (r -> pErrState) ;
  -        av_clear (r -> pErrArray) ;
  -        hv_clear (r -> pHeaderHash) ;
  -        r -> nLastErrFill  = AvFILL(r -> pErrArray) ;
  -        r -> bLastErrState = r -> bError ;
  -        r -> nLogFileStartPos = GetLogFilePos (r) ;
  +        lprintf (r, "[%d]REQ: Start Request at %s\n", r -> nPid, ctime 
(time(NULL))) ;
  +#ifdef DMALLOC
  +        dmalloc_message ("[%d]REQ: Start Request at %s\n", r -> nPid, ctime 
(time(NULL))) ; 
  +#endif        
           }
   
   
  -    if (r -> bDebug)
  +
  +#ifdef APACHE
  +    if (r -> pApacheReq && (r -> pComponent -> ComponentConfig.bDebug & 
dbgHeadersIn))
           {
  -        time_t t ;
  -        struct tm * tm ;
  -        time (&t) ;        
  -        tm =localtime (&t) ;
  -        if (!r -> bSubReq)
  -         lprintf (r, "[%d]REQ:  Embperl %s starting... %s\n", r -> nPid,  sVersion, 
asctime(tm)) ;
  -        r -> numEvals = 0  ;
  -        r -> numCacheHits = 0 ;
  +        int i;
  +        array_header *hdrs_arr;
  +        table_entry  *hdrs;
  +
  +        hdrs_arr = table_elts (r -> pApacheReq->headers_in);
  +        hdrs = (table_entry *)hdrs_arr->elts;
  +
  +        lprintf (r,  "[%d]HDR:  %d\n", r -> nPid, hdrs_arr->nelts) ; 
  +        for (i = 0; i < hdrs_arr->nelts; ++i)
  +         if (hdrs[i].key)
  +                lprintf (r,  "[%d]HDR:  %s=%s\n", r -> nPid, hdrs[i].key, 
hdrs[i].val) ; 
           }
  -    
  -    if (r -> bDebug)
  +#endif
  +    if (r -> pComponent -> ComponentConfig.bDebug & dbgEnv)
           {
  -        switch (r -> nIOType)
  +        SV *   psv ;
  +        HE *   pEntry ;
  +        char * pKey ;
  +        I32    l ;
  +        int  savewarn = dowarn ;
  +        dowarn = 0 ; /* no warnings here */
  +        
  +        hv_iterinit (r -> pThread -> pEnvHash) ;
  +        while ((pEntry = hv_iternext (r -> pThread -> pEnvHash)))
               {
  -            case epIOMod_Perl: sMode = "mod_perl"; break ;
  -            case epIOPerl:     sMode = "Offline"; break ;
  -            case epIOCGI:      sMode = "CGI-Script"; break ;
  -            case epIOProcess:  sMode = "Demon"; break ;
  -            default: sMode = "unknown" ; break ;
  +            pKey = hv_iterkey (pEntry, &l) ;
  +            psv  = hv_iterval (r -> pThread -> pEnvHash, pEntry) ;
  +
  +                lprintf (r,  "[%d]ENV:  %s=%s\n", r -> pThread -> nPid, pKey, SvPV 
(psv, na)) ; 
               }
  -        
  -        lprintf (r, "[%d]REQ:  %s  %s  ", r -> nPid, (r -> bOptions & 
optSafeNamespace)?"SafeNamespace":"No Safe Eval", (r -> bOptions & 
optOpcodeMask)?"OpcodeMask":"All Opcode allowed") ;
  -#ifdef EP2
  -     lprintf (r, " mode = %s (%d) %s recipe = %s\n", sMode, r -> nIOType, r -> 
bEP1Compat?"EP 1.x":"EP 2.x", r -> pReqCfg -> sRecipe) ;
  -#else
  -        lprintf (r, " mode = %s (%d)\n", sMode, r -> nIOType) ;
  -#endif
  -     lprintf (r, "[%d]REQ:  Package = %s\n", r -> nPid, r -> Buf.pFile -> 
sCurrPackage) ;
  -#ifdef DMALLOC
  -        dmalloc_message ("[%d]REQ:  Package = %s File = %s\n", r -> nPid, r -> 
Buf.pFile -> sCurrPackage, r -> Buf.pFile -> sSourcefile) ; 
  -#endif        
  +        dowarn = savewarn ;
           }
   
  -    return r ;
  +    }
  +
  +
  +/*---------------------------------------------------------------------------
  +* embperl_InitRequest
  +*/
  +/*!
  +*
  +* \_en                                                                          
  +* Initialize all necessary data structures to start a request like thread,
  +* application and request object
  +* \endif                                                                       
  +*
  +* \_de                                                                          
  +* Initialisiert alle n�tigen Datenstrukturen um den Request zu starten, wie
  +* Thread-, Applikcation und Request-Objekt.
  +* \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +
  +
  +
  +void    embperl_InitRequest (/*in*/ pTHX_
  +                             /*in*/ SV *             pApacheReqSV,
  +                             /*in*/ tReqConfig *     pReqCfg,
  +                             /*in*/ tApp *           pApp,
  +                             /*out*/tReq * *         ppReq)
  +
  +
  +    {
  +    tThreadData * pThread ;
  +    tApp  *       pApp ;
  +    tReq  *       r ;
  +
  +    /* get our thread object */
  +    if ((rc = embperl_SetupThread (aTHX_ &pThread)) != ok)
  +        return rc ;
  +
  +
  +    /* get the application object */
  +    if ((rc = embperl_SetupApp (aTHX_ pThread, pAppCfg, pHVParam, &pApp)) != ok)
  +        return rc ;
  +
  +
  +    /* and setup the request object */
  +    if ((rc = embperl_SetupRequest (aTHX_ pSVApache, pApp, pReqCfg, &r)) != ok)
  +        return rc ;
  +
  +   
  +    *ppReq = r ;
  +
  +    embperl_LogStartRequest (r) ;
       }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to