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;