Commit 8776baa8 authored by Stefan Fritsch's avatar Stefan Fritsch
Browse files

mod_info: Dump config to stdout during startup if -DDUMP_CONFIG is

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
parent d484f620
Loading
Loading
Loading
Loading
+3 −0
Changes for CHANGES: 3 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -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]

+73 −6
Changes for modules/generators/mod_info.c: 73 added lines, 6 removed lines.
Original line number Diff line number Diff line
@@ -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)
    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
        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)) {
        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);
    }

    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) {
        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);
    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);
    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 == '<') {
        if (r)
            ap_rprintf(r, "&lt;/%s&gt;</tt></dd>",
                       ap_escape_html(r->pool, dirname + 1));
        else
            printf("</%s>\n", dirname + 1);
    }
    else {
        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) = {