cvs commit: modperl-2.0/src/modules/perl modperl_env.c
dougm 2002/06/01 16:42:08 Modified:src/modules/perl modperl_env.c Log: pass the PATH and TZ environment variables at startup by default as 1.xx did Revision ChangesPath 1.25 +22 -0 modperl-2.0/src/modules/perl/modperl_env.c Index: modperl_env.c === RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_env.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -r1.24 -r1.25 --- modperl_env.c 30 May 2002 23:35:02 - 1.24 +++ modperl_env.c 1 Jun 2002 23:42:07 - 1.25 @@ -85,10 +85,32 @@ modperl_env_tie(mg_flags); } +/* list of environment variables to pass by default */ +static const char *MP_env_pass_defaults[] = { +"PATH", "TZ", NULL +}; + void modperl_env_configure_server(pTHX_ apr_pool_t *p, server_rec *s) { /* XXX: propagate scfg->SetEnv to environ */ MP_dSCFG(s); +int i = 0; + +for (i=0; MP_env_pass_defaults[i]; i++) { +const char *key = MP_env_pass_defaults[i]; +char *val; + +if (apr_table_get(scfg->SetEnv, key) || +apr_table_get(scfg->PassEnv, key)) +{ +continue; /* already configured */ +} + +if ((val = getenv(key))) { +apr_table_set(scfg->PassEnv, key, val); +} +} + modperl_env_table_populate(aTHX_ scfg->SetEnv); modperl_env_table_populate(aTHX_ scfg->PassEnv); }
cvs commit: modperl-2.0/src/modules/perl modperl_env.c
dougm 02/05/27 17:35:00 Modified:src/modules/perl modperl_env.c Log: untabify Revision ChangesPath 1.23 +1 -1 modperl-2.0/src/modules/perl/modperl_env.c Index: modperl_env.c === RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_env.c,v retrieving revision 1.22 retrieving revision 1.23 diff -u -r1.22 -r1.23 --- modperl_env.c 27 May 2002 20:19:40 - 1.22 +++ modperl_env.c 28 May 2002 00:35:00 - 1.23 @@ -76,7 +76,7 @@ elts = (apr_table_entry_t *)array->elts; for (i = 0; i < array->nelts; i++) { - if (!elts[i].key || !elts[i].val) { +if (!elts[i].key || !elts[i].val) { continue; } modperl_env_hv_store(aTHX_ hv, &elts[i]);
cvs commit: modperl-2.0/src/modules/perl modperl_env.c
dougm 02/05/27 13:19:40 Modified:src/modules/perl modperl_env.c Log: also need to feed PassEnv config into %ENV Revision ChangesPath 1.22 +1 -0 modperl-2.0/src/modules/perl/modperl_env.c Index: modperl_env.c === RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_env.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- modperl_env.c 27 May 2002 18:39:03 - 1.21 +++ modperl_env.c 27 May 2002 20:19:40 - 1.22 @@ -90,6 +90,7 @@ /* XXX: propagate scfg->SetEnv to environ */ MP_dSCFG(s); modperl_env_table_populate(aTHX_ scfg->SetEnv); +modperl_env_table_populate(aTHX_ scfg->PassEnv); } #define overlay_subprocess_env(r, tab) \
cvs commit: modperl-2.0/src/modules/perl modperl_env.c
dougm 02/05/27 11:39:03 Modified:src/modules/perl modperl_env.c Log: propagate scfg->SetEnv to %ENV Revision ChangesPath 1.21 +26 -18modperl-2.0/src/modules/perl/modperl_env.c Index: modperl_env.c === RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_env.c,v retrieving revision 1.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- modperl_env.c 19 Nov 2001 00:07:28 - 1.20 +++ modperl_env.c 27 May 2002 18:39:03 - 1.21 @@ -62,9 +62,34 @@ modperl_env_tie(mg_flags); } +static void modperl_env_table_populate(pTHX_ apr_table_t *table) +{ +HV *hv = ENVHV; +U32 mg_flags; +int i; +const apr_array_header_t *array; +apr_table_entry_t *elts; + +modperl_env_untie(mg_flags); + +array = apr_table_elts(table); +elts = (apr_table_entry_t *)array->elts; + +for (i = 0; i < array->nelts; i++) { + if (!elts[i].key || !elts[i].val) { +continue; +} +modperl_env_hv_store(aTHX_ hv, &elts[i]); +} + +modperl_env_tie(mg_flags); +} + void modperl_env_configure_server(pTHX_ apr_pool_t *p, server_rec *s) { /* XXX: propagate scfg->SetEnv to environ */ +MP_dSCFG(s); +modperl_env_table_populate(aTHX_ scfg->SetEnv); } #define overlay_subprocess_env(r, tab) \ @@ -106,11 +131,6 @@ void modperl_env_request_populate(pTHX_ request_rec *r) { MP_dRCFG; -HV *hv = ENVHV; -U32 mg_flags; -int i; -const apr_array_header_t *array; -apr_table_entry_t *elts; if (MpReqSETUP_ENV(rcfg)) { return; @@ -124,19 +144,7 @@ ap_add_common_vars(r); ap_add_cgi_vars(r); -modperl_env_untie(mg_flags); - -array = apr_table_elts(r->subprocess_env); -elts = (apr_table_entry_t *)array->elts; - -for (i = 0; i < array->nelts; i++) { - if (!elts[i].key || !elts[i].val) { -continue; -} -modperl_env_hv_store(aTHX_ hv, &elts[i]); -} - -modperl_env_tie(mg_flags); +modperl_env_table_populate(aTHX_ r->subprocess_env); #ifdef MP_COMPAT_1X modperl_env_default_populate(aTHX); /* reset GATEWAY_INTERFACE */
cvs commit: modperl-2.0/src/modules/perl modperl_env.c
dougm 01/06/26 22:35:55 Modified:src/modules/perl modperl_env.c Log: GATEWAY_INTERFACE needs to be set on each request, since ap_add_cgi_vars() will reset Revision ChangesPath 1.3 +23 -0 modperl-2.0/src/modules/perl/modperl_env.c Index: modperl_env.c === RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_env.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- modperl_env.c 2001/05/08 18:55:45 1.2 +++ modperl_env.c 2001/06/27 05:35:55 1.3 @@ -20,6 +20,22 @@ SvTAINTED_on(*svp); } +typedef struct { +const char *key; +I32 klen; +const char *val; +I32 vlen; +U32 hash; +} mp_env_ent_t; + +#define MP_ENV_ENT(k,v) \ +{ k, sizeof(k)-1, v, sizeof(v)-1, 0 } + +static const mp_env_ent_t mp_env_const_vars[] = { +MP_ENV_ENT("GATEWAY_INTERFACE", "CGI-Perl/1.1"), +{ NULL } +}; + static void mp_env_request_populate(pTHX_ request_rec *r) { HV *hv = GvHV(PL_envgv); @@ -37,6 +53,13 @@ mp_env_hv_store(aTHX_ hv, &elts[i]); } +for (i = 0; mp_env_const_vars[i].key; i++) { +const mp_env_ent_t *ent = &mp_env_const_vars[i]; + +hv_store(hv, ent->key, ent->klen, + newSVpvn(ent->val, ent->vlen), ent->hash); +} + modperl_env_tie(mg_flags); }
cvs commit: modperl-2.0/src/modules/perl modperl_env.c modperl_env.h
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 ChangesPath 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 */