dougm 01/03/25 09:42:27 Modified: lib/ModPerl Code.pm src/modules/perl mod_perl.c modperl_cmd.c modperl_cmd.h modperl_config.c modperl_options.c modperl_types.h Log: PerlOptions needs to be usable per-directory (tho different set of options than per-server) Revision Changes Path 1.52 +2 -3 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.51 retrieving revision 1.52 diff -u -r1.51 -r1.52 --- Code.pm 2001/03/17 06:03:37 1.51 +++ Code.pm 2001/03/25 17:42:26 1.52 @@ -95,8 +95,7 @@ Handler => [qw(NONE PARSED METHOD OBJECT ANON AUTOLOAD DYNAMIC)], ); -my %flags_lookup = map { $_,1 } qw(Srv Dir); -my %flags_options = map { $_,1 } qw(Srv); +my %flags_options = map { $_,1 } qw(Srv Dir); sub new { my $class = shift; @@ -322,7 +321,7 @@ my @lookup = (); my $lookup_proto = ""; my @dumper; - if ($flags_lookup{$class}) { + if ($flags_options{$class}) { $lookup_proto = join canon_func('flags', 'lookup', $class), 'U32 ', '(const char *str)'; push @lookup, "$lookup_proto {"; 1.40 +1 -1 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.39 retrieving revision 1.40 diff -u -r1.39 -r1.40 --- mod_perl.c 2001/03/16 05:52:29 1.39 +++ mod_perl.c 2001/03/25 17:42:26 1.40 @@ -234,7 +234,7 @@ static const command_rec modperl_cmds[] = { MP_CMD_SRV_ITERATE("PerlSwitches", switches, "Perl Switches"), - MP_CMD_SRV_ITERATE("PerlOptions", options, "Perl Options"), + MP_CMD_DIR_ITERATE("PerlOptions", options, "Perl Options"), #ifdef MP_TRACE MP_CMD_SRV_TAKE1("PerlTrace", trace, "Trace level"), #endif 1.3 +9 -1 modperl-2.0/src/modules/perl/modperl_cmd.c Index: modperl_cmd.c =================================================================== RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_cmd.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- modperl_cmd.c 2001/03/17 06:08:05 1.2 +++ modperl_cmd.c 2001/03/25 17:42:26 1.3 @@ -46,11 +46,19 @@ MP_CMD_SRV_DECLARE(options) { MP_dSCFG(parms->server); + modperl_config_dir_t *dcfg = (modperl_config_dir_t *)dummy; + int is_per_dir = parms->path ? 1 : 0; + modperl_options_t *opts = is_per_dir ? dcfg->flags : scfg->flags; apr_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 = modperl_options_set(p, opts, arg)) && !is_per_dir) { + /* maybe a per-directory option outside of a container */ + if (modperl_options_set(p, dcfg->flags, arg) == NULL) { + error = NULL; + } + } if (error) { return error; 1.2 +4 -0 modperl-2.0/src/modules/perl/modperl_cmd.h Index: modperl_cmd.h =================================================================== RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_cmd.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- modperl_cmd.h 2001/03/16 05:52:29 1.1 +++ modperl_cmd.h 2001/03/25 17:42:26 1.2 @@ -49,4 +49,8 @@ AP_INIT_TAKE1( name, modperl_cmd_##item, NULL, \ OR_ALL, desc ) +#define MP_CMD_DIR_ITERATE(name, item, desc) \ + AP_INIT_TAKE1( name, modperl_cmd_##item, NULL, \ + OR_ALL, desc ) + #endif /* MODPERL_CMD_H */ 1.28 +4 -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.27 retrieving revision 1.28 diff -u -r1.27 -r1.28 --- modperl_config.c 2001/03/16 07:30:22 1.27 +++ modperl_config.c 2001/03/25 17:42:26 1.28 @@ -37,6 +37,8 @@ } } + mrg->flags = modperl_options_merge(p, base->flags, add->flags); + return mrg; } @@ -72,6 +74,8 @@ { modperl_config_dir_t *dcfg = (modperl_config_dir_t *) apr_pcalloc(p, sizeof(modperl_config_dir_t)); + + dcfg->flags = modperl_options_new(p, MpDirType); MP_TRACE_d(MP_FUNC, "0x%lx\n", (unsigned long)dcfg); 1.4 +38 -4 modperl-2.0/src/modules/perl/modperl_options.c Index: modperl_options.c =================================================================== RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_options.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- modperl_options.c 2001/03/04 18:49:39 1.3 +++ modperl_options.c 2001/03/25 17:42:26 1.4 @@ -1,18 +1,39 @@ #include "mod_perl.h" +/* re-use the ->unset field to determine options type */ +#define MpOptionsType(o) (o)->unset +#define MpOptionsTypeDir(o) MpOptionsType(o) == MpDir_f_UNSET +#define MpOptionsTypeSrv(o) MpOptionsType(o) == MpSrv_f_UNSET +#define MpOptionsTypeDir_set(o) MpOptionsType(o) = MpDir_f_UNSET +#define MpOptionsTypeSrv_set(o) MpOptionsType(o) = MpSrv_f_UNSET +#define MP_OPTIONS_TYPE_DIR MpDir_f_UNSET +#define MP_OPTIONS_TYPE_SRV MpSrv_f_UNSET + static modperl_opts_t flags_lookup(modperl_options_t *o, const char *str) { - switch (o->unset) { - case MpSrv_f_UNSET: + switch (MpOptionsType(o)) { + case MP_OPTIONS_TYPE_SRV: return modperl_flags_lookup_srv(str); - case MpDir_f_UNSET: + case MP_OPTIONS_TYPE_DIR: return modperl_flags_lookup_dir(str); default: return '\0'; }; } +static const char *type_lookup(modperl_options_t *o) +{ + switch (MpOptionsType(o)) { + case MP_OPTIONS_TYPE_SRV: + return "server"; + case MP_OPTIONS_TYPE_DIR: + return "directory"; + default: + return "unknown"; + }; +} + modperl_options_t *modperl_options_new(apr_pool_t *p, int type) { modperl_options_t *options = @@ -36,7 +57,20 @@ } if (!(opt = flags_lookup(o, str))) { - error = apr_pstrcat(p, "Unknown PerlOption: ", str, NULL); + error = apr_pstrcat(p, "Invalid per-", type_lookup(o), + " PerlOption: ", str, NULL); + + if (MpOptionsTypeDir(o)) { + modperl_options_t dummy; + MpOptionsTypeSrv_set(&dummy); + + if (flags_lookup(&dummy, str)) { + error = apr_pstrcat(p, error, + " (only allowed per-server)", + NULL); + } + } + return error; } 1.30 +1 -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.29 retrieving revision 1.30 diff -u -r1.29 -r1.30 --- modperl_types.h 2001/03/16 17:23:25 1.29 +++ modperl_types.h 2001/03/25 17:42:27 1.30 @@ -134,7 +134,7 @@ MpAV *handlers_per_dir[MP_HANDLER_NUM_PER_DIR]; MpHV *SetEnv; MpHV *SetVars; - U8 flags; + modperl_options_t *flags; #ifdef USE_ITHREADS modperl_interp_lifetime_e interp_lifetime; #endif