William A. Rowe, Jr. wrote:

> It is almost worth a totally different hook entry point (before
> post_config) such as vhost_init which *would* be called per-vhost
> (starting from the main server config and working through the list.)
> 
> I have several modules with the for (s=_server; s; s = s->next) paradigm
> that would be easier to read using such a hook.  Although I'm generally
> against adding more cpu-intensive hook phases, this is an init-only hook
> so it's much easier to implement.

I had some spare time and thought I could help with the grunt work - my try
at a patch attached.

HTH

--Geoff
Index: include/http_config.h
===================================================================
RCS file: /home/cvspublic/httpd-2.0/include/http_config.h,v
retrieving revision 1.103
diff -u -r1.103 http_config.h
--- include/http_config.h       31 Oct 2003 22:00:38 -0000      1.103
+++ include/http_config.h       22 Dec 2003 17:04:39 -0000
@@ -1001,6 +1001,17 @@
 
 
 /**
+ * Run the vhost_init function for each module
+ * @param pconf The config pool
+ * @param plog The logging streams pool
+ * @param ptemp The temporary pool
+ * @param s The virtual host to initialize
+ * @return OK or DECLINED on success anything else is a error
+ */
+AP_DECLARE_HOOK(int,vhost_init,(apr_pool_t *pconf,apr_pool_t *plog,
+                                apr_pool_t *ptemp,server_rec *s))
+
+/**
  * Run the post_config function for each module
  * @param pconf The config pool
  * @param plog The logging streams pool
Index: server/config.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/server/config.c,v
retrieving revision 1.167
diff -u -r1.167 config.c
--- server/config.c     11 Oct 2003 06:37:45 -0000      1.167
+++ server/config.c     22 Dec 2003 17:04:40 -0000
@@ -109,6 +109,7 @@
 APR_HOOK_STRUCT(
            APR_HOOK_LINK(header_parser)
            APR_HOOK_LINK(pre_config)
+           APR_HOOK_LINK(vhost_init)
            APR_HOOK_LINK(post_config)
            APR_HOOK_LINK(open_logs)
            APR_HOOK_LINK(child_init)
@@ -124,6 +125,11 @@
                           (apr_pool_t *pconf, apr_pool_t *plog,
                            apr_pool_t *ptemp),
                           (pconf, plog, ptemp), OK, DECLINED)
+
+AP_IMPLEMENT_HOOK_RUN_ALL(int, vhost_init,
+                          (apr_pool_t *pconf, apr_pool_t *plog,
+                           apr_pool_t *ptemp, server_rec *s),
+                          (pconf, plog, ptemp, s), OK, DECLINED)
 
 AP_IMPLEMENT_HOOK_RUN_ALL(int, post_config,
                           (apr_pool_t *pconf, apr_pool_t *plog,
Index: server/main.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/server/main.c,v
retrieving revision 1.149
diff -u -r1.149 main.c
--- server/main.c       10 Dec 2003 13:43:14 -0000      1.149
+++ server/main.c       22 Dec 2003 17:04:41 -0000
@@ -444,6 +444,7 @@
     const char *temp_error_log = NULL;
     process_rec *process;
     server_rec *server_conf;
+    server_rec *s; /* vhost-specific server_rec */
     apr_pool_t *pglobal;
     apr_pool_t *pconf;
     apr_pool_t *plog; /* Pool of log streams, reset _after_ each read of conf */
@@ -649,6 +656,14 @@
         destroy_and_exit_process(process, 1);
     }
 
+    for (s = server_conf; s; s = s->next) {
+        if ( ap_run_vhost_init(pconf, plog, ptemp, s) != OK) {
+            ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR,
+                         0, NULL, "Unable to initialize virtual hosts\n");
+            destroy_and_exit_process(process, 1);
+       }
+    }
+
     if ( ap_run_post_config(pconf, plog, ptemp, server_conf) != OK) {
         ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR, 0,
                      NULL, "Configuration Failed\n");
@@ -692,6 +707,14 @@
             ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR,
                          0, NULL, "Unable to open logs\n");
             destroy_and_exit_process(process, 1);
+        }
+
+        for (s = server_conf; s; s = s->next) {
+            if ( ap_run_vhost_init(pconf, plog, ptemp, s) != OK) {
+                ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR,
+                             0, NULL, "Unable to initialize virtual hosts\n");
+                destroy_and_exit_process(process, 1);
+            }
         }
 
         if (ap_run_post_config(pconf, plog, ptemp, server_conf) != OK) {
Index: modules/experimental/mod_example.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/modules/experimental/mod_example.c,v
retrieving revision 1.44
diff -u -r1.44 mod_example.c
--- modules/experimental/mod_example.c  13 Dec 2003 15:41:33 -0000      1.44
+++ modules/experimental/mod_example.c  22 Dec 2003 17:12:18 -0000
@@ -859,6 +859,25 @@
 }
 
 /*
+ * This routine is called to do virtual host initialization.
+ * It is invoked just before the post_config phase.
+ *
+ * The return value is OK, DECLINED, or HTTP_mumble.  If we return OK, the
+ * server will still call any remaining modules with an handler for this
+ * phase.
+ */
+static int x_vhost_init(apr_pool_t *pconf, apr_pool_t *plog,
+                        apr_pool_t *ptemp, server_rec *s)
+{
+    /*
+     * Log the call and exit.
+     */
+    trace_add(s, NULL, NULL, apr_psprintf(ptemp, "x_vhost_init() for %s host %s",
+                                         s->is_virtual ? "virtual" : "", 
+                                         s->server_hostname));
+    return OK;
+}
+/*
  * This routine is called to perform any module-specific fixing of header
  * fields, et cetera.  It is invoked just before any content-handler.
  *
@@ -872,13 +891,13 @@
     /*
      * Log the call and exit.
      */
-    trace_add(NULL, NULL, NULL, "x_post_config()");
+    trace_add(s, NULL, NULL, "x_post_config()");
     return OK;
 }
 
 /*
  * This routine is called to perform any module-specific log file
- * openings. It is invoked just before the post_config phase
+ * openings. It is invoked just before the vhost_init phase
  *
  * The return value is OK, DECLINED, or HTTP_mumble.  If we return OK, the
  * server will still call any remaining modules with an handler for this
@@ -1306,6 +1325,7 @@
     ap_hook_pre_config(x_pre_config, NULL, NULL, APR_HOOK_MIDDLE);
     ap_hook_post_config(x_post_config, NULL, NULL, APR_HOOK_MIDDLE);
     ap_hook_open_logs(x_open_logs, NULL, NULL, APR_HOOK_MIDDLE);
+    ap_hook_vhost_init(x_vhost_init, NULL, NULL, APR_HOOK_MIDDLE);
     ap_hook_child_init(x_child_init, NULL, NULL, APR_HOOK_MIDDLE);
     ap_hook_handler(x_handler, NULL, NULL, APR_HOOK_MIDDLE);
     ap_hook_quick_handler(x_quick_handler, NULL, NULL, APR_HOOK_MIDDLE);

Reply via email to