dougm 00/06/13 14:05:55
Modified: lib/ModPerl Code.pm
pod modperl_dev.pod
src/modules/perl mod_perl.c mod_perl.h modperl_callback.c
modperl_config.c modperl_config.h modperl_types.h
Log:
first cut of PerlOptions directive
Revision Changes Path
1.30 +46 -15 modperl-2.0/lib/ModPerl/Code.pm
Index: Code.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/lib/ModPerl/Code.pm,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -r1.29 -r1.30
--- Code.pm 2000/06/12 19:37:25 1.29
+++ Code.pm 2000/06/13 21:05:35 1.30
@@ -81,15 +81,17 @@
$directive_proto{$k}->{ret} = 'const char *';
}
+#XXX: allow disabling of PerDir hooks on a PerDir basis
+my @hook_flags = (map { canon_uc($_) } keys %hooks);
my %flags = (
- Srv => [qw(NONE PERL_TAINT_CHECK PERL_WARN FRESH_RESTART
- PERL_CLONE PERL_ALLOC PERL_OFF UNSET)],
- Dir => [qw(NONE INCPUSH SENDHDR SENTHDR ENV CLEANUP RCLEANUP)],
+ Srv => [qw(NONE CLONE PARENT ENABLED), @hook_flags, 'UNSET'],
+ Dir => [qw(NONE SEND_HEADER SETUP_ENV UNSET)],
Interp => [qw(NONE IN_USE PUTBACK CLONED BASE)],
Handler => [qw(NONE PARSED METHOD OBJECT ANON)],
);
-my %flags_lookup = map { $_,1 } qw(Srv);
+my %flags_lookup = map { $_,1 } qw(Srv Dir);
+my %flags_options = map { $_,1 } qw(Srv);
sub new {
my $class = shift;
@@ -201,10 +203,11 @@
my $i = 0;
for my $h (@$handlers) {
+ my $h_name = join $h, qw(Perl Handler);
my $name = canon_func('cmd', $h, 'handlers');
my $cmd_name = canon_define('cmd', $h, 'entry');
my $protostr = canon_proto($prototype, $name);
-
+ my $flag = 'MpSrv' . canon_uc($h);
my $ix = $self->{handler_index}->{$class}->[$i++];
my $av = "$prototype->{cfg}->{name}->handlers[$ix]";
@@ -215,7 +218,7 @@
print $h_fh <<EOF;
#define $cmd_name \\
-{"Perl${h}Handler", $name, NULL, \\
+{"$h_name", $name, NULL, \\
$prototype->{scope}, ITERATE, "Subroutine name"}
EOF
@@ -223,11 +226,16 @@
$protostr
{
$prototype->{cfg}->{get};
- if (MpSrvPERL_OFF(scfg)) {
+ if (!MpSrvENABLED(scfg)) {
return ap_pstrcat(parms->pool,
"Perl is disabled for server ",
parms->server->server_hostname, NULL);
}
+ if (!$flag(scfg)) {
+ return ap_pstrcat(parms->pool,
+ "$h_name is disabled for server ",
+ parms->server->server_hostname, NULL);
+ }
MP_TRACE_d(MP_FUNC, "push \@%s, %s\\n", parms->cmd->name, arg);
return modperl_cmd_push_handlers(&($av), arg, parms->pool);
}
@@ -243,24 +251,34 @@
sub generate_flags {
my($self, $h_fh, $c_fh) = @_;
+ my $n = 1;
+
while (my($class, $opts) = each %{ $self->{flags} }) {
my $i = 0;
my @lookup = ();
my $lookup_proto = "";
+ my @dumper;
if ($flags_lookup{$class}) {
$lookup_proto = join canon_func('flags', 'lookup', $class),
- 'int ', '(const char *str)';
+ 'U32 ', '(const char *str)';
push @lookup, "$lookup_proto {";
}
+
+ my $flags = join $class, qw(Mp FLAGS);
- print $h_fh "\n#define Mp${class}FLAGS(p) p->flags\n";
+ print $h_fh "\n#define $flags(p) ",
+ ($flags_options{$class} ? '(p)->flags->opts' : '(p)->flags'), "\n";
+
$class = "Mp$class";
+ print $h_fh "\n#define ${class}Type $n\n";
+ $n++;
for my $f (@$opts) {
my $flag = "${class}_f_$f";
my $cmd = $class . $f;
+ my $name = canon_name($f);
+
if (@lookup) {
- my $name = canon_name($f);
push @lookup, qq( if (strEQ(str, "$name")) return $flag;);
}
@@ -268,19 +286,32 @@
/* $f */
#define $flag $i
-#define $cmd(p) ((p)->flags & $flag)
-#define ${cmd}_On(p) ((p)->flags |= $flag)
-#define ${cmd}_Off(p) ((p)->flags &= ~$flag)
+#define $cmd(p) ($flags(p) & $flag)
+#define ${cmd}_On(p) ($flags(p) |= $flag)
+#define ${cmd}_Off(p) ($flags(p) &= ~$flag)
EOF
+ push @dumper,
+ qq{fprintf(stderr, " $name %s\\n", \\
+ ($flags(p) & $i) ? "On " : "Off");};
+
$i += $i || 1;
}
if (@lookup) {
- print $c_fh join "\n", @lookup, " return -1;\n}\n";
+ print $c_fh join "\n", @lookup, " return 0;\n}\n";
print $h_fh "$lookup_proto;\n";
}
+
+ shift @dumper; #NONE
+ print $h_fh join ' \\'."\n",
+ "#define ${class}_dump_flags(p, str)",
+ qq{fprintf(stderr, "$class flags dump (%s):\\n", str);},
+ @dumper;
}
+ print $h_fh "\n#define MpSrvHOOKS_ALL_On(p) MpSrvFLAGS(p) |= (",
+ (join '|', map { 'MpSrv_f_' . $_ } @hook_flags), ")\n";
+
();
}
@@ -408,7 +439,7 @@
generate_trace => {h => 'modperl_trace.h'},
);
-my @c_src_names = qw(interp tipool log config callback gtop);
+my @c_src_names = qw(interp tipool log config options callback gtop);
my @g_c_names = map { "modperl_$_" } qw(hooks directives flags xsinit);
my @c_names = ('mod_perl', (map "modperl_$_", @c_src_names));
sub c_files { [map { "$_.c" } @c_names, @g_c_names] }
1.3 +58 -0 modperl-2.0/pod/modperl_dev.pod
Index: modperl_dev.pod
===================================================================
RCS file: /home/cvs/modperl-2.0/pod/modperl_dev.pod,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- modperl_dev.pod 2000/06/09 07:58:25 1.2
+++ modperl_dev.pod 2000/06/13 21:05:36 1.3
@@ -176,3 +176,61 @@
Max number of requests per Perl interpreters
=back
+
+=head2 PerlOptions Directive
+
+Enable/Disable Options. Options include:
+
+=over 4
+
+=item Parent
+
+Create a new parent Perl interpreter for the given VirtualHost
+(implies Clone).
+
+=item Clone
+
+Give the VirtualHost its own interpreter pool.
+
+=item Enabled
+
+On by default, used to disable mod_perl for a given VirtualHost.
+
+=item Perl*Handler
+
+Disable Perl*Handlers, all compiled in handlers are enabled by default.
+
+=back
+
+Examples:
+
+ #disable mod_perl for this host
+ <VirtualHost ...>
+ PerlOptions -Enable
+ </VirtualHost>
+
+ #create 2 Parent Perls,
+ #each pointing to a different developer library tree
+ <VirtualHost ...>
+ ServerName dev1
+ PerlOptions +Parent
+ PerlSwitches -Mblib=/home/dev1/lib/perl
+ </VirtualHost>
+
+ <VirtualHost ...>
+ ServerName dev2
+ PerlOptions +Parent
+ PerlSwitches -Mblib=/home/dev2/lib/perl
+ </VirtualHost>
+
+ #give VirtualHost its own interpreter pool
+ <VirtualHost ...>
+ PerlOptions +Clone
+ PerlInterpStart 2
+ PerlInterpMax 2
+ </VirtualHost>
+
+ #disable handlers
+ <VirtualHost ...>
+ PerlOptions -Authen -Authz -Access
+ </VirtualHost>
\ No newline at end of file
1.18 +10 -20 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.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- mod_perl.c 2000/06/12 19:37:26 1.17
+++ mod_perl.c 2000/06/13 21:05:39 1.18
@@ -50,7 +50,10 @@
ap_get_module_config(base_server->module_config, &perl_module);
PerlInterpreter *base_perl;
- if (MpSrvPERL_OFF(base_scfg)) {
+ MP_TRACE_d_do(MpSrv_dump_flags(base_scfg,
+ base_server->server_hostname));
+
+ if (!MpSrvENABLED(base_scfg)) {
/* how silly */
return;
}
@@ -63,30 +66,16 @@
MP_dSCFG(s);
PerlInterpreter *perl = base_perl;
- if (1) {
- /* XXX: using getenv() just for testing here */
- char *do_alloc = getenv("MP_SRV_ALLOC_TEST");
- char *do_clone = getenv("MP_SRV_CLONE_TEST");
- char *do_off = getenv("MP_SRV_OFF_TEST");
- if (do_alloc && strEQ(do_alloc, s->server_hostname)) {
- MpSrvPERL_ALLOC_On(scfg);
- }
- if (do_clone && strEQ(do_clone, s->server_hostname)) {
- MpSrvPERL_CLONE_On(scfg);
- }
- if (do_off && strEQ(do_off, s->server_hostname)) {
- MpSrvPERL_OFF_On(scfg);
- }
- }
+ MP_TRACE_d_do(MpSrv_dump_flags(scfg, s->server_hostname));
/* if alloc flags is On, virtual host gets its own parent perl */
- if (MpSrvPERL_ALLOC(scfg)) {
+ if (MpSrvPARENT(scfg)) {
perl = modperl_startup(s, p);
MP_TRACE_i(MP_FUNC, "modperl_startup() server=%s\n",
s->server_hostname);
}
- if (MpSrvPERL_OFF(scfg)) {
+ if (!MpSrvENABLED(scfg)) {
scfg->mip = NULL;
continue;
}
@@ -95,14 +84,14 @@
/* if alloc flags is On or clone flag is On,
* virtual host gets its own mip
*/
- if (MpSrvPERL_ALLOC(scfg) || MpSrvPERL_CLONE(scfg)) {
+ if (MpSrvPARENT(scfg) || MpSrvCLONE(scfg)) {
MP_TRACE_i(MP_FUNC, "modperl_interp_init() server=%s\n",
s->server_hostname);
modperl_interp_init(s, p, perl);
}
/* if we allocated a parent perl, mark it to be destroyed */
- if (MpSrvPERL_ALLOC(scfg)) {
+ if (MpSrvPARENT(scfg)) {
MpInterpBASE_On(scfg->mip->parent);
}
@@ -137,6 +126,7 @@
static command_rec modperl_cmds[] = {
MP_SRV_CMD_ITERATE("PerlSwitches", switches, "Perl Switches"),
+ MP_SRV_CMD_ITERATE("PerlOptions", options, "Perl Options"),
#ifdef MP_TRACE
MP_SRV_CMD_TAKE1("PerlTrace", trace, "Trace level"),
#endif
1.15 +1 -1 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.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- mod_perl.h 2000/05/23 20:54:44 1.14
+++ mod_perl.h 2000/06/13 21:05:39 1.15
@@ -37,7 +37,7 @@
#include "modperl_tipool.h"
#include "modperl_interp.h"
#include "modperl_log.h"
-
+#include "modperl_options.h"
#include "modperl_directives.h"
void modperl_init(server_rec *s, ap_pool_t *p);
1.12 +1 -1 modperl-2.0/src/modules/perl/modperl_callback.c
Index: modperl_callback.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_callback.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- modperl_callback.c 2000/06/12 19:37:27 1.11
+++ modperl_callback.c 2000/06/13 21:05:39 1.12
@@ -316,7 +316,7 @@
int i, status = OK;
const char *desc = NULL;
- if (MpSrvPERL_OFF(scfg)) {
+ if (!MpSrvENABLED(scfg)) {
MP_TRACE_h(MP_FUNC, "PerlOff for server %s\n",
s->server_hostname);
return DECLINED;
1.12 +24 -0 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.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- modperl_config.c 2000/06/12 03:30:52 1.11
+++ modperl_config.c 2000/06/13 21:05:39 1.12
@@ -56,6 +56,10 @@
modperl_srv_config_t *scfg = (modperl_srv_config_t *)
ap_pcalloc(p, sizeof(*scfg));
+ scfg->flags = modperl_options_new(p, MpSrvType);
+ MpSrvENABLED_On(scfg); /* mod_perl enabled by default */
+ MpSrvHOOKS_ALL_On(scfg); /* all hooks enabled by default */
+
scfg->argv = ap_make_array(p, 2, sizeof(char *));
scfg_push_argv((char *)ap_server_argv0);
@@ -154,17 +158,21 @@
merge_item(perl);
#endif
+ merge_item(argv);
merge_item(files_cfg);
merge_item(process_cfg);
merge_item(connection_cfg);
{ /* XXX: should do a proper merge of the arrays */
+ /* XXX: and check if Perl*Handler is disabled */
int i;
for (i=0; i<MP_PER_SRV_NUM_HANDLERS; i++) {
merge_item(handlers[i]);
}
}
+ mrg->flags = modperl_options_merge(p, base->flags, add->flags);
+
return mrg;
}
@@ -192,6 +200,22 @@
{
MP_dSCFG(parms->server);
scfg_push_argv(arg);
+ return NULL;
+}
+
+MP_DECLARE_SRV_CMD(options)
+{
+ MP_dSCFG(parms->server);
+ ap_pool_t *p = parms->pool;
+ const char *error;
+
+ MP_TRACE_d(MP_FUNC, "arg = %s\n", arg);
+ error = modperl_options_set(p, scfg->flags, arg);
+
+ if (error) {
+ return error;
+ }
+
return NULL;
}
1.11 +1 -0 modperl-2.0/src/modules/perl/modperl_config.h
Index: modperl_config.h
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_config.h,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- modperl_config.h 2000/05/23 20:54:44 1.10
+++ modperl_config.h 2000/06/13 21:05:39 1.11
@@ -24,6 +24,7 @@
void *dummy, char *arg)
MP_DECLARE_SRV_CMD(trace);
MP_DECLARE_SRV_CMD(switches);
+MP_DECLARE_SRV_CMD(options);
#ifdef USE_ITHREADS
MP_DECLARE_SRV_CMD(interp_start);
1.14 +11 -1 modperl-2.0/src/modules/perl/modperl_types.h
Index: modperl_types.h
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_types.h,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- modperl_types.h 2000/05/26 20:34:50 1.13
+++ modperl_types.h 2000/06/13 21:05:39 1.14
@@ -102,7 +102,17 @@
MpAV *handlers[MP_FILES_NUM_HANDLERS];
} modperl_files_config_t;
+typedef U32 modperl_opts_t;
+
typedef struct {
+ modperl_opts_t opts;
+ modperl_opts_t opts_add;
+ modperl_opts_t opts_remove;
+ modperl_opts_t opts_override;
+ int unset;
+} modperl_options_t;
+
+typedef struct {
MpHV *SetVars;
MpAV *PassEnv;
MpAV *PerlRequire, *PerlModule;
@@ -120,7 +130,7 @@
modperl_gtop_t *gtop;
#endif
MpAV *argv;
- int flags;
+ modperl_options_t *flags;
} modperl_srv_config_t;
typedef struct {