From: Eric Covener Date: Fri, 10 Jun 2016 22:44:39 +0000 (+0000) Subject: Add -DDUMP_INCLUDES configtest option to show the tree X-Git-Tag: 2.5.0-alpha~1513 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2d0b6b55981853b713854c08a16857a450d08687;p=thirdparty%2Fapache%2Fhttpd.git Add -DDUMP_INCLUDES configtest option to show the tree of Included configuration files. Example: Included configuration files: (*) .../conf/httpd.conf (517) .../conf/extra/proxy-html.conf (91) /dev/null Submitted By: Jacob Champion Committed By: covener git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1747808 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 5dbed10d549..48efc338f39 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,9 @@ -*- coding: utf-8 -*- Changes with Apache 2.5.0 + *) core: Add -DDUMP_INCLUDES configtest option to show the tree + of Included configuration files. [Jacob Champion ] + *) mod_proxy_http2: properly care for HTTP2 flow control of the frontend connection is HTTP/1.1. [Patch supplied by Evgeny Kotkov] diff --git a/server/config.c b/server/config.c index 741bc00fd5a..b02fac2dcac 100644 --- a/server/config.c +++ b/server/config.c @@ -1797,6 +1797,54 @@ static int fname_alphasort(const void *fn1, const void *fn2) return strcmp(f1->fname,f2->fname); } +/** + * Used by -D DUMP_INCLUDES to output the config file "tree". + */ +static void dump_config_name(const char *fname, apr_pool_t *p) +{ + unsigned i, recursion, line_number; + void *data; + apr_file_t *out = NULL; + + apr_file_open_stdout(&out, p); + + /* ap_include_sentinel is defined by the core Include directive; use it to + * figure out how deep in the stack we are. + */ + apr_pool_userdata_get(&data, "ap_include_sentinel", p); + + if (data) { + recursion = *(unsigned *)data; + } else { + recursion = 0; + } + + /* Indent once for each level. */ + for (i = 0; i < (recursion + 1); ++i) { + apr_file_printf(out, " "); + } + + /* ap_include_lineno is similarly defined to tell us where in the last + * config file we were. + */ + apr_pool_userdata_get(&data, "ap_include_lineno", p); + + if (data) { + line_number = *(unsigned *)data; + } else { + line_number = 0; + } + + /* Print the line number and the name of the parsed file. */ + if (line_number > 0) { + apr_file_printf(out, "(%u)", line_number); + } else { + apr_file_printf(out, "(*)"); + } + + apr_file_printf(out, " %s\n", fname); +} + AP_DECLARE(const char *) ap_process_resource_config(server_rec *s, const char *fname, ap_directive_t **conftree, @@ -1821,6 +1869,10 @@ AP_DECLARE(const char *) ap_process_resource_config(server_rec *s, fname, &rv); } + if (ap_exists_config_define("DUMP_INCLUDES")) { + dump_config_name(fname, p); + } + parms.config_file = cfp; error = ap_build_config(&parms, p, ptemp, conftree); ap_cfg_closefile(cfp); @@ -2417,6 +2469,16 @@ AP_DECLARE(server_rec*) ap_read_config(process_rec *process, apr_pool_t *ptemp, init_config_globals(p); + if (ap_exists_config_define("DUMP_INCLUDES")) { + apr_file_t *out = NULL; + apr_file_open_stdout(&out, p); + + /* Included files will be dumped as the config is walked; print a + * header. + */ + apr_file_printf(out, "Included configuration files:\n"); + } + /* All server-wide config files now have the SAME syntax... */ error = process_command_config(s, ap_server_pre_read_config, conftree, p, ptemp); diff --git a/server/core.c b/server/core.c index 92118a59f81..8e2c1f4b168 100644 --- a/server/core.c +++ b/server/core.c @@ -3252,6 +3252,10 @@ static const char *include_config (cmd_parms *cmd, void *dummy, int optional = cmd->cmd->cmd_data ? 1 : 0; void *data; + /* NOTE: ap_include_sentinel is also used by ap_process_resource_config() + * during DUMP_INCLUDES; don't change its type or remove it without updating + * the other. + */ apr_pool_userdata_get(&data, "ap_include_sentinel", cmd->pool); if (data) { recursion = data; @@ -3276,6 +3280,24 @@ static const char *include_config (cmd_parms *cmd, void *dummy, name, NULL); } + if (ap_exists_config_define("DUMP_INCLUDES")) { + unsigned *line_number; + + /* NOTE: ap_include_lineno is used by ap_process_resource_config() + * during DUMP_INCLUDES; don't change its type or remove it without + * updating the other. + */ + apr_pool_userdata_get(&data, "ap_include_lineno", cmd->pool); + if (data) { + line_number = data; + } else { + data = line_number = apr_palloc(cmd->pool, sizeof(*line_number)); + apr_pool_userdata_setn(data, "ap_include_lineno", NULL, cmd->pool); + } + + *line_number = cmd->config_file->line_number; + } + error = ap_process_fnmatch_configs(cmd->server, conffile, &conftree, cmd->pool, cmd->temp_pool, optional); diff --git a/server/main.c b/server/main.c index bbc2b120256..351f0f1a56f 100644 --- a/server/main.c +++ b/server/main.c @@ -447,6 +447,8 @@ static void usage(process_rec *process) " -t -D DUMP_MODULES : show all loaded modules "); ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, " -M : a synonym for -t -D DUMP_MODULES"); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " -t -D DUMP_INCLUDES: show all included configuration files"); ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, " -t : run syntax check for config files"); ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, @@ -546,6 +548,9 @@ int main(int argc, const char * const argv[]) /* Setting -D DUMP_MODULES is equivalent to setting -M */ else if (strcmp(opt_arg, "DUMP_MODULES") == 0) ap_run_mode = AP_SQ_RM_CONFIG_DUMP; + /* Setting -D DUMP_INCLUDES is a type of configuration dump */ + else if (strcmp(opt_arg, "DUMP_INCLUDES") == 0) + ap_run_mode = AP_SQ_RM_CONFIG_DUMP; break; case 'e':