perl-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Pratik <pratikn...@gmail.com>
Subject Re: [mp2 bug] Perl*Env issues
Date Wed, 22 Dec 2004 17:41:23 GMT
I have written a small patch to solve this problem. Please have a look
at it. If it looks good, I will write tests and submit the patch.

The scheme is :

1. Populate %ENV before all <Perl>..</Perl>, PerlRequire and PerlModule.
2. After every <Perl>..</Perl>, PerlRequire and PerlModule, sync
server tables ( scfg->SetEnv & scfg->PassEnv ) with %ENV.

Thanks,
Pratik

diff -ru mp2src/mod_perl-2.0.0-RC1/src/modules/perl/modperl_cmd.c
patches/mymp2/mod_perl-2.0.0-RC1/src/modules/perl/modperl_cmd.c
--- mp2src/mod_perl-2.0.0-RC1/src/modules/perl/modperl_cmd.c	2004-12-12
13:49:11.000000000 -0800
+++ patches/mymp2/mod_perl-2.0.0-RC1/src/modules/perl/modperl_cmd.c	2004-12-22
09:12:22.000000000 -0800
@@ -219,9 +219,11 @@
         MP_TRACE_d(MP_FUNC, "load PerlModule %s\n", arg);
         
         MP_PERL_OVERRIDE_CONTEXT;
+	 modperl_env_configure_server(aTHX_ parms->pool, parms->server);
         if (!modperl_require_module(aTHX_ arg, FALSE)) {
             error = SvPVX(ERRSV);
         }
+	 modperl_env_sync_server(aTHX_ parms->pool, parms->server);
         MP_PERL_RESTORE_CONTEXT;
 
         return error;
@@ -250,11 +252,13 @@
         char *error = NULL;
 
         MP_TRACE_d(MP_FUNC, "load PerlRequire %s\n", arg);
+	 modperl_env_configure_server(aTHX_ parms->pool, parms->server);
 
         MP_PERL_OVERRIDE_CONTEXT;
         if (!modperl_require_file(aTHX_ arg, FALSE)) {
             error = SvPVX(ERRSV);
         }
+	 modperl_env_sync_server(aTHX_ parms->pool, parms->server);
         MP_PERL_RESTORE_CONTEXT;
 
         return error;
@@ -544,7 +548,9 @@
         ENTER;SAVETMPS;
         save_scalar(gv); /* local $0 */
         sv_setpv_mg(GvSV(gv), directive->filename);
+	 modperl_env_configure_server(aTHX_ p, s);
         eval_pv(arg, FALSE);
+	 modperl_env_sync_server(aTHX_ p, s);
         FREETMPS;LEAVE;
     }
     
@@ -640,6 +646,7 @@
     if ((errmsg = modperl_cmd_modules(parms, mconfig, arg))) {
         return errmsg;
     }
+    modperl_env_sync_server(aTHX_ parms->pool, parms->server);
 
     return NULL;
 }
diff -ru mp2src/mod_perl-2.0.0-RC1/src/modules/perl/modperl_env.c
patches/mymp2/mod_perl-2.0.0-RC1/src/modules/perl/modperl_env.c
--- mp2src/mod_perl-2.0.0-RC1/src/modules/perl/modperl_env.c	2004-12-12
13:49:11.000000000 -0800
+++ patches/mymp2/mod_perl-2.0.0-RC1/src/modules/perl/modperl_env.c	2004-12-22
09:12:47.000000000 -0800
@@ -153,6 +153,43 @@
     "PATH", "TZ", NULL
 };
 
+static void modperl_env_sync_table(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++) {
+        char *val;
+        
+        if (!elts[i].key || !elts[i].val) {
+            continue;
+        }
+	 val = getenv(elts[i].key);
+        apr_table_set(table, elts[i].key, val);
+    }    
+
+    modperl_env_tie(mg_flags);
+}
+
+void modperl_env_sync_server(pTHX_ apr_pool_t *p, server_rec *s)
+{
+    MP_dSCFG(s);
+
+    /* Make per-server PerlSetEnv and PerlPassEnv in sync with %ENV
+     * at config time
+     */
+    modperl_env_sync_table(aTHX_ scfg->SetEnv);
+    modperl_env_sync_table(aTHX_ scfg->PassEnv);
+}
+
 void modperl_env_configure_server(pTHX_ apr_pool_t *p, server_rec *s)
 {
     MP_dSCFG(s);
diff -ru mp2src/mod_perl-2.0.0-RC1/src/modules/perl/modperl_env.h
patches/mymp2/mod_perl-2.0.0-RC1/src/modules/perl/modperl_env.h
--- mp2src/mod_perl-2.0.0-RC1/src/modules/perl/modperl_env.h	2004-12-12
13:49:11.000000000 -0800
+++ patches/mymp2/mod_perl-2.0.0-RC1/src/modules/perl/modperl_env.h	2004-12-22
09:12:34.000000000 -0800
@@ -33,6 +33,8 @@
 
 void modperl_env_clear(pTHX);
 
+void modperl_env_sync_server(pTHX_ apr_pool_t *p, server_rec *s);
+
 void modperl_env_configure_server(pTHX_ apr_pool_t *p, server_rec *s);
 
 void modperl_env_configure_request_srv(pTHX_ request_rec *r);

-- 
http://pratik.syslock.org

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@perl.apache.org
For additional commands, e-mail: dev-help@perl.apache.org


Mime
View raw message