dougm       01/05/07 21:10:42

  Added:       src/modules/perl modperl_env.c modperl_env.h
  Log:
  add modperl_env module to manage %ENV
  
  Revision  Changes    Path
  1.1                  modperl-2.0/src/modules/perl/modperl_env.c
  
  Index: modperl_env.c
  ===================================================================
  #include "mod_perl.h"
  #include "util_script.h"
  
  #define EnvMgObj SvMAGIC((SV*)GvHV(PL_envgv))->mg_ptr
  
  static MP_INLINE
  void mp_env_hv_store(pTHX_ HV *hv, apr_table_entry_t *elt)
  {
      I32 klen = strlen(elt->key);
      SV **svp = hv_fetch(hv, elt->key, klen, FALSE);
  
      if (svp) {
          sv_setpv(*svp, elt->val);
      }
      else {
          SV *sv = newSVpv(elt->val, 0);
          hv_store(hv, elt->key, klen, sv, FALSE);
          svp = &sv;
      }
  
      SvTAINTED_on(*svp);
  }
  
  static void mp_env_request_populate(pTHX_ request_rec *r)
  {
      HV *hv = GvHV(PL_envgv);
      int i;
      U32 mg_flags;
      apr_array_header_t *array = apr_table_elts(r->subprocess_env);
      apr_table_entry_t *elts = (apr_table_entry_t *)array->elts;
  
      modperl_env_untie(mg_flags);
  
      for (i = 0; i < array->nelts; i++) {
        if (!elts[i].key || !elts[i].val) {
              continue;
          }
          mp_env_hv_store(aTHX_ hv, &elts[i]);
      }    
  
      modperl_env_tie(mg_flags);
  }
  
  static int mp_env_request_set(pTHX_ SV *sv, MAGIC *mg)
  {
      const char *key, *val;
      STRLEN klen, vlen;
      request_rec *r = (request_rec *)EnvMgObj;
  
      key = (const char *)MgPV(mg,klen);
      val = (const char *)SvPV(sv,vlen);
  
      apr_table_set(r->subprocess_env, key, val);
  
      /*return magic_setenv(sv, mg);*/
  
      return 0;
  }
  
  #ifdef MP_PERL_HV_GMAGICAL_AWARE
  static int mp_env_request_get(pTHX_ SV *sv, MAGIC *mg)
  {
      const char *key, *val;
      STRLEN klen;
      request_rec *r = (request_rec *)EnvMgObj;
  
      key = (const char *)MgPV(mg,klen);
  
      if ((val = apr_table_get(r->subprocess_env, key))) {
          sv_setpv(sv, val);
      }
      else {
          sv_setsv(sv, &PL_sv_undef);
      }
  
      return 0;
  }
  #endif
  
  void modperl_env_request_tie(pTHX_ request_rec *r)
  {
      ap_add_common_vars(r);
      ap_add_cgi_vars(r);
  
      /* XXX: should be options #ifdef MP_PERL_HV_GMAGICAL_AWARE */
      mp_env_request_populate(aTHX_ r);
  
      EnvMgObj = (char *)r;
  
      PL_vtbl_envelem.svt_set = MEMBER_TO_FPTR(mp_env_request_set);
  #ifdef MP_PERL_HV_GMAGICAL_AWARE
      SvGMAGICAL_on((SV*)GvHV(PL_envgv));
      PL_vtbl_envelem.svt_get = MEMBER_TO_FPTR(mp_env_request_get);
  #endif
  }
  
  void modperl_env_request_untie(pTHX_ request_rec *r)
  {
      PL_vtbl_envelem.svt_set = MEMBER_TO_FPTR(Perl_magic_setenv);
  #ifdef MP_PERL_HV_GMAGICAL_AWARE
      SvGMAGICAL_off((SV*)GvHV(PL_envgv));
      PL_vtbl_envelem.svt_get = 0;
  #endif
  }
  
  
  
  1.1                  modperl-2.0/src/modules/perl/modperl_env.h
  
  Index: modperl_env.h
  ===================================================================
  #ifndef MODPERL_ENV_H
  #define MODPERL_ENV_H
  
  #define modperl_env_untie(mg_flags) \
      mg_flags = SvMAGICAL((SV*)GvHV(PL_envgv)); \
      SvMAGICAL_off((SV*)GvHV(PL_envgv))
  
  #define modperl_env_tie(mg_flags) \
      SvFLAGS((SV*)GvHV(PL_envgv)) |= mg_flags
  
  void modperl_env_request_tie(pTHX_ request_rec *r);
  void modperl_env_request_untie(pTHX_ request_rec *r);
  
  #endif /* MODPERL_ENV_H */
  
  
  

Reply via email to