summaryrefslogtreecommitdiff
path: root/server/config.c
diff options
context:
space:
mode:
authorYann Ylavic <ylavic@apache.org>2017-09-22 11:58:53 +0000
committerYann Ylavic <ylavic@apache.org>2017-09-22 11:58:53 +0000
commite18300e525d847c3872551fca217f8de96c620e4 (patch)
tree5c88d341cfcdae5e3aea1f89213336ce22d06c0c /server/config.c
parentb5bdda40732e743a532c115d74b860c995878e76 (diff)
downloadhttpd-e18300e525d847c3872551fca217f8de96c620e4.tar.gz
config: allow to specify flags when registering modules.
First one is AP_MODULE_FLAG_ALWAYS_MERGE. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1809302 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'server/config.c')
-rw-r--r--server/config.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/server/config.c b/server/config.c
index 8c8acbcb2d..74674a52fc 100644
--- a/server/config.c
+++ b/server/config.c
@@ -323,24 +323,36 @@ static ap_conf_vector_t *create_server_config(apr_pool_t *p, server_rec *s)
}
static void merge_server_configs(apr_pool_t *p, ap_conf_vector_t *base,
- ap_conf_vector_t *virt)
+ server_rec *virt)
{
/* Can reuse the 'virt' vector for the spine of it, since we don't
* have to deal with the moral equivalent of .htaccess files here...
*/
void **base_vector = (void **)base;
- void **virt_vector = (void **)virt;
+ void **virt_vector = (void **)virt->module_config;
module *modp;
for (modp = ap_top_module; modp; modp = modp->next) {
merger_func df = modp->merge_server_config;
int i = modp->module_index;
- if (!virt_vector[i])
- virt_vector[i] = base_vector[i];
- else if (df)
+ if (!virt_vector[i]) {
+#if AP_MODULE_HAS_FLAGS
+ if (df && modp->create_server_config
+ && modp->flags & AP_MODULE_FLAG_ALWAYS_MERGE) {
+ virt_vector[i] = (*modp->create_server_config)(p, virt);
+ }
+ else
+#endif
+ {
+ virt_vector[i] = base_vector[i];
+ df = NULL;
+ }
+ }
+ if (df) {
virt_vector[i] = (*df)(p, base_vector[i], virt_vector[i]);
+ }
}
}
@@ -2334,8 +2346,7 @@ AP_DECLARE(void) ap_fixup_virtual_hosts(apr_pool_t *p, server_rec *main_server)
dconf->log = &main_server->log;
for (virt = main_server->next; virt; virt = virt->next) {
- merge_server_configs(p, main_server->module_config,
- virt->module_config);
+ merge_server_configs(p, main_server->module_config, virt);
virt->lookup_defaults =
ap_merge_per_dir_configs(p, main_server->lookup_defaults,