From: Aaron Bannert Date: Mon, 28 Jan 2002 23:49:40 +0000 (+0000) Subject: The pre_config hook now takes a return value. This allows modules to X-Git-Tag: 2.0.31~58 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d5fdaf9cfd13df146fd3b19ab07a88ff5bd91bcb;p=apache The pre_config hook now takes a return value. This allows modules to cause the server to bail out under error conditions. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@93063 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/include/ap_mmn.h b/include/ap_mmn.h index 8e5a0aaf27..9cc96c832c 100644 --- a/include/ap_mmn.h +++ b/include/ap_mmn.h @@ -94,6 +94,7 @@ * a GET request * 20020118 (2.0.31-dev) Input filtering split of blocking and mode * 20020127 (2.0.31-dev) bump for pre_mpm hook change + * 20020128 (2.0.31-dev) bump for pre_config hook change */ #define MODULE_MAGIC_COOKIE 0x41503230UL /* "AP20" */ diff --git a/include/http_config.h b/include/http_config.h index 22b901e282..9ef52f0d04 100644 --- a/include/http_config.h +++ b/include/http_config.h @@ -970,8 +970,9 @@ AP_DECLARE_HOOK(int,header_parser,(request_rec *r)) * @param pconf The config pool * @param plog The logging streams pool * @param ptemp The temporary pool + * @return OK or DECLINED on success anything else is a error */ -AP_DECLARE_HOOK(void,pre_config,(apr_pool_t *pconf,apr_pool_t *plog,apr_pool_t *ptemp)) +AP_DECLARE_HOOK(int,pre_config,(apr_pool_t *pconf,apr_pool_t *plog,apr_pool_t *ptemp)) /** * Run the post_config function for each module diff --git a/modules/arch/netware/mod_nw_ssl.c b/modules/arch/netware/mod_nw_ssl.c index f507fab74a..ab8cec51e4 100644 --- a/modules/arch/netware/mod_nw_ssl.c +++ b/modules/arch/netware/mod_nw_ssl.c @@ -334,10 +334,12 @@ static apr_status_t nwssl_socket_cleanup(void *data) return APR_SUCCESS; } -static void nwssl_pre_config(apr_pool_t *pconf, apr_pool_t *plog, +static int nwssl_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp) { ap_seclisteners = NULL; + + return OK; } static int nwssl_post_config(apr_pool_t *pconf, apr_pool_t *plog, diff --git a/modules/experimental/mod_example.c b/modules/experimental/mod_example.c index dfeba1119c..a42926bfa3 100644 --- a/modules/experimental/mod_example.c +++ b/modules/experimental/mod_example.c @@ -847,13 +847,15 @@ static void *x_merge_server_config(apr_pool_t *p, void *server1_conf, * This routine is called before the server processes the configuration * files. There is no return value. */ -static void x_pre_config(apr_pool_t *pconf, apr_pool_t *plog, - apr_pool_t *ptemp) +static int x_pre_config(apr_pool_t *pconf, apr_pool_t *plog, + apr_pool_t *ptemp) { /* * Log the call and exit. */ trace_add(NULL, NULL, NULL, "x_pre_config()"); + + return OK; } /* diff --git a/modules/loggers/mod_log_config.c b/modules/loggers/mod_log_config.c index 0b86f7df74..71ba616ec8 100644 --- a/modules/loggers/mod_log_config.c +++ b/modules/loggers/mod_log_config.c @@ -1194,7 +1194,7 @@ static void ap_register_log_handler(apr_pool_t *p, char *tag, apr_hash_set(log_hash, tag, 1, (const void *)log_struct); } -static void log_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp) +static int log_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp) { static APR_OPTIONAL_FN_TYPE(ap_register_log_handler) *log_pfn_register; @@ -1229,6 +1229,8 @@ static void log_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp) log_pfn_register(p, "U", log_request_uri, 1); log_pfn_register(p, "s", log_status, 1); } + + return OK; } static void register_hooks(apr_pool_t *p) diff --git a/modules/metadata/mod_headers.c b/modules/metadata/mod_headers.c index 2d356780bd..2e06ad52a6 100644 --- a/modules/metadata/mod_headers.c +++ b/modules/metadata/mod_headers.c @@ -605,12 +605,14 @@ static void register_format_tag_handler(apr_pool_t *p, char *tag, void *tag_hand h = tag_handler; apr_hash_set(format_tag_hash, tag, 1, h); } -static void header_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp) +static int header_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp) { format_tag_hash = apr_hash_make(p); register_format_tag_handler(p, "D", (void*) header_request_duration, 0); register_format_tag_handler(p, "t", (void*) header_request_time, 0); register_format_tag_handler(p, "e", (void*) header_request_env_var, 0); + + return OK; } static void register_hooks(apr_pool_t *p) diff --git a/modules/ssl/mod_ssl.c b/modules/ssl/mod_ssl.c index 71a81e26e7..4a7082469d 100644 --- a/modules/ssl/mod_ssl.c +++ b/modules/ssl/mod_ssl.c @@ -204,7 +204,7 @@ static const command_rec ssl_config_cmds[] = { * the various processing hooks */ -static void ssl_hook_pre_config( +static int ssl_hook_pre_config( apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp) { /* Register us to handle mod_log_config %c/%x variables */ @@ -215,6 +215,8 @@ static void ssl_hook_pre_config( /* XXX: Register us to handle mod_status extensions that don't exist yet */ ssl_scache_status_register(pconf); #endif /* -0- */ + + return OK; } static int ssl_hook_pre_connection(conn_rec *c) diff --git a/server/config.c b/server/config.c index 5b61ad3c9b..d198aa51f5 100644 --- a/server/config.c +++ b/server/config.c @@ -118,9 +118,9 @@ APR_HOOK_STRUCT( AP_IMPLEMENT_HOOK_RUN_ALL(int,header_parser, (request_rec *r),(r),OK,DECLINED) -AP_IMPLEMENT_HOOK_VOID(pre_config, +AP_IMPLEMENT_HOOK_RUN_ALL(int,pre_config, (apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp), - (pconf,plog,ptemp)) + (pconf,plog,ptemp),OK,DECLINED) AP_IMPLEMENT_HOOK_RUN_ALL(int,post_config, (apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s),(pconf,plog,ptemp,s),OK,DECLINED) diff --git a/server/main.c b/server/main.c index f958675226..763584e59c 100644 --- a/server/main.c +++ b/server/main.c @@ -433,7 +433,10 @@ int main(int argc, const char * const argv[]) ap_server_root = def_server_root; server_conf = ap_read_config(process, ptemp, confname, &ap_conftree); - ap_run_pre_config(pconf, plog, ptemp); + if (ap_run_pre_config(pconf, plog, ptemp) != OK) { + ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR| APLOG_NOERRNO, 0, NULL, "Pre-configuration failed\n"); + destroy_and_exit_process(process, 1); + } ap_process_config_tree(server_conf, ap_conftree, process->pconf, ptemp); ap_fixup_virtual_hosts(pconf, server_conf); ap_fini_vhost_config(pconf, server_conf); @@ -469,7 +472,10 @@ int main(int argc, const char * const argv[]) apr_pool_create(&ptemp, pconf); ap_server_root = def_server_root; server_conf = ap_read_config(process, ptemp, confname, &ap_conftree); - ap_run_pre_config(pconf, plog, ptemp); + if (ap_run_pre_config(pconf, plog, ptemp) != OK) { + ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR| APLOG_NOERRNO, 0, NULL, "Pre-configuration failed\n"); + destroy_and_exit_process(process, 1); + } ap_process_config_tree(server_conf, ap_conftree, process->pconf, ptemp); ap_fixup_virtual_hosts(pconf, server_conf); ap_fini_vhost_config(pconf, server_conf); diff --git a/server/mpm/beos/beos.c b/server/mpm/beos/beos.c index 97fd7afa72..2f059eae21 100644 --- a/server/mpm/beos/beos.c +++ b/server/mpm/beos/beos.c @@ -992,7 +992,7 @@ int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s) return 0; } -static void beos_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp) +static int beos_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp) { static int restart_num = 0; int no_detach, debug; @@ -1028,6 +1028,8 @@ static void beos_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *pte ap_scoreboard_fname = DEFAULT_SCOREBOARD; apr_cpystrn(ap_coredump_dir, ap_server_root, sizeof(ap_coredump_dir)); + + return OK; } static void beos_hooks(apr_pool_t *p) diff --git a/server/mpm/experimental/perchild/perchild.c b/server/mpm/experimental/perchild/perchild.c index ff91d30d1a..5bf52b9465 100644 --- a/server/mpm/experimental/perchild/perchild.c +++ b/server/mpm/experimental/perchild/perchild.c @@ -1424,7 +1424,7 @@ int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s) return 0; } -static void perchild_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp) +static int perchild_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp) { static int restart_num = 0; int no_detach, debug; @@ -1497,6 +1497,8 @@ static void perchild_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *pte child_info_table[i].gid = -1; child_info_table[i].sd = -1; } + + return OK; } static int pass_request(request_rec *r) diff --git a/server/mpm/mpmt_os2/mpmt_os2.c b/server/mpm/mpmt_os2/mpmt_os2.c index 7cd31b5c0e..61d75aafc5 100644 --- a/server/mpm/mpmt_os2/mpmt_os2.c +++ b/server/mpm/mpmt_os2/mpmt_os2.c @@ -494,7 +494,7 @@ int ap_graceful_stop_signalled(void) /* Configuration handling stuff */ -static void mpmt_os2_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp) +static int mpmt_os2_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp) { one_process = ap_exists_config_define("ONE_PROCESS") || ap_exists_config_define("DEBUG"); @@ -507,6 +507,8 @@ static void mpmt_os2_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t ap_extended_status = 0; ap_min_spare_threads = DEFAULT_MIN_SPARE_THREAD; ap_max_spare_threads = DEFAULT_MAX_SPARE_THREAD; + + return OK; } diff --git a/server/mpm/netware/mpm_netware.c b/server/mpm/netware/mpm_netware.c index dbe0a98bc0..80febdb0d3 100644 --- a/server/mpm/netware/mpm_netware.c +++ b/server/mpm/netware/mpm_netware.c @@ -953,7 +953,7 @@ int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s) return 0; } -static void netware_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp) +static int netware_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp) { int debug; @@ -970,6 +970,8 @@ static void netware_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptem ap_scoreboard_fname = DEFAULT_SCOREBOARD; ap_max_requests_per_child = DEFAULT_MAX_REQUESTS_PER_CHILD; ap_extended_status = 0; + + return OK; } static void netware_mpm_hooks(apr_pool_t *p) diff --git a/server/mpm/perchild/perchild.c b/server/mpm/perchild/perchild.c index ff91d30d1a..5bf52b9465 100644 --- a/server/mpm/perchild/perchild.c +++ b/server/mpm/perchild/perchild.c @@ -1424,7 +1424,7 @@ int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s) return 0; } -static void perchild_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp) +static int perchild_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp) { static int restart_num = 0; int no_detach, debug; @@ -1497,6 +1497,8 @@ static void perchild_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *pte child_info_table[i].gid = -1; child_info_table[i].sd = -1; } + + return OK; } static int pass_request(request_rec *r) diff --git a/server/mpm/prefork/prefork.c b/server/mpm/prefork/prefork.c index 5d48e73ee5..42e1fd9c0c 100644 --- a/server/mpm/prefork/prefork.c +++ b/server/mpm/prefork/prefork.c @@ -1200,7 +1200,7 @@ int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s) return 0; } -static void prefork_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp) +static int prefork_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp) { static int restart_num = 0; int no_detach, debug; @@ -1239,6 +1239,8 @@ static void prefork_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptem ap_extended_status = 0; apr_cpystrn(ap_coredump_dir, ap_server_root, sizeof(ap_coredump_dir)); + + return OK; } static void prefork_hooks(apr_pool_t *p) diff --git a/server/mpm/winnt/mpm_winnt.c b/server/mpm/winnt/mpm_winnt.c index fb3236ba8e..b3488a1dee 100644 --- a/server/mpm/winnt/mpm_winnt.c +++ b/server/mpm/winnt/mpm_winnt.c @@ -1933,7 +1933,7 @@ void winnt_rewrite_args(process_rec *process) } -static void winnt_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp) +static int winnt_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp) { /* Handle the following SCM aspects in this phase: * @@ -1955,6 +1955,7 @@ static void winnt_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *pt ap_log_error(APLOG_MARK,APLOG_CRIT, service_to_start_success, NULL, "%s: Unable to start the service manager.", service_name); + /* XXX: return HTTP_INTERNAL_SERVER_ERROR? */ exit(1); } @@ -1974,6 +1975,8 @@ static void winnt_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *pt ap_max_requests_per_child = DEFAULT_MAX_REQUESTS_PER_CHILD; apr_cpystrn(ap_coredump_dir, ap_server_root, sizeof(ap_coredump_dir)); + + return OK; } static int winnt_post_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec* server) diff --git a/server/mpm/worker/worker.c b/server/mpm/worker/worker.c index 07bdf803a0..1b23c65048 100644 --- a/server/mpm/worker/worker.c +++ b/server/mpm/worker/worker.c @@ -1540,7 +1540,7 @@ int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s) return 0; } -static void worker_pre_config(apr_pool_t *pconf, apr_pool_t *plog, +static int worker_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp) { static int restart_num = 0; @@ -1618,6 +1618,8 @@ static void worker_pre_config(apr_pool_t *pconf, apr_pool_t *plog, ap_extended_status = 0; apr_cpystrn(ap_coredump_dir, ap_server_root, sizeof(ap_coredump_dir)); + + return OK; } static void worker_hooks(apr_pool_t *p)