|
Line 0
Link Here
|
|
|
1 |
--- src/modules/perl/modperl_env.c.orig 2015-06-18 22:13:54.000000000 +0200 |
| 2 |
+++ src/modules/perl/modperl_env.c 2016-05-11 21:06:13.364008000 +0200 |
| 3 |
@@ -121,6 +121,7 @@ |
| 4 |
const apr_array_header_t *array; |
| 5 |
apr_table_entry_t *elts; |
| 6 |
|
| 7 |
+ modperl_env_init(aTHX); |
| 8 |
modperl_env_untie(mg_flags); |
| 9 |
|
| 10 |
array = apr_table_elts(table); |
| 11 |
@@ -434,11 +435,8 @@ |
| 12 |
/* to store the original virtual tables |
| 13 |
* these are global, not per-interpreter |
| 14 |
*/ |
| 15 |
-static MGVTBL MP_PERL_vtbl_env; |
| 16 |
-static MGVTBL MP_PERL_vtbl_envelem; |
| 17 |
- |
| 18 |
#define MP_PL_vtbl_call(name, meth) \ |
| 19 |
- MP_PERL_vtbl_##name.svt_##meth(aTHX_ sv, mg) |
| 20 |
+ PL_vtbl_##name.svt_##meth(aTHX_ sv, mg) |
| 21 |
|
| 22 |
#define MP_dENV_KEY \ |
| 23 |
STRLEN klen; \ |
| 24 |
@@ -612,16 +610,22 @@ |
| 25 |
} |
| 26 |
#endif |
| 27 |
|
| 28 |
+static int modperl_env_magic_copy(pTHX_ SV *sv, MAGIC *mg, SV *nsv, const char *name, I32 namlen); |
| 29 |
+static int modperl_env_magic_local_all(pTHX_ SV *nsv, MAGIC *mg); |
| 30 |
+ |
| 31 |
/* override %ENV virtual tables with our own */ |
| 32 |
static MGVTBL MP_vtbl_env = { |
| 33 |
0, |
| 34 |
modperl_env_magic_set_all, |
| 35 |
0, |
| 36 |
modperl_env_magic_clear_all, |
| 37 |
- 0 |
| 38 |
+ 0, |
| 39 |
+ modperl_env_magic_copy, |
| 40 |
+ 0, |
| 41 |
+ modperl_env_magic_local_all |
| 42 |
}; |
| 43 |
|
| 44 |
-static MGVTBL MP_vtbl_envelem = { |
| 45 |
+MGVTBL MP_vtbl_envelem = { |
| 46 |
0, |
| 47 |
modperl_env_magic_set, |
| 48 |
0, |
| 49 |
@@ -629,22 +633,70 @@ |
| 50 |
0 |
| 51 |
}; |
| 52 |
|
| 53 |
-void modperl_env_init(void) |
| 54 |
+static int modperl_env_magic_copy(pTHX_ SV *sv, MAGIC *mg, SV *nsv, const char *name, I32 namlen) |
| 55 |
{ |
| 56 |
/* save originals */ |
| 57 |
- StructCopy(&PL_vtbl_env, &MP_PERL_vtbl_env, MGVTBL); |
| 58 |
- StructCopy(&PL_vtbl_envelem, &MP_PERL_vtbl_envelem, MGVTBL); |
| 59 |
- |
| 60 |
- /* replace with our versions */ |
| 61 |
- StructCopy(&MP_vtbl_env, &PL_vtbl_env, MGVTBL); |
| 62 |
- StructCopy(&MP_vtbl_envelem, &PL_vtbl_envelem, MGVTBL); |
| 63 |
-} |
| 64 |
+ MP_TRACE_e(MP_FUNC, "setting up %%ENV element magic"); |
| 65 |
+ sv_magicext(nsv, mg->mg_obj, |
| 66 |
+ toLOWER(mg->mg_type), &MP_vtbl_envelem, name, namlen); |
| 67 |
+ |
| 68 |
+ return 1; |
| 69 |
+} |
| 70 |
+ |
| 71 |
+static int modperl_env_magic_local_all(pTHX_ SV *nsv, MAGIC *mg) |
| 72 |
+{ |
| 73 |
+ MAGIC *nmg; |
| 74 |
+ MP_TRACE_e(MP_FUNC, "localizing %%ENV"); |
| 75 |
+ nmg = sv_magicext(nsv, mg->mg_obj, |
| 76 |
+ mg->mg_type, &MP_vtbl_env, NULL, 0); |
| 77 |
+ nmg->mg_ptr = mg->mg_ptr; |
| 78 |
+ nmg->mg_flags |= MGf_COPY; |
| 79 |
+ nmg->mg_flags |= MGf_LOCAL; |
| 80 |
+ |
| 81 |
+ return 1; |
| 82 |
+} |
| 83 |
+ |
| 84 |
+void modperl_env_init(pTHX) |
| 85 |
+{ |
| 86 |
+ MAGIC *mg; |
| 87 |
+ /* Remove existing 'E' magic from %ENV */ |
| 88 |
+ /* TODO: Should check there is not multiple 'E' magic! */ |
| 89 |
+ if (!my_perl) |
| 90 |
+ return; |
| 91 |
+ if (!PL_envgv) |
| 92 |
+ return; |
| 93 |
+ if (!SvRMAGICAL(ENVHV)) |
| 94 |
+ return; |
| 95 |
+ mg = mg_find((const SV *)ENVHV, PERL_MAGIC_env); |
| 96 |
+ if (!mg) |
| 97 |
+ return; |
| 98 |
+ if (mg->mg_virtual == &MP_vtbl_env) |
| 99 |
+ return; |
| 100 |
+ MP_TRACE_d(MP_FUNC, "ptr: %x obj: %x flags:%x", mg->mg_ptr, mg->mg_obj, mg->mg_flags); |
| 101 |
+ mg_free_type((SV*)ENVHV, PERL_MAGIC_env); |
| 102 |
+ |
| 103 |
+ /* Add our version instead */ |
| 104 |
+ mg = sv_magicext((SV*)ENVHV, (SV*)NULL, PERL_MAGIC_env, &MP_vtbl_env, (char*)NULL, 0); |
| 105 |
+ mg->mg_flags |= MGf_COPY; |
| 106 |
+ mg->mg_flags |= MGf_LOCAL; |
| 107 |
+} |
| 108 |
+ |
| 109 |
+void modperl_env_unload(pTHX) |
| 110 |
+{ |
| 111 |
+ /* Remove our 'E' magic from %ENV */ |
| 112 |
+ /* TODO: Should check there is not multiple 'E' magic! */ |
| 113 |
+ if (!my_perl) |
| 114 |
+ return; |
| 115 |
+ if (!PL_envgv) |
| 116 |
+ return; |
| 117 |
+ if (!SvRMAGICAL(ENVHV)) |
| 118 |
+ return; |
| 119 |
+ if (!mg_find((const SV *)ENVHV, PERL_MAGIC_env)) |
| 120 |
+ return; |
| 121 |
+ mg_free_type((SV*)ENVHV, PERL_MAGIC_env); |
| 122 |
|
| 123 |
-void modperl_env_unload(void) |
| 124 |
-{ |
| 125 |
- /* restore originals */ |
| 126 |
- StructCopy(&MP_PERL_vtbl_env, &PL_vtbl_env, MGVTBL); |
| 127 |
- StructCopy(&MP_PERL_vtbl_envelem, &PL_vtbl_envelem, MGVTBL); |
| 128 |
+ /* Restore original */ |
| 129 |
+ sv_magicext((SV*)ENVHV, (SV*)NULL, PERL_MAGIC_env, &PL_vtbl_env, (char*)NULL, 0); |
| 130 |
} |
| 131 |
|
| 132 |
/* |