stas 2002/12/12 02:05:08
Modified: src/modules/perl mod_perl.c mod_perl.h modperl_config.c
xs/tables/current/ModPerl FunctionTable.pm
Log:
make mod_perl work with vhosts when the server is started prior to
post_config():
- call modperl_init_globals as early as possible, because the main server
record is needed during the configuration parsing, for perlloadmodule
and vhosts
- also make sure that we are using a real base_server, when dealing
with modperl_init, and if not retrieve it from the global record
Revision Changes Path
1.145 +19 -3 modperl-2.0/src/modules/perl/mod_perl.c
Index: mod_perl.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/mod_perl.c,v
retrieving revision 1.144
retrieving revision 1.145
diff -u -r1.144 -r1.145
--- mod_perl.c 23 Nov 2002 22:56:21 -0000 1.144
+++ mod_perl.c 12 Dec 2002 10:05:07 -0000 1.145
@@ -279,9 +279,25 @@
void modperl_init(server_rec *base_server, apr_pool_t *p)
{
server_rec *s;
- modperl_config_srv_t *base_scfg = modperl_config_srv_get(base_server);
+ modperl_config_srv_t *base_scfg;
PerlInterpreter *base_perl;
+ /* get the real base server when invoked from vhost.
+ *
+ * without doing it segfaults when the first PerlLoadModule
+ * appears inside vhost, e.g.:
+ * <VirtualHost _default_:8535>
+ * PerlLoadModule Foo
+ * </VirtualHost>
+ * an arrangement which is unfortunately hard to automate with our
+ * test suite, but see test TestDirective::perlloadmodule6
+ */
+ if (base_server->is_virtual) {
+ base_server = modperl_global_get_server_rec();
+ }
+
+ base_scfg = modperl_config_srv_get(base_server);
+
MP_TRACE_d_do(MpSrv_dump_flags(base_scfg,
base_server->server_hostname));
@@ -359,7 +375,7 @@
}
#endif /* USE_ITHREADS */
-static void modperl_init_globals(server_rec *s, apr_pool_t *pconf)
+void modperl_init_globals(server_rec *s, apr_pool_t *pconf)
{
int threaded_mpm;
ap_mpm_query(AP_MPMQ_IS_THREADED, &threaded_mpm);
@@ -428,7 +444,7 @@
modperl_sys_init();
apr_pool_cleanup_register(pconf, NULL,
modperl_sys_term, apr_pool_cleanup_null);
- modperl_init_globals(s, pconf);
+
modperl_init(s, pconf);
return OK;
1.55 +1 -0 modperl-2.0/src/modules/perl/mod_perl.h
Index: mod_perl.h
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/mod_perl.h,v
retrieving revision 1.54
retrieving revision 1.55
diff -u -r1.54 -r1.55
--- mod_perl.h 15 Sep 2002 23:30:06 -0000 1.54
+++ mod_perl.h 12 Dec 2002 10:05:08 -0000 1.55
@@ -74,6 +74,7 @@
int modperl_init_vhost(server_rec *s, apr_pool_t *p,
server_rec *base_server);
void modperl_init(server_rec *s, apr_pool_t *p);
+void modperl_init_globals(server_rec *s, apr_pool_t *pconf);
int modperl_run(apr_pool_t *p, server_rec *s);
int modperl_is_running(void);
int modperl_hook_init(apr_pool_t *pconf, apr_pool_t *plog,
1.60 +12 -3 modperl-2.0/src/modules/perl/modperl_config.c
Index: modperl_config.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_config.c,v
retrieving revision 1.59
retrieving revision 1.60
diff -u -r1.59 -r1.60
--- modperl_config.c 9 Dec 2002 07:28:02 -0000 1.59
+++ modperl_config.c 12 Dec 2002 10:05:08 -0000 1.60
@@ -164,10 +164,19 @@
ap_mpm_query(AP_MPMQ_IS_THREADED, &scfg->threaded_mpm);
- /* give a chance to MOD_PERL_TRACE env var to set PerlTrace. This
- * place is the earliest point in mod_perl configuration
- * parsing, when we have the server object */
if (!s->is_virtual) {
+
+ /* Must store the global server record as early as possible,
+ * because if mod_perl happens to be started from within a
+ * vhost (e.g., PerlLoadModule) the base server record won't
+ * be availalbe to vhost and things will blow up
+ */
+ modperl_init_globals(s, p);
+
+ /* give a chance to MOD_PERL_TRACE env var to set
+ * PerlTrace. This place is the earliest point in mod_perl
+ * configuration parsing, when we have the server object
+ */
modperl_trace_level_set(s, NULL);
}
1.89 +14 -0 modperl-2.0/xs/tables/current/ModPerl/FunctionTable.pm
Index: FunctionTable.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/xs/tables/current/ModPerl/FunctionTable.pm,v
retrieving revision 1.88
retrieving revision 1.89
diff -u -r1.88 -r1.89
--- FunctionTable.pm 8 Dec 2002 01:57:49 -0000 1.88
+++ FunctionTable.pm 12 Dec 2002 10:05:08 -0000 1.89
@@ -2281,6 +2281,20 @@
]
},
{
+ 'return_type' => 'void',
+ 'name' => 'modperl_init_globals',
+ 'args' => [
+ {
+ 'type' => 'server_rec *',
+ 'name' => 's'
+ },
+ {
+ 'type' => 'apr_pool_t *',
+ 'name' => 'pconf'
+ }
+ ]
+ },
+ {
'return_type' => 'apr_status_t',
'name' => 'modperl_input_filter_handler',
'args' => [