dougm 2002/09/04 18:47:39 Modified: src/modules/perl modperl_config.c modperl_config.h xs/Apache/Directive Apache__Directive.h Log: pulling config insert logic out of Apache__Directive.h so it can be used elsewhere. made more generic so it can be used at both startup time and request time. Revision Changes Path 1.56 +118 -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.55 retrieving revision 1.56 diff -u -r1.55 -r1.56 --- modperl_config.c 27 Aug 2002 04:27:44 -0000 1.55 +++ modperl_config.c 5 Sep 2002 01:47:39 -0000 1.56 @@ -324,3 +324,121 @@ return TRUE; } + +typedef struct { + AV *av; + I32 ix; + PerlInterpreter *perl; +} svav_param_t; + +static void *svav_getstr(void *buf, size_t bufsiz, void *param) +{ + svav_param_t *svav_param = (svav_param_t *)param; + dTHXa(svav_param->perl); + AV *av = svav_param->av; + SV *sv; + STRLEN n_a; + + if (svav_param->ix > AvFILL(av)) { + return NULL; + } + + sv = AvARRAY(av)[svav_param->ix++]; + SvPV_force(sv, n_a); + + apr_cpystrn(buf, SvPVX(sv), bufsiz); + + return buf; +} + +const char *modperl_config_insert(pTHX_ server_rec *s, + apr_pool_t *p, + apr_pool_t *ptmp, + int override, + char *path, + ap_conf_vector_t *conf, + SV *lines) +{ + const char *errmsg; + cmd_parms parms; + svav_param_t svav_parms; + ap_directive_t *conftree = NULL; + + memset(&parms, '\0', sizeof(parms)); + + parms.limited = -1; + parms.server = s; + parms.override = override; + parms.path = path; + parms.pool = p; + + if (ptmp) { + parms.temp_pool = ptmp; + } + else { + apr_pool_create(&parms.temp_pool, p); + } + + if (!(SvROK(lines) && (SvTYPE(SvRV(lines)) == SVt_PVAV))) { + return "not an array reference"; + } + + svav_parms.av = (AV*)SvRV(lines); + svav_parms.ix = 0; +#ifdef USE_ITHREADS + svav_parms.perl = aTHX; +#endif + + parms.config_file = ap_pcfg_open_custom(p, "mod_perl", + &svav_parms, NULL, + svav_getstr, NULL); + + errmsg = ap_build_config(&parms, p, parms.temp_pool, &conftree); + + if (!errmsg) { + errmsg = ap_walk_config(conftree, &parms, conf); + } + + ap_cfg_closefile(parms.config_file); + + if (ptmp != parms.temp_pool) { + apr_pool_destroy(parms.temp_pool); + } + + return errmsg; +} + +const char *modperl_config_insert_server(pTHX_ server_rec *s, SV *lines) +{ + 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, + s->lookup_defaults, lines); +} + +const char *modperl_config_insert_request(pTHX_ + request_rec *r, + SV *lines, + char *path, + int override) +{ + const char *errmsg; + ap_conf_vector_t *dconf = ap_create_per_dir_config(r->pool); + + errmsg = modperl_config_insert(aTHX_ + r->server, r->pool, r->pool, + override, path, + dconf, lines); + + if (errmsg) { + return errmsg; + } + + r->per_dir_config = + ap_merge_per_dir_configs(r->pool, + r->per_dir_config, + dconf); + + return NULL; +} 1.31 +15 -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.30 retrieving revision 1.31 diff -u -r1.30 -r1.31 --- modperl_config.h 5 Nov 2001 05:19:01 -0000 1.30 +++ modperl_config.h 5 Sep 2002 01:47:39 -0000 1.31 @@ -107,4 +107,19 @@ modperl_config_srv_t *scfg, PerlInterpreter *perl, apr_pool_t *p); +const char *modperl_config_insert(pTHX_ server_rec *s, + apr_pool_t *p, + apr_pool_t *ptmp, + int override, + char *path, + ap_conf_vector_t *conf, + SV *lines); + +const char *modperl_config_insert_server(pTHX_ server_rec *s, SV *lines); + +const char *modperl_config_insert_request(pTHX_ + request_rec *r, + SV *lines, + char *path, + int override); #endif /* MODPERL_CONFIG_H */ 1.5 +0 -71 modperl-2.0/xs/Apache/Directive/Apache__Directive.h Index: Apache__Directive.h =================================================================== RCS file: /home/cvs/modperl-2.0/xs/Apache/Directive/Apache__Directive.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- Apache__Directive.h 28 Aug 2002 03:11:21 -0000 1.4 +++ Apache__Directive.h 5 Sep 2002 01:47:39 -0000 1.5 @@ -1,77 +1,6 @@ #define mpxs_Apache__Directive_conftree(CLASS) \ (CLASS ? ap_conftree : ap_conftree) -typedef struct { - AV *av; - I32 ix; - PerlInterpreter *perl; -} svav_param_t; - -static void *svav_getstr(void *buf, size_t bufsiz, void *param) -{ - svav_param_t *svav_param = (svav_param_t *)param; - dTHXa(svav_param->perl); - AV *av = svav_param->av; - SV *sv; - STRLEN n_a; - - if (svav_param->ix > AvFILL(av)) { - return NULL; - } - - sv = AvARRAY(av)[svav_param->ix++]; - SvPV_force(sv, n_a); - - apr_cpystrn(buf, SvPVX(sv), bufsiz); - - return buf; -} - -static MP_INLINE const char *mpxs_Apache__Directive_insert(pTHX_ - SV *self, - server_rec *s, - apr_pool_t *p, - SV *svav) -{ - const char *errmsg; - cmd_parms parms; - svav_param_t svav_parms; - ap_directive_t *conftree = NULL; /* XXX: self isa Apache::Directive */ - - memset(&parms, '\0', sizeof(parms)); - - parms.limited = -1; - parms.pool = p; - parms.server = s; - parms.override = (RSRC_CONF | OR_ALL) & ~(OR_AUTHCFG | OR_LIMIT); - apr_pool_create(&parms.temp_pool, p); - - if (!(SvROK(svav) && (SvTYPE(SvRV(svav)) == SVt_PVAV))) { - return "not an array reference"; - } - - svav_parms.av = (AV*)SvRV(svav); - svav_parms.ix = 0; -#ifdef USE_ITHREADS - svav_parms.perl = aTHX; -#endif - - parms.config_file = ap_pcfg_open_custom(p, "mod_perl", - &svav_parms, NULL, - svav_getstr, NULL); - - errmsg = ap_build_config(&parms, p, parms.temp_pool, &conftree); - - if (!errmsg) { - errmsg = ap_walk_config(conftree, &parms, s->lookup_defaults); - } - - ap_cfg_closefile(parms.config_file); - apr_pool_destroy(parms.temp_pool); - - return errmsg; -} - /* XXX: this is only useful for <Perl> at the moment */ static MP_INLINE SV *mpxs_Apache__Directive_as_string(pTHX_ ap_directive_t *self)