stas 01/09/28 12:51:40 Modified: src/modules/perl mod_perl.c modperl_cmd.c modperl_cmd.h modperl_config.c modperl_types.h Log: - implementation of PerlSetVar and PerlAddVar Revision Changes Path 1.85 +3 -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.84 retrieving revision 1.85 diff -u -r1.84 -r1.85 --- mod_perl.c 2001/09/28 19:33:58 1.84 +++ mod_perl.c 2001/09/28 19:51:40 1.85 @@ -173,7 +173,7 @@ if (!modperl_config_apply_PerlRequire(s, scfg, perl, p)) { exit(1); } - + #ifdef USE_ITHREADS if (!MpSrvENABLE(scfg)) { @@ -415,6 +415,8 @@ MP_CMD_SRV_ITERATE("PerlModule", modules, "PerlModule"), MP_CMD_SRV_ITERATE("PerlRequire", requires, "PerlRequire"), MP_CMD_DIR_ITERATE("PerlOptions", options, "Perl Options"), + MP_CMD_DIR_TAKE2("PerlSetVar", set_var, "PerlSetVar"), + MP_CMD_DIR_ITERATE2("PerlAddVar", add_var, "PerlAddVar"), #ifdef MP_TRACE MP_CMD_SRV_TAKE1("PerlTrace", trace, "Trace level"), #endif 1.12 +32 -0 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.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- modperl_cmd.c 2001/09/27 19:41:44 1.11 +++ modperl_cmd.c 2001/09/28 19:51:40 1.12 @@ -60,6 +60,38 @@ return NULL; } +MP_CMD_SRV_DECLARE2(set_var) +{ + MP_dSCFG(parms->server); + modperl_config_dir_t *dcfg = (modperl_config_dir_t *)mconfig; + + if (parms->path) { + apr_table_set(dcfg->SetVar, arg1, arg2); + MP_TRACE_d(MP_FUNC, "DIR: arg1 = %s, arg2 = %s\n", arg1, arg2); + } + else { + apr_table_set(scfg->SetVar, arg1, arg2); + MP_TRACE_d(MP_FUNC, "SRV: arg1 = %s, arg2 = %s\n", arg1, arg2); + } + return NULL; +} + +MP_CMD_SRV_DECLARE2(add_var) +{ + MP_dSCFG(parms->server); + modperl_config_dir_t *dcfg = (modperl_config_dir_t *)mconfig; + + if (parms->path) { + apr_table_add(dcfg->SetVar, arg1, arg2); + MP_TRACE_d(MP_FUNC, "DIR: arg1 = %s, arg2 = %s\n", arg1, arg2); + } + else { + apr_table_add(scfg->SetVar, arg1, arg2); + MP_TRACE_d(MP_FUNC, "SRV: arg1 = %s, arg2 = %s\n", arg1, arg2); + } + return NULL; +} + MP_CMD_SRV_DECLARE(options) { MP_dSCFG(parms->server); 1.14 +14 -5 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.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- modperl_cmd.h 2001/09/27 19:41:44 1.13 +++ modperl_cmd.h 2001/09/28 19:51:40 1.14 @@ -4,14 +4,13 @@ char *modperl_cmd_push_handlers(MpAV **handlers, const char *name, apr_pool_t *p); - #define MP_CMD_SRV_DECLARE(item) \ -const char *modperl_cmd_##item(cmd_parms *parms, \ - void *mconfig, const char *arg) +const char *modperl_cmd_##item(cmd_parms *parms, void *mconfig, \ + const char *arg) #define MP_CMD_SRV_DECLARE2(item) \ -const char *modperl_cmd_##item(cmd_parms *parms, \ - void *mconfig, const char *arg1, const char *arg2) +const char *modperl_cmd_##item(cmd_parms *parms, void *mconfig, \ + const char *arg1, const char *arg2) #define MP_CMD_SRV_DECLARE_FLAG(item) \ const char *modperl_cmd_##item(cmd_parms *parms, \ @@ -21,6 +20,8 @@ MP_CMD_SRV_DECLARE(switches); MP_CMD_SRV_DECLARE(modules); MP_CMD_SRV_DECLARE(requires); +MP_CMD_SRV_DECLARE2(set_var); +MP_CMD_SRV_DECLARE2(add_var); MP_CMD_SRV_DECLARE(options); #ifdef MP_COMPAT_1X @@ -73,6 +74,10 @@ AP_INIT_ITERATE( name, modperl_cmd_##item, NULL, \ RSRC_CONF, desc ) +#define MP_CMD_SRV_ITERATE2(name, item, desc) \ + AP_INIT_ITERATE2( name, modperl_cmd_##item, NULL, \ + RSRC_CONF, desc ) + #define MP_CMD_DIR_TAKE1(name, item, desc) \ AP_INIT_TAKE1( name, modperl_cmd_##item, NULL, \ OR_ALL, desc ) @@ -83,6 +88,10 @@ #define MP_CMD_DIR_ITERATE(name, item, desc) \ AP_INIT_ITERATE( name, modperl_cmd_##item, NULL, \ + OR_ALL, desc ) + +#define MP_CMD_DIR_ITERATE2(name, item, desc) \ + AP_INIT_ITERATE2( name, modperl_cmd_##item, NULL, \ OR_ALL, desc ) #define MP_CMD_DIR_FLAG(name, item, desc) \ 1.42 +27 -1 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.41 retrieving revision 1.42 diff -u -r1.41 -r1.42 --- modperl_config.c 2001/09/28 15:16:06 1.41 +++ modperl_config.c 2001/09/28 19:51:40 1.42 @@ -13,8 +13,26 @@ } #define merge_item(item) \ -mrg->item = add->item ? add->item : base->item + mrg->item = add->item ? add->item : base->item +/* take the 'base' values, and override with 'add' values if any */ +#define merge_table_overlap_item(item) \ + { \ + apr_array_header_t *arr = apr_table_elts(base->item); \ + apr_table_entry_t *entries = (apr_table_entry_t *)arr->elts; \ + int i; \ + mrg->item = apr_table_copy(p, add->item); \ + for (i = 0; i < arr->nelts; i++) { \ + char *val; \ + if ((val = (char *)apr_table_get(mrg->item, entries[i].key))){ \ + continue; \ + } \ + else if ((val = (char *)apr_table_get(base->item, entries[i].key))){ \ + apr_table_set(mrg->item, entries[i].key, val); \ + } \ + } \ + } + #define merge_handlers(merge_flag, array) \ if (merge_flag(mrg)) { \ mrg->array = modperl_handler_array_merge(p, \ @@ -42,6 +60,8 @@ mrg->flags = modperl_options_merge(p, base->flags, add->flags); + merge_table_overlap_item(SetVar); + /* XXX: check if Perl*Handler is disabled */ for (i=0; i < MP_HANDLER_NUM_PER_DIR; i++) { merge_handlers(MpDirMERGE_HANDLERS, handlers_per_dir[i]); @@ -76,6 +96,8 @@ scfg->argv = apr_array_make(p, 2, sizeof(char *)); + scfg->SetVar = apr_table_make(p, 2); + modperl_config_srv_argv_push((char *)ap_server_argv0); MP_TRACE_d(MP_FUNC, "0x%lx\n", (unsigned long)scfg); @@ -90,6 +112,8 @@ dcfg->flags = modperl_options_new(p, MpDirType); + dcfg->SetVar = apr_table_make(p, 2); + MP_TRACE_d(MP_FUNC, "0x%lx\n", (unsigned long)dcfg); return dcfg; @@ -158,6 +182,8 @@ merge_item(PerlModule); merge_item(PerlRequire); + merge_table_overlap_item(SetVar); + merge_item(threaded_mpm); #ifdef USE_ITHREADS 1.51 +2 -2 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.50 retrieving revision 1.51 diff -u -r1.50 -r1.51 --- modperl_types.h 2001/09/28 15:16:06 1.50 +++ modperl_types.h 2001/09/28 19:51:40 1.51 @@ -111,7 +111,7 @@ } modperl_interp_scope_e; typedef struct { - MpHV *SetVars; + MpHV *SetVar; MpAV *PassEnv; MpAV *PerlRequire, *PerlModule; MpAV *handlers_per_srv[MP_HANDLER_NUM_PER_SRV]; @@ -138,7 +138,7 @@ char *PerlDispatchHandler; MpAV *handlers_per_dir[MP_HANDLER_NUM_PER_DIR]; MpHV *SetEnv; - MpHV *SetVars; + MpHV *SetVar; modperl_options_t *flags; #ifdef USE_ITHREADS modperl_interp_scope_e interp_scope;