From e90c8e59a93e5dde747e6dec7b960d2a6f2523ab Mon Sep 17 00:00:00 2001
From: Alexander Chernyakhovsky <achernya@mit.edu>
Date: Fri, 3 May 2013 22:43:28 -0400
Subject: [PATCH] Export method to fixup a single virtual host

Apache normally provides ap_fixup_virtual_hosts, which merges the
configuration from the main server into each virtual host.  Refactor
this code to allow merging the configuration into a single virtual
host, and export this method for use in mod_vhost_ldap.

Additionally, call the newly created method in the loop in
ap_fixup_virtual_hosts.
---
 include/http_config.h |  9 ++++++++
 server/config.c       | 58 ++++++++++++++++++++++++++++-----------------------
 2 files changed, 41 insertions(+), 26 deletions(-)

diff --git a/include/http_config.h b/include/http_config.h
index 7ee3760..e3657ea 100644
--- a/include/http_config.h
+++ b/include/http_config.h
@@ -1012,6 +1012,15 @@ AP_DECLARE(void) ap_register_hooks(module *m, apr_pool_t *p);
  */
 AP_DECLARE(void) ap_fixup_virtual_hosts(apr_pool_t *p,
                                         server_rec *main_server);
+/**
+ * Setup all virtual hosts
+ * @param p The pool to allocate from
+ * @param main_server The head of the server_rec list
+ * @param virt The individual virtual host to fix
+ */
+AP_DECLARE(void) ap_fixup_virtual_host(apr_pool_t *p,
+				       server_rec *main_server,
+				       server_rec *virt);
 
 /**
  * Reserve some modules slots for modules loaded by other means than
diff --git a/server/config.c b/server/config.c
index c1aae17..254c5d2 100644
--- a/server/config.c
+++ b/server/config.c
@@ -2245,46 +2245,52 @@ AP_DECLARE(void) ap_merge_log_config(const struct ap_logconf *old_conf,
     }
 }
 
-AP_DECLARE(void) ap_fixup_virtual_hosts(apr_pool_t *p, server_rec *main_server)
+AP_DECLARE(void) ap_fixup_virtual_host(apr_pool_t *p, server_rec *main_server,
+				       server_rec *virt)
 {
-    server_rec *virt;
     core_dir_config *dconf =
         ap_get_core_module_config(main_server->lookup_defaults);
     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->module_config);
 
-        virt->lookup_defaults =
-            ap_merge_per_dir_configs(p, main_server->lookup_defaults,
-                                     virt->lookup_defaults);
+    virt->lookup_defaults =
+	ap_merge_per_dir_configs(p, main_server->lookup_defaults,
+				 virt->lookup_defaults);
 
-        if (virt->server_admin == NULL)
-            virt->server_admin = main_server->server_admin;
+    if (virt->server_admin == NULL)
+	virt->server_admin = main_server->server_admin;
 
-        if (virt->timeout == 0)
-            virt->timeout = main_server->timeout;
+    if (virt->timeout == 0)
+	virt->timeout = main_server->timeout;
 
-        if (virt->keep_alive_timeout == 0)
-            virt->keep_alive_timeout = main_server->keep_alive_timeout;
+    if (virt->keep_alive_timeout == 0)
+	virt->keep_alive_timeout = main_server->keep_alive_timeout;
 
-        if (virt->keep_alive == -1)
-            virt->keep_alive = main_server->keep_alive;
+    if (virt->keep_alive == -1)
+	virt->keep_alive = main_server->keep_alive;
 
-        if (virt->keep_alive_max == -1)
-            virt->keep_alive_max = main_server->keep_alive_max;
+    if (virt->keep_alive_max == -1)
+	virt->keep_alive_max = main_server->keep_alive_max;
 
-        ap_merge_log_config(&main_server->log, &virt->log);
+    ap_merge_log_config(&main_server->log, &virt->log);
 
-        dconf = ap_get_core_module_config(virt->lookup_defaults);
-        dconf->log = &virt->log;
+    dconf = ap_get_core_module_config(virt->lookup_defaults);
+    dconf->log = &virt->log;
 
-        /* XXX: this is really something that should be dealt with by a
-         * post-config api phase
-         */
-        ap_core_reorder_directories(p, virt);
-    }
+    /* XXX: this is really something that should be dealt with by a
+     * post-config api phase
+     */
+    ap_core_reorder_directories(p, virt);
+}
+
+AP_DECLARE(void) ap_fixup_virtual_hosts(apr_pool_t *p, server_rec *main_server)
+{
+    server_rec *virt;
+    
+    for (virt = main_server->next; virt; virt = virt->next)
+        ap_fixup_virtual_host(p, main_server, virt);
 
     ap_core_reorder_directories(p, main_server);
 }
-- 
1.8.1.2

