]> granicus.if.org Git - apache/commitdiff
mod_info: Dump config to stdout during startup if -DDUMP_CONFIG is
authorStefan Fritsch <sf@apache.org>
Mon, 28 Mar 2011 23:19:17 +0000 (23:19 +0000)
committerStefan Fritsch <sf@apache.org>
Mon, 28 Mar 2011 23:19:17 +0000 (23:19 +0000)
specified.

This functionality should probably be moved into core, but for now
it's a lot better than nothing. And it may even help me debug some
other config related code.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1086441 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
modules/generators/mod_info.c

diff --git a/CHANGES b/CHANGES
index 7f34c4b339f5fe9ec20144b31dd86c227d03b950..6960372063754b3c6e9226357f7bf322da33d625 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -2,6 +2,9 @@
 
 Changes with Apache 2.3.12
 
+  *) mod_info: Dump config to stdout during startup if -DDUMP_CONFIG is
+     specified. [Stefan Fritsch]
+
   *) Restore visibility of DEFAULT_PIDLOG to core and modules.  MPM 
      helper function ap_remove_pid() added.  [Jeff Trawick]
 
index 8baf722199675e54d9e4221b19421c77dbff54d5..03aa07e8b340c2a4eca20c6f1ecd1907d0469c22 100644 (file)
@@ -61,6 +61,7 @@
 #include "http_request.h"
 #include "util_script.h"
 #include "ap_mpm.h"
+#include <stdio.h>
 
 typedef struct
 {
@@ -75,6 +76,9 @@ typedef struct
 
 module AP_MODULE_DECLARE_DATA info_module;
 
+/* current file name when doing -DDUMP_CONFIG */
+const char *dump_config_fn_info;
+
 static void *create_info_config(apr_pool_t * p, server_rec * s)
 {
     info_svr_conf *conf =
@@ -100,34 +104,74 @@ static void put_int_flush_right(request_rec * r, int i, int field)
 {
     if (field > 1 || i > 9)
         put_int_flush_right(r, i / 10, field - 1);
-    if (i)
-        ap_rputc('0' + i % 10, r);
+    if (i) {
+        if (r)
+            ap_rputc('0' + i % 10, r);
+        else
+            putchar('0' + i % 10);
+    }
+    else {
+        if (r)
+            ap_rputs("&nbsp;", r);
+        else
+            printf(" ");
+    }
+}
+
+static void set_fn_info(request_rec *r, const char *name)
+{
+    if (r)
+        ap_set_module_config(r->request_config, &info_module, (void *)name);
+    else
+        dump_config_fn_info = name;
+}
+
+static const char *get_fn_info(request_rec *r)
+{
+    if (r)
+        return ap_get_module_config(r->request_config, &info_module);
     else
-        ap_rputs("&nbsp;", r);
+        return dump_config_fn_info;
 }
 
+
 static void mod_info_indent(request_rec * r, int nest,
                             const char *thisfn, int linenum)
 {
     int i;
-    const char *prevfn =
-        ap_get_module_config(r->request_config, &info_module);
+    const char *prevfn = get_fn_info(r);
     if (thisfn == NULL)
         thisfn = "*UNKNOWN*";
     if (prevfn == NULL || 0 != strcmp(prevfn, thisfn)) {
-        thisfn = ap_escape_html(r->pool, thisfn);
-        ap_rprintf(r, "<dd><tt><strong>In file: %s</strong></tt></dd>\n",
+        if (r) {
+            thisfn = ap_escape_html(r->pool, thisfn);
+            ap_rprintf(r, "<dd><tt><strong>In file: %s</strong></tt></dd>\n",
                    thisfn);
-        ap_set_module_config(r->request_config, &info_module,
-                             (void *) thisfn);
+        }
+        else {
+            printf("# In file: %s\n", thisfn);
+        }
+        set_fn_info(r, thisfn);
     }
 
-    ap_rputs("<dd><tt>", r);
-    put_int_flush_right(r, linenum > 0 ? linenum : 0, 4);
-    ap_rputs(":&nbsp;", r);
+    if (r) {
+        ap_rputs("<dd><tt>", r);
+        put_int_flush_right(r, linenum > 0 ? linenum : 0, 4);
+        ap_rputs(":&nbsp;", r);
+    }
+    else if (linenum > 0) {
+       for (i = 1; i <= nest; ++i)
+            printf("  ");
+        putchar('#');
+        put_int_flush_right(r, linenum, 4);
+        printf(":\n");
+    }
 
     for (i = 1; i <= nest; ++i) {
-        ap_rputs("&nbsp;&nbsp;", r);
+        if (r)
+            ap_rputs("&nbsp;&nbsp;", r);
+        else
+            printf("  ");
     }
 }
 
@@ -135,18 +179,24 @@ static void mod_info_show_cmd(request_rec * r, const ap_directive_t * dir,
                               int nest)
 {
     mod_info_indent(r, nest, dir->filename, dir->line_num);
-    ap_rprintf(r, "%s <i>%s</i></tt></dd>\n",
-               ap_escape_html(r->pool, dir->directive),
-               ap_escape_html(r->pool, dir->args));
+    if (r)
+        ap_rprintf(r, "%s <i>%s</i></tt></dd>\n",
+                   ap_escape_html(r->pool, dir->directive),
+                   ap_escape_html(r->pool, dir->args));
+    else
+        printf("%s %s\n", dir->directive, dir->args);
 }
 
 static void mod_info_show_open(request_rec * r, const ap_directive_t * dir,
                                int nest)
 {
     mod_info_indent(r, nest, dir->filename, dir->line_num);
-    ap_rprintf(r, "%s %s</tt></dd>\n",
-               ap_escape_html(r->pool, dir->directive),
-               ap_escape_html(r->pool, dir->args));
+    if (r)
+        ap_rprintf(r, "%s %s</tt></dd>\n",
+                   ap_escape_html(r->pool, dir->directive),
+                   ap_escape_html(r->pool, dir->args));
+    else
+        printf("%s %s\n", dir->directive, dir->args);
 }
 
 static void mod_info_show_close(request_rec * r, const ap_directive_t * dir,
@@ -155,11 +205,17 @@ static void mod_info_show_close(request_rec * r, const ap_directive_t * dir,
     const char *dirname = dir->directive;
     mod_info_indent(r, nest, dir->filename, 0);
     if (*dirname == '<') {
-        ap_rprintf(r, "&lt;/%s&gt;</tt></dd>",
-                   ap_escape_html(r->pool, dirname + 1));
+        if (r)
+            ap_rprintf(r, "&lt;/%s&gt;</tt></dd>",
+                       ap_escape_html(r->pool, dirname + 1));
+        else
+            printf("</%s>\n", dirname + 1);
     }
     else {
-        ap_rprintf(r, "/%s</tt></dd>", ap_escape_html(r->pool, dirname));
+        if (r)
+            ap_rprintf(r, "/%s</tt></dd>", ap_escape_html(r->pool, dirname));
+        else
+            printf("/%s\n", dirname);
     }
 }
 
@@ -189,7 +245,7 @@ static int mod_info_module_cmds(request_rec * r, const command_rec * cmds,
     int shown = from;
     ap_directive_t *dir;
     if (level == 0)
-        ap_set_module_config(r->request_config, &info_module, NULL);
+        set_fn_info(r, NULL);
     for (dir = node; dir; dir = dir->next) {
         if (dir->first_child != NULL) {
             if (level < mod_info_module_cmds(r, cmds, dir->first_child,
@@ -797,9 +853,20 @@ static const command_rec info_cmds[] = {
     {NULL}
 };
 
+static int check_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp,
+                        server_rec *s)
+{
+    if (ap_exists_config_define("DUMP_CONFIG"))
+        mod_info_module_cmds(NULL, NULL, ap_conftree, 0, 0);
+
+    return DECLINED;
+}
+
+
 static void register_hooks(apr_pool_t * p)
 {
     ap_hook_handler(display_info, NULL, NULL, APR_HOOK_MIDDLE);
+    ap_hook_check_config(check_config, NULL, NULL, APR_HOOK_FIRST);
 }
 
 AP_DECLARE_MODULE(info) = {