From 3f7bf8ddcab526cf13f3926d1789fb0caea1e28a Mon Sep 17 00:00:00 2001 From: Graham Leggett Date: Mon, 13 Jun 2016 23:08:08 +0000 Subject: [PATCH] core: Add -DDUMP_INCLUDES configtest to show the Include tree. Example: Included configuration files: (*) .../conf/httpd.conf (517) .../conf/extra/proxy-html.conf (91) /dev/null Submitted by: Jacob Champion Reviewed by: covener, gsmith, minfrin git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1748327 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES | 4 ++++ STATUS | 12 ---------- server/config.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++ server/core.c | 22 ++++++++++++++++++ server/main.c | 5 ++++ 5 files changed, 93 insertions(+), 12 deletions(-) diff --git a/CHANGES b/CHANGES index 9f99c832e3..ffa442d132 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,10 @@ Changes with Apache 2.4.21 + *) core: Add -DDUMP_INCLUDES configtest option to show the tree + of Included configuration files. + [Jacob Champion ] + *) mod_proxy_fcgi: Avoid passing a filename of proxy:fcgi:// as SCRIPT_FILENAME to a FastCGI server. PR59618. [Jacob Champion ] diff --git a/STATUS b/STATUS index 92131a0c23..005b1ccf34 100644 --- a/STATUS +++ b/STATUS @@ -114,18 +114,6 @@ RELEASE SHOWSTOPPERS: PATCHES ACCEPTED TO BACKPORT FROM TRUNK: [ start all new proposals below, under PATCHES PROPOSED. ] - *) core: Add -DDUMP_INCLUDES configtest to show the Include tree. - - Example: - - Included configuration files: - (*) .../conf/httpd.conf - (517) .../conf/extra/proxy-html.conf - (91) /dev/null - - trunk patch: http://svn.apache.org/r1747808. - 2.4.x: trunk works - +1: covener, gsmith, minfrin PATCHES PROPOSED TO BACKPORT FROM TRUNK: diff --git a/server/config.c b/server/config.c index 2f652e8eec..7c7a1e0033 100644 --- a/server/config.c +++ b/server/config.c @@ -1790,6 +1790,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, @@ -1814,6 +1862,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); @@ -2407,6 +2459,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 43cad2dc25..e8c1ef675c 100644 --- a/server/core.c +++ b/server/core.c @@ -3172,6 +3172,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; @@ -3196,6 +3200,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 cfa5a9d3e5..c5f35b9b44 100644 --- a/server/main.c +++ b/server/main.c @@ -425,6 +425,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, @@ -524,6 +526,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': -- 2.40.0