From: Ryan Bloom Date: Sat, 3 Jun 2000 16:27:03 +0000 (+0000) Subject: Modify the config order so that we read the config, process all EXEC_ON_READ X-Git-Tag: APACHE_2_0_ALPHA_4~10 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=71d8e39db698e32f9d5143f11eac94d2af81db62;p=thirdparty%2Fapache%2Fhttpd.git Modify the config order so that we read the config, process all EXEC_ON_READ directives at the same time, run pre_config hook for all modules, and then walk the tree. This allows all modules to have a pre_config hook and know that it will be called at a reasonable time. I also made "Include" an EXEC_ON_READ directive so that it is included in the tree properly. This was required after the other changes that were made. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@85393 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/include/http_config.h b/include/http_config.h index efe0af0368d..d1c70d1bba7 100644 --- a/include/http_config.h +++ b/include/http_config.h @@ -380,7 +380,7 @@ void ap_single_module_configure(ap_pool_t *p, server_rec *s, module *m); API_EXPORT(void) ap_setup_prelinked_modules(process_rec *process); API_EXPORT(void) ap_show_directives(void); API_EXPORT(void) ap_show_modules(void); -API_EXPORT(server_rec*) ap_read_config(process_rec *process, ap_pool_t *temp_pool, const char *config_name); +API_EXPORT(server_rec*) ap_read_config(process_rec *process, ap_pool_t *temp_pool, const char *config_name, ap_directive_t **conftree); API_EXPORT(void) ap_pre_config_hook(ap_pool_t *pconf, ap_pool_t *plog, ap_pool_t *ptemp, server_rec *s); API_EXPORT(void) ap_post_config_hook(ap_pool_t *pconf, ap_pool_t *plog, ap_pool_t *ptemp, server_rec *s); API_EXPORT(void) ap_run_rewrite_args(process_rec *process); @@ -403,7 +403,11 @@ int ap_parse_htaccess(void **result, request_rec *r, int override, CORE_EXPORT(const char *) ap_init_virtual_host(ap_pool_t *p, const char *hostname, server_rec *main_server, server_rec **); -void ap_process_resource_config(server_rec *s, const char *fname, ap_pool_t *p, ap_pool_t *ptemp); +void ap_process_resource_config(server_rec *s, const char *fname, + ap_directive_t **conftree, ap_pool_t *p, ap_pool_t *ptemp); +void ap_process_config_tree(server_rec *s, ap_directive_t *conftree, + ap_pool_t *p, ap_pool_t *ptemp); + /* For individual MPMs... */ diff --git a/modules/http/http_core.c b/modules/http/http_core.c index b8aa78a84b6..6de6ff3c978 100644 --- a/modules/http/http_core.c +++ b/modules/http/http_core.c @@ -1924,11 +1924,14 @@ static const char *set_use_canonical_name(cmd_parms *cmd, core_dir_config *d, } -static const char *include_config (cmd_parms *cmd, void *dummy, char *name) +static const char *include_config (cmd_parms *cmd, void **dummy, char *name) { + ap_directive_t *conftree = NULL; + ap_process_resource_config(cmd->server, ap_server_root_relative(cmd->pool, name), - cmd->pool, cmd->temp_pool); + &conftree, cmd->pool, cmd->temp_pool); + *(ap_directive_t **)dummy = conftree; return NULL; } @@ -2269,7 +2272,7 @@ static const command_rec core_cmds[] = { { "ClearModuleList", clear_module_list_command, NULL, RSRC_CONF | EXEC_ON_READ, NO_ARGS, NULL }, /* TODO: ListenBacklog in MPM */ -{ "Include", include_config, NULL, (RSRC_CONF | ACCESS_CONF), TAKE1, +{ "Include", include_config, NULL, (RSRC_CONF | ACCESS_CONF | EXEC_ON_READ), TAKE1, "Name of the config file to be included" }, { "LogLevel", set_loglevel, NULL, RSRC_CONF, TAKE1, "Level of verbosity in error logging" }, diff --git a/server/config.c b/server/config.c index 4722425183d..831039c9469 100644 --- a/server/config.c +++ b/server/config.c @@ -1052,12 +1052,16 @@ API_EXPORT(const char *) ap_build_config(cmd_parms *parms, ap_pool_t *p, ap_pool_t *temp_pool, ap_directive_t **conftree) { - ap_directive_t *current = NULL; + ap_directive_t *current = *conftree; ap_directive_t *curr_parent = NULL; char l[MAX_STRING_LEN]; const char *errmsg; - *conftree = NULL; + if (current != NULL) { + while (current->next) { + current = current->next; + } + } while (!(ap_cfg_getline(l, MAX_STRING_LEN, parms->config_file))) { @@ -1246,13 +1250,13 @@ static int arr_elts_close(void *param) return 0; } -static void process_command_config(server_rec *s, ap_array_header_t *arr, ap_pool_t *p, - ap_pool_t *ptemp) +static void process_command_config(server_rec *s, ap_array_header_t *arr, + ap_directive_t **conftree, ap_pool_t *p, + ap_pool_t *ptemp) { const char *errmsg; cmd_parms parms; arr_elts_param_t arr_parms; - ap_directive_t *conftree; arr_parms.curr_idx = 0; arr_parms.array = arr; @@ -1267,9 +1271,7 @@ static void process_command_config(server_rec *s, ap_array_header_t *arr, ap_poo &arr_parms, NULL, arr_elts_getstr, arr_elts_close); - errmsg = ap_build_config(&parms, p, ptemp, &conftree); - if (errmsg == NULL) - errmsg = ap_walk_config(conftree, &parms, s->lookup_defaults); + errmsg = ap_build_config(&parms, p, ptemp, conftree); if (errmsg) { ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, "Syntax error in -C/-c directive:\n%s", errmsg); @@ -1279,11 +1281,12 @@ static void process_command_config(server_rec *s, ap_array_header_t *arr, ap_poo ap_cfg_closefile(parms.config_file); } -void ap_process_resource_config(server_rec *s, const char *fname, ap_pool_t *p, ap_pool_t *ptemp) +void ap_process_resource_config(server_rec *s, const char *fname, + ap_directive_t **conftree, ap_pool_t *p, + ap_pool_t *ptemp) { cmd_parms parms; ap_finfo_t finfo; - ap_directive_t *conftree; const char *errmsg; configfile_t *cfp; @@ -1312,9 +1315,8 @@ void ap_process_resource_config(server_rec *s, const char *fname, ap_pool_t *p, } parms.config_file = cfp; - errmsg = ap_build_config(&parms, p, ptemp, &conftree); - if (errmsg == NULL) - errmsg = ap_walk_config(conftree, &parms, s->lookup_defaults); + + errmsg = ap_build_config(&parms, p, ptemp, conftree); if (errmsg != NULL) { ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, @@ -1329,6 +1331,29 @@ void ap_process_resource_config(server_rec *s, const char *fname, ap_pool_t *p, ap_cfg_closefile(cfp); } +void ap_process_config_tree(server_rec *s, ap_directive_t *conftree, + ap_pool_t *p, ap_pool_t *ptemp) +{ + const char *errmsg; + cmd_parms parms; + + parms = default_parms; + parms.pool = p; + parms.temp_pool = ptemp; + parms.server = s; + parms.override = (RSRC_CONF | OR_ALL) & ~(OR_AUTHCFG | OR_LIMIT); + + errmsg = ap_walk_config(conftree, &parms, s->lookup_defaults); + if (errmsg) { + ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, + "Syntax error on line %d of %s:", + parms.err_directive->line_num, + parms.err_directive->filename); + ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, + "%s", errmsg); + exit(1); + } +} int ap_parse_htaccess(void **result, request_rec *r, int override, const char *d, const char *access_name) @@ -1547,7 +1572,8 @@ static server_rec *init_server_config(process_rec *process, ap_pool_t *p) API_EXPORT(server_rec*) ap_read_config(process_rec *process, ap_pool_t *ptemp, - const char *confname) + const char *confname, + ap_directive_t **conftree) { ap_pool_t *p = process->pconf; server_rec *s = init_server_config(process, p); @@ -1556,11 +1582,13 @@ API_EXPORT(server_rec*) ap_read_config(process_rec *process, ap_pool_t *ptemp, /* All server-wide config files now have the SAME syntax... */ - process_command_config(s, ap_server_pre_read_config, p, ptemp); + process_command_config(s, ap_server_pre_read_config, conftree, + p, ptemp); - ap_process_resource_config(s, confname, p, ptemp); + ap_process_resource_config(s, confname, conftree, p, ptemp); - process_command_config(s, ap_server_post_read_config, p, ptemp); + process_command_config(s, ap_server_post_read_config, conftree, + p, ptemp); fixup_virtual_hosts(p, s); ap_fini_vhost_config(p, s); diff --git a/server/main.c b/server/main.c index 0ec8278f75f..d296012951e 100644 --- a/server/main.c +++ b/server/main.c @@ -296,6 +296,7 @@ API_EXPORT(int) main(int argc, char *argv[]) ap_pool_t *ptemp; /* Pool for temporary config stuff, reset often */ ap_pool_t *pcommands; /* Pool for -D, -C and -c switches */ module **mod; + ap_directive_t *conftree = NULL; #ifndef WIN32 /* done in main_win32.c */ ap_initialize(); @@ -379,8 +380,9 @@ API_EXPORT(int) main(int argc, char *argv[]) for example, to settle down. */ ap_server_root = def_server_root; + server_conf = ap_read_config(process, ptemp, confname, &conftree); ap_run_pre_config(pconf, plog, ptemp); - server_conf = ap_read_config(process, ptemp, confname); + ap_process_config_tree(server_conf, conftree, process->pconf, ptemp); if (configtestonly) { ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, "Syntax OK\n"); destroy_and_exit_process(process, 0); @@ -396,10 +398,16 @@ API_EXPORT(int) main(int argc, char *argv[]) for (mod = ap_prelinked_modules; *mod != NULL; mod++) { ap_register_hooks(*mod); } + /* This is a hack until we finish the code so that it only reads + * the config file once and just operates on the tree already in + * memory. rbb + */ + conftree = NULL; ap_create_pool(&ptemp, pconf); ap_server_root = def_server_root; + server_conf = ap_read_config(process, ptemp, confname, &conftree); ap_run_pre_config(pconf, plog, ptemp); - server_conf = ap_read_config(process, ptemp, confname); + ap_process_config_tree(server_conf, conftree, process->pconf, ptemp); ap_clear_pool(plog); ap_run_open_logs(pconf, plog, ptemp, server_conf); ap_post_config_hook(pconf, plog, ptemp, server_conf);