On Friday 24 February 2006 12:50, Torsten Foertsch wrote: > I think I'll submit the patch later today.
Here it is. The code runs for Apache 2.0 and 2.2. For Apache 2.0 when reading override options it returns simply a bitmask with all options allowed. That makes Apache 2.0 and 2.2 compatible in this point with the exception that 2.0 provides no means to set the bitmask. Please review. Torsten
diff -Naur mod_perl-2.0.2/docs/api/Apache2/Access.pod mod_perl-2.0.2.new/docs/api/Apache2/Access.pod --- mod_perl-2.0.2/docs/api/Apache2/Access.pod 2005-10-21 02:05:00.000000000 +0200 +++ mod_perl-2.0.2.new/docs/api/Apache2/Access.pod 2006-02-24 19:39:11.079711163 +0100 @@ -20,6 +20,9 @@ # Apache AllowOverride value $allow_override = $r->allow_overrides(); + # which Options are allowed by AllowOverride (since Apache 2.2) + $allow_override_opts = $r->allow_override_opts(); + # auth name ("foo bar") $auth_name = $r->auth_name(); @@ -199,6 +202,54 @@ +=head2 C<allow_override_opts> + +Retrieve the bitmask of allowed C<Options> set by C<AllowOverride Options=...> +for this request + + $override_opts = $r->allow_override_opts(); + +Enabling single options was introduced in Apache 2.2. For Apache 2.0 this +function returns +C<L<Apache2::Const::OPT_UNSET|docs::2.0::api::Apache2::Const/C_Apache2__Const__OPT_UNSET_>> | +C<L<Apache2::Const::OPT_ALL|docs::2.0::api::Apache2::Const/C_Apache2__Const__OPT_ALL_>> | +C<L<Apache2::Const::OPT_INCNOEXEC|docs::2.0::api::Apache2::Const/C_Apache2__Const__OPT_INCNOEXEC_>> | +C<L<Apache2::Const::OPT_SYM_OWNER|docs::2.0::api::Apache2::Const/C_Apache2__Const__OPT_SYM_OWNER_>> | +C<L<Apache2::Const::OPT_MULTI|docs::2.0::api::Apache2::Const/C_Apache2__Const__OPT_MULTI_>>, +which corresponds to the default value (if not set) for Apache 2.2. + +=over 4 + +=item obj: C<$r> +( C<L<Apache2::RequestRec object|docs::2.0::api::Apache2::RequestRec>> ) + +The current request + +=item ret: C<$override_opts> ( integer ) + +the override options bitmask. Normally used with bitlogic operators +against C<L<Apache2::Const :options +constants|docs::2.0::api::Apache2::Const/C__options_>>. + +=item since: 2.0.3 + +=back + +For example if the configuration for the current request was: + + AllowOverride Options=Indexes,ExecCGI + +The following applies: + + use Apache2::Const -compile => qw(:options); + $r->allow_override_opts & Apache2::Const::OPT_EXECCGI; # TRUE + $r->allow_override_opts & Apache2::Const::OPT_SYM_LINKS; # FALSE + + + + + + =head2 C<auth_name> Get/set the current Authorization realm (the per directory diff -Naur mod_perl-2.0.2/docs/api/Apache2/CmdParms.pod mod_perl-2.0.2.new/docs/api/Apache2/CmdParms.pod --- mod_perl-2.0.2/docs/api/Apache2/CmdParms.pod 2005-10-21 02:05:00.000000000 +0200 +++ mod_perl-2.0.2.new/docs/api/Apache2/CmdParms.pod 2006-02-24 19:38:42.152546700 +0100 @@ -48,6 +48,9 @@ # which allow-override bits are set $override = $parms->override; + # which Options are allowed by AllowOverride (since Apache 2.2) + $override = $parms->override_opts; + # the path this command is being invoked in $path = $parms->path; @@ -313,6 +316,37 @@ +=head2 C<override_opts> + +Which options are allowed to be overridden by C<.htaccess> files. This is +set by C<AllowOverride Options=...>. + + $override_opts = $parms->override_opts; + +Enabling single options was introduced with Apache 2.2. For Apache 2.0 this +function simply returns a bitmask with all options allowed. + +=over 4 + +=item obj: C<$parms> +( C<L<Apache2::CmdParms object|docs::2.0::api::Apache2::CmdParms>> ) + +=item ret: C<$override_opts> ( bitmask ) + +the bitmask, which can be tested against +C<L<Apache2::Const :options +constants|docs::2.0::api::Apache2::Const/C__override_>>. + +=item since: 2.0.3 + +=back + + + + + + + =head2 C<path> The current pathname/location/match of the block this command is in diff -Naur mod_perl-2.0.2/docs/api/Apache2/RequestUtil.pod mod_perl-2.0.2.new/docs/api/Apache2/RequestUtil.pod --- mod_perl-2.0.2/docs/api/Apache2/RequestUtil.pod 2005-10-21 02:05:00.000000000 +0200 +++ mod_perl-2.0.2.new/docs/api/Apache2/RequestUtil.pod 2006-02-24 18:46:20.797727426 +0100 @@ -108,6 +108,11 @@ $r->add_config($lines); $r->add_config($lines, $override); + $r->add_config($lines, $override, $path); + $r->add_config($lines, $override, $path, $override_opts); + +Configuration directives are processed as if given in a C<E<lt>LocationE<gt>> +block. =over 4 @@ -119,17 +124,73 @@ An ARRAY reference containing configuration lines per element, without the new line terminators. -=item opt arg2: C<$override> ( C<L<APR::Const status -constant|docs::2.0::api::APR::Const>> ) +=item opt arg2: C<$override> ( C<L<Apache2::Const override +constant|docs::2.0::api::Apache2::Const>> ) Which allow-override bits are set Default value is: C<L<Apache2::Const::OR_AUTHCFG|docs::2.0::api::Apache2::Const/C_Apache2__Const__OR_AUTHCFG_>> +=item opt arg3: C<$path> ( string ) + +Set the C<L<Apache2::CmdParms object|docs::2.0::api::Apache2::CmdParms>> C<path> component. +This is the path of the C<E<lt>LocationE<gt>> block. Some directives need this, +for example C<ProxyPassReverse>. + +If an empty string is passed a C<NULL> pointer is passed further at C-level. +This is necessary to make something like this work: + + $r->add_config( [ + '<Directory />', + 'AllowOverride Options AuthConfig', + '</Directory>', + ], ~0, '' ); + +Note: C<AllowOverride> is valid only in directory context. + +B<Caution:> Some directives need a non-empty path otherwise they cause +segfaults. Thus, use the empty path with caution. + +Default value is: C</> + +=item opt arg4: C<$override_opts> ( C<L<Apache2::Const options +constant|docs::2.0::api::Apache2::Const>> ) + +Apache limits the applicable directives in certain situations with +C<AllowOverride>. With Apache 2.2 comes the possibility to enable or +disable single options, for example + + AllowOverride AuthConfig Options=ExecCGI,Indexes + +Internally, this directive is parsed into 2 bit fields that are represented +by the C<$override> and C<$override_opts> parameters to C<add_config>. +The above example is parsed into an C<$override> with 2 bits set, one for +C<AuthConfig> the other for C<Options> and an C<$override_opts> with +2 bits set for ExecCGI and Indexes. + +When applying other directives, for example C<AuthType> or C<Options> the +appropriate bits in C<$override> must be set. For the C<Options> directive +additionally C<$override_opts> bits must be set. + +The C<$override> and C<$override_opts> parameters to C<add_config> are +valid while applying C<$lines>. + +C<$override_opts> is new in Apache 2.2. The mod_perl implementation for +Apache 2.0 lets you pass the parameter but ignores it. + +Default for C<$override_opts> is: +C<L<Apache2::Const::OPT_UNSET|docs::2.0::api::Apache2::Const/C_Apache2__Const__OPT_UNSET_>> | +C<L<Apache2::Const::OPT_ALL|docs::2.0::api::Apache2::Const/C_Apache2__Const__OPT_ALL_>> | +C<L<Apache2::Const::OPT_INCNOEXEC|docs::2.0::api::Apache2::Const/C_Apache2__Const__OPT_INCNOEXEC_>> | +C<L<Apache2::Const::OPT_SYM_OWNER|docs::2.0::api::Apache2::Const/C_Apache2__Const__OPT_SYM_OWNER_>> | +C<L<Apache2::Const::OPT_MULTI|docs::2.0::api::Apache2::Const/C_Apache2__Const__OPT_MULTI_>> + +That means, all options are allowed. + =item ret: no return value -=item since: 2.0.00 +=item since: 2.0.00, C<$path> and C<$override_opts> since 2.0.3 =back @@ -138,10 +199,16 @@ For example: - use Apache2::ServerUtil (); - $r->add_config(['require valid-user']); + use Apache2::RequestUtil (); + use Apache2::Access (); + $r->add_config(['require valid-user']); + # this regards the current AllowOverride setting + $r->add_config(['AuthName secret', + 'AuthType Basic', + 'Options ExecCGI'], + $r->allow_override, $path, $r->allow_override_opts); diff -Naur mod_perl-2.0.2/src/modules/perl/modperl_config.c mod_perl-2.0.2.new/src/modules/perl/modperl_config.c --- mod_perl-2.0.2/src/modules/perl/modperl_config.c 2005-10-21 02:04:26.000000000 +0200 +++ mod_perl-2.0.2.new/src/modules/perl/modperl_config.c 2006-02-21 20:59:23.000000000 +0100 @@ -500,6 +500,7 @@ apr_pool_t *ptmp, int override, char *path, + int override_options, ap_conf_vector_t *conf, SV *lines) { @@ -515,6 +516,15 @@ parms.override = override; parms.path = path; parms.pool = p; +#if AP_SERVER_MAJORVERSION_NUMBER>2 || AP_SERVER_MINORVERSION_NUMBER>=2 + parms.override_opts = override_options==-1 + ? OPT_UNSET | + OPT_ALL | + OPT_INCNOEXEC | + OPT_SYM_OWNER | + OPT_MULTI + : override_options; +#endif if (ptmp) { parms.temp_pool = ptmp; @@ -561,6 +571,11 @@ parms->temp_pool, parms->override, parms->path, +#if AP_SERVER_MAJORVERSION_NUMBER>2 || AP_SERVER_MINORVERSION_NUMBER>=2 + parms->override_opts, +#else + -1, +#endif parms->context, lines); } @@ -571,23 +586,26 @@ int override = (RSRC_CONF | OR_ALL) & ~(OR_AUTHCFG | OR_LIMIT); apr_pool_t *p = s->process->pconf; - return modperl_config_insert(aTHX_ s, p, NULL, override, NULL, + return modperl_config_insert(aTHX_ s, p, NULL, override, NULL, -1, s->lookup_defaults, lines); } const char *modperl_config_insert_request(pTHX_ request_rec *r, SV *lines, - int override) + int override, + char *path, + int override_options) { const char *errmsg; ap_conf_vector_t *dconf = ap_create_per_dir_config(r->pool); - /* The path argument of "/" is only required to be non-NULL - and "/" is as good a default as anything else */ + /* The path argument required to be non-NULL + and "/" is as good a default if nothing else given */ errmsg = modperl_config_insert(aTHX_ r->server, r->pool, r->pool, - override, "/", + override, !path ? "/" : *path ? apr_pstrdup( r->pool, path ) : NULL, + override_options, dconf, lines); if (errmsg) { diff -Naur mod_perl-2.0.2/src/modules/perl/modperl_config.h mod_perl-2.0.2.new/src/modules/perl/modperl_config.h --- mod_perl-2.0.2/src/modules/perl/modperl_config.h 2005-10-21 02:04:26.000000000 +0200 +++ mod_perl-2.0.2.new/src/modules/perl/modperl_config.h 2006-02-21 10:31:15.000000000 +0100 @@ -131,6 +131,7 @@ apr_pool_t *ptmp, int override, char *path, + int override_options, ap_conf_vector_t *conf, SV *lines); @@ -142,7 +143,9 @@ const char *modperl_config_insert_request(pTHX_ request_rec *r, SV *lines, - int override); + int override, + char *path, + int override_options); int modperl_config_is_perl_option_enabled(pTHX_ request_rec *r, server_rec *s, const char *name); diff -Naur mod_perl-2.0.2/t/api/add_config.t mod_perl-2.0.2.new/t/api/add_config.t --- mod_perl-2.0.2/t/api/add_config.t 1970-01-01 01:00:00.000000000 +0100 +++ mod_perl-2.0.2.new/t/api/add_config.t 2006-02-23 20:58:11.000000000 +0100 @@ -0,0 +1,13 @@ +use strict; +use warnings FATAL => 'all'; + +use Apache::TestRequest qw(GET_BODY_ASSERT); +use Apache::Test; +use Apache::TestUtil; + +my $module = 'TestAPI::add_config'; +my $url = Apache::TestRequest::module2url($module, + {path => '/TestAPI__add_config/'}); + +t_debug("connecting to $url"); +print GET_BODY_ASSERT $url; diff -Naur mod_perl-2.0.2/t/htdocs/TestAPI__add_config/htaccess mod_perl-2.0.2.new/t/htdocs/TestAPI__add_config/htaccess --- mod_perl-2.0.2/t/htdocs/TestAPI__add_config/htaccess 1970-01-01 01:00:00.000000000 +0100 +++ mod_perl-2.0.2.new/t/htdocs/TestAPI__add_config/htaccess 2006-02-23 20:37:09.000000000 +0100 @@ -0,0 +1 @@ +TestAddConfig Htaccess diff -Naur mod_perl-2.0.2/t/response/TestAPI/add_config.pm mod_perl-2.0.2.new/t/response/TestAPI/add_config.pm --- mod_perl-2.0.2/t/response/TestAPI/add_config.pm 1970-01-01 01:00:00.000000000 +0100 +++ mod_perl-2.0.2.new/t/response/TestAPI/add_config.pm 2006-02-24 12:48:19.485314519 +0100 @@ -0,0 +1,136 @@ +package TestAPI::add_config; + +use strict; +use warnings FATAL => 'all'; + +use Apache2::Access (); +use Apache2::CmdParms (); +use Apache2::RequestUtil (); +use Apache2::Directive (); +use Apache2::ServerUtil (); +use base qw(Apache2::Module); + +use Apache::Test; +use Apache::TestUtil; + +use Apache2::Const -compile => qw( + OK DECLINED + :options +); + +use constant KEY => "TestAddConfig"; + +my @directives = ( + { + name => +KEY, + cmd_data => 'cmd_data', + errmsg => 'errmsg', + }, +); + +Apache2::Module::add(__PACKAGE__, [EMAIL PROTECTED]); + +my @methods = qw(override_opts); + +sub TestAddConfig { + my ($self, $parms, $args) = @_; + my $srv_cfg = $self->get_config($parms->server); + $srv_cfg->{override_opts} = $parms->override_opts(); +} + + + +### map2storage handler ### +sub map2storage { + my ($r) = @_; + + (my $av=Apache2::ServerUtil::get_server_version)=~s!.+/!v!; + $av=eval $av; + + my $o=($av ge v2.2.0 ? '=All,SymLinksIfOwnerMatch' : ''); + + eval { + $r->add_config(['AllowOverride All Options'.$o]); + }; + # NOTE: pnotes simply increments a variable's reference counter. + # Hence, this strange do{} block is necessary to copy [EMAIL PROTECTED] + $r->pnotes(add_config1=>do{my $e="$@"}); + + eval { + $r->add_config(['Options ExecCGI'], -1, '/', 0); + }; + $r->pnotes(add_config2=>do{my $e="$@"}); + + eval { + $r->add_config(['<Directory /'.$r->document_root.'/TestAPI__add_config>', + 'AllowOverride All Options'.$o, + '</Directory>'], -1, ''); + }; + $r->pnotes(add_config4=>do{my $e="$@"}); + + return Apache2::Const::DECLINED; +} + + + +### fixup handler ### +sub fixup { + my ($r) = @_; + + eval { + $r->add_config(['Options ExecCGI'], -1, '/', + Apache2::Const::OPT_EXECCGI); + }; + $r->pnotes(add_config3=>do{my $e="$@"}); + + return Apache2::Const::DECLINED; +} + + + +### response handler ### +sub handler : method { + my ($self, $r) = @_; + my $cf = $self->get_config($r->server); + + plan $r, tests => 7; + + (my $av=Apache2::ServerUtil::get_server_version)=~s!.+/!v!; + $av=eval $av; + + ok t_cmp $r->pnotes('add_config1'), qr!.+\n!, 'add_config 1'; + ok t_cmp $r->pnotes('add_config2'), + ($av ge v2.2.0 ? qr!.+\n! : ''), + 'add_config 2'; + ok t_cmp $r->pnotes('add_config3'), '', 'add_config 3'; + ok t_cmp $r->pnotes('add_config4'), '', 'add_config 4'; + + my $expect=($av ge v2.2.0 ? 0 : Apache2::Const::OPT_UNSET | + Apache2::Const::OPT_INCNOEXEC | + Apache2::Const::OPT_MULTI) | + Apache2::Const::OPT_ALL | + Apache2::Const::OPT_SYM_OWNER; + + ok t_cmp $cf->{override_opts}, $expect, 'Apache2::CmdParms::override_opts'; + ok t_cmp $r->allow_override_opts, $expect, 'Apache2::Access::allow_override_opts'; + ok t_cmp $r->allow_options, Apache2::Const::OPT_EXECCGI, 'result of add_config 3'; + + return Apache2::Const::OK; +} + +1; +__END__ + +# APACHE_TEST_CONFIG_ORDER 950 + +<NoAutoConfig> + <VirtualHost TestAPI::add_config> + PerlModule TestAPI::add_config + + AccessFileName htaccess + SetHandler modperl + PerlResponseHandler TestAPI::add_config + PerlMapToStorageHandler TestAPI::add_config::map2storage + PerlFixupHandler TestAPI::add_config::fixup + </VirtualHost> +</NoAutoConfig> diff -Naur mod_perl-2.0.2/xs/Apache2/Access/Apache2__Access.h mod_perl-2.0.2.new/xs/Apache2/Access/Apache2__Access.h --- mod_perl-2.0.2/xs/Apache2/Access/Apache2__Access.h 2005-10-21 02:04:29.000000000 +0200 +++ mod_perl-2.0.2.new/xs/Apache2/Access/Apache2__Access.h 2006-02-22 12:35:39.000000000 +0100 @@ -80,7 +80,8 @@ errmsg = modperl_config_insert_request(aTHX_ r, newRV_noinc((SV*)config), - OR_AUTHCFG); + OR_AUTHCFG, + NULL, -1); if (errmsg) { Perl_warn(aTHX_ "Can't change %s to '%s'\n", directive, val); @@ -140,3 +141,15 @@ } }); } + +static MP_INLINE +int mpxs_Apache2__RequestRec_allow_override_opts(pTHX_ request_rec *r) +{ +#if AP_SERVER_MAJORVERSION_NUMBER>2 || AP_SERVER_MINORVERSION_NUMBER>=2 + return + ((core_dir_config *)ap_get_module_config(r->per_dir_config, + &core_module))->override_opts; +#else + return OPT_UNSET | OPT_ALL | OPT_INCNOEXEC | OPT_SYM_OWNER | OPT_MULTI; +#endif +} diff -Naur mod_perl-2.0.2/xs/Apache2/CmdParms/Apache2__CmdParms.h mod_perl-2.0.2.new/xs/Apache2/CmdParms/Apache2__CmdParms.h --- mod_perl-2.0.2/xs/Apache2/CmdParms/Apache2__CmdParms.h 2005-10-21 02:04:29.000000000 +0200 +++ mod_perl-2.0.2.new/xs/Apache2/CmdParms/Apache2__CmdParms.h 2006-02-21 21:06:23.000000000 +0100 @@ -35,3 +35,13 @@ Perl_croak(aTHX_ "$parms->add_config() has failed: %s", errmsg); } } + +static MP_INLINE +int mpxs_Apache2__CmdParms_override_opts(pTHX_ cmd_parms *parms) +{ +#if AP_SERVER_MAJORVERSION_NUMBER>2 || AP_SERVER_MINORVERSION_NUMBER>=2 + return (modperl_module_cmd_data_t *)parms->override_opts; +#else + return OPT_UNSET | OPT_ALL | OPT_INCNOEXEC | OPT_SYM_OWNER | OPT_MULTI; +#endif +} diff -Naur mod_perl-2.0.2/xs/Apache2/RequestUtil/Apache2__RequestUtil.h mod_perl-2.0.2.new/xs/Apache2/RequestUtil/Apache2__RequestUtil.h --- mod_perl-2.0.2/xs/Apache2/RequestUtil/Apache2__RequestUtil.h 2005-10-21 02:04:29.000000000 +0200 +++ mod_perl-2.0.2.new/xs/Apache2/RequestUtil/Apache2__RequestUtil.h 2006-02-20 09:41:08.000000000 +0100 @@ -302,10 +302,13 @@ } static MP_INLINE -void mpxs_Apache2__RequestRec_add_config(pTHX_ request_rec *r, SV *lines, int override) +void mpxs_Apache2__RequestRec_add_config(pTHX_ request_rec *r, SV *lines, + int override, char *path, + int override_options) { const char *errmsg = modperl_config_insert_request(aTHX_ r, lines, - override); + override, path, + override_options); if (errmsg) { Perl_croak(aTHX_ "$r->add_config() has failed: %s", errmsg); } diff -Naur mod_perl-2.0.2/xs/maps/apache2_structures.map mod_perl-2.0.2.new/xs/maps/apache2_structures.map --- mod_perl-2.0.2/xs/maps/apache2_structures.map 2005-10-21 02:04:27.000000000 +0200 +++ mod_perl-2.0.2.new/xs/maps/apache2_structures.map 2006-02-21 21:03:55.000000000 +0100 @@ -246,6 +246,7 @@ < cmd < context ! err_directive +- override_opts </cmd_parms> !<ap_mgmt_item_t> diff -Naur mod_perl-2.0.2/xs/maps/modperl_functions.map mod_perl-2.0.2.new/xs/maps/modperl_functions.map --- mod_perl-2.0.2/xs/maps/modperl_functions.map 2005-10-21 02:04:27.000000000 +0200 +++ mod_perl-2.0.2.new/xs/maps/modperl_functions.map 2006-02-21 21:06:56.000000000 +0100 @@ -30,7 +30,7 @@ mpxs_Apache2__RequestRec_location mpxs_Apache2__RequestRec_as_string mpxs_Apache2__RequestRec_pnotes | | r, key=Nullsv, val=Nullsv - mpxs_Apache2__RequestRec_add_config | | r, lines, override=OR_AUTHCFG + mpxs_Apache2__RequestRec_add_config | | r, lines, override=OR_AUTHCFG, path=NULL, override_options=-1 mpxs_Apache2__RequestRec_document_root | | r, new_root=Nullsv mpxs_Apache2__RequestRec_child_terminate @@ -150,6 +150,10 @@ ap_method_is_limited mpxs_Apache2__CmdParms_info mpxs_Apache2__CmdParms_add_config + mpxs_Apache2__CmdParms_override_opts MODULE=Apache2::MPM PACKAGE=Apache2::MPM BOOT=1 mpxs_Apache2__MPM_query + +MODULE=Apache2::Access PACKAGE=guess + mpxs_Apache2__RequestRec_allow_override_opts diff -Naur mod_perl-2.0.2/xs/tables/current/ModPerl/FunctionTable.pm mod_perl-2.0.2.new/xs/tables/current/ModPerl/FunctionTable.pm --- mod_perl-2.0.2/xs/tables/current/ModPerl/FunctionTable.pm 2005-10-21 02:04:29.000000000 +0200 +++ mod_perl-2.0.2.new/xs/tables/current/ModPerl/FunctionTable.pm 2006-02-21 21:08:44.000000000 +0100 @@ -1371,6 +1371,10 @@ 'name' => 'path' }, { + 'type' => 'int', + 'name' => 'override_options' + }, + { 'type' => 'ap_conf_vector_t *', 'name' => 'conf' }, @@ -1417,6 +1421,14 @@ { 'type' => 'int', 'name' => 'override' + }, + { + 'type' => 'char *', + 'name' => 'path' + }, + { + 'type' => 'int', + 'name' => 'override_options' } ] }, @@ -6105,6 +6117,20 @@ ] }, { + 'return_type' => 'int', + 'name' => 'mpxs_Apache2__CmdParms_override_opts', + 'args' => [ + { + 'type' => 'PerlInterpreter *', + 'name' => 'my_perl' + }, + { + 'type' => 'cmd_parms *', + 'name' => 'parms' + } + ] + }, + { 'return_type' => 'void', 'name' => 'mpxs_Apache2__Connection_add_input_filter', 'args' => [ @@ -6636,6 +6662,14 @@ { 'type' => 'int', 'name' => 'override' + }, + { + 'type' => 'char *', + 'name' => 'path' + }, + { + 'type' => 'int', + 'name' => 'override_options' } ] }, @@ -6676,6 +6710,20 @@ ] }, { + 'return_type' => 'int', + 'name' => 'mpxs_Apache2__RequestRec_allow_override_opts', + 'args' => [ + { + 'type' => 'PerlInterpreter *', + 'name' => 'my_perl' + }, + { + 'type' => 'request_rec *', + 'name' => 'r' + } + ] + }, + { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__RequestRec_as_string', 'args' => [
pgpQo1n8rfLoM.pgp
Description: PGP signature