#include "http_log.h"
#include "http_config.h"
#include "http_core.h"
+#include "mod_core.h"
#include "http_request.h"
#include "http_vhost.h"
#include "apr_uri.h"
#if APR_HAVE_UNISTD_H
#include <unistd.h>
+#else
+/* Not sure what absence of unistd would signify for tty. Treating it as a
+ * big NO is safe, as we then won't try to write to stderr that's not a tty.
+ */
+#define isatty(n) (0)
#endif
+/* we know core's module_index is 0 */
+#undef APLOG_MODULE_INDEX
+#define APLOG_MODULE_INDEX AP_CORE_MODULE_INDEX
+
/* WARNING: Win32 binds http_main.c dynamically to the server. Please place
* extern functions and global data in another appropriate module.
*
printf("Server's Module Magic Number: %u:%u\n",
MODULE_MAGIC_NUMBER_MAJOR, MODULE_MAGIC_NUMBER_MINOR);
#if APR_MAJOR_VERSION >= 2
- printf("Server loaded: APR %s\n", apr_version_string());
- printf("Compiled using: APR %s\n", APR_VERSION_STRING);
+ printf("Server loaded: APR %s, PCRE %s\n",
+ apr_version_string(), ap_pcre_version_string(AP_REG_PCRE_LOADED));
+ printf("Compiled using: APR %s, PCRE %s\n",
+ APR_VERSION_STRING, ap_pcre_version_string(AP_REG_PCRE_COMPILED));
#else
- printf("Server loaded: APR %s, APR-UTIL %s\n",
- apr_version_string(), apu_version_string());
- printf("Compiled using: APR %s, APR-UTIL %s\n",
- APR_VERSION_STRING, APU_VERSION_STRING);
+ printf("Server loaded: APR %s, APR-UTIL %s, PCRE %s\n",
+ apr_version_string(), apu_version_string(),
+ ap_pcre_version_string(AP_REG_PCRE_LOADED));
+ printf("Compiled using: APR %s, APR-UTIL %s, PCRE %s\n",
+ APR_VERSION_STRING, APU_VERSION_STRING,
+ ap_pcre_version_string(AP_REG_PCRE_COMPILED));
#endif
/* sizeof(foo) is long on some platforms so we might as well
* make it long everywhere to keep the printf format
* by us before they can do so. In this case maybe valueable log messages
* might get lost.
*/
+
+ /* If we are to print an error, we need the name before we destroy pool.
+ * short_name is a pointer into argv, so remains valid.
+ */
+ const char *name = process->short_name ? process->short_name : "httpd";
+
apr_sleep(TASK_SWITCH_SLEEP);
ap_main_state = AP_SQ_MS_EXITING;
apr_pool_destroy(process->pool); /* and destroy all descendent pools */
apr_terminate();
+ if ((process_exit_value != 0) && isatty(fileno(stderr))) {
+ fprintf(stderr, "%s: abnormal exit %d\n", name, process_exit_value);
+ }
exit(process_exit_value);
}
" -L : list available configuration "
"directives");
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
- " -t -D DUMP_VHOSTS : show parsed settings (currently only "
- "vhost settings)");
+ " -t -D DUMP_VHOSTS : show parsed vhost settings");
+ ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
+ " -t -D DUMP_RUN_CFG : show parsed run settings");
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
- " -S : a synonym for -t -D DUMP_VHOSTS");
+ " -S : a synonym for -t -D DUMP_VHOSTS -D DUMP_RUN_CFG");
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
" -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,
int main(int argc, const char * const argv[])
{
char c;
- int showcompile = 0;
+ int showcompile = 0, showdirectives = 0;
const char *confname = SERVER_CONFIG_FILE;
const char *def_server_root = HTTPD_ROOT;
const char *temp_error_log = NULL;
module **mod;
const char *opt_arg;
APR_OPTIONAL_FN_TYPE(ap_signal_server) *signal_server;
+ int rc = OK;
AP_MONCONTROL(0); /* turn off profiling of startup */
ap_pglobal = process->pool;
pconf = process->pconf;
ap_server_argv0 = process->short_name;
+ ap_init_rng(ap_pglobal);
/* Set up the OOM callback in the global pool, so all pools should
* by default inherit it. */
error = ap_setup_prelinked_modules(process);
if (error) {
- ap_log_error(APLOG_MARK, APLOG_STARTUP|APLOG_EMERG, 0, NULL, "%s: %s",
- ap_server_argv0, error);
+ ap_log_error(APLOG_MARK, APLOG_STARTUP|APLOG_EMERG, 0, NULL, APLOGNO(00012)
+ "%s: %s", ap_server_argv0, error);
destroy_and_exit_process(process, 1);
}
case 'D':
new = (char **)apr_array_push(ap_server_config_defines);
*new = apr_pstrdup(pcommands, opt_arg);
- /* Setting -D DUMP_VHOSTS is equivalent to setting -S */
+ /* Setting -D DUMP_VHOSTS should work like setting -S */
if (strcmp(opt_arg, "DUMP_VHOSTS") == 0)
ap_run_mode = AP_SQ_RM_CONFIG_DUMP;
+ /* Setting -D DUMP_RUN_CFG should work like setting -S */
+ else if (strcmp(opt_arg, "DUMP_RUN_CFG") == 0)
+ ap_run_mode = AP_SQ_RM_CONFIG_DUMP;
/* Setting -D DUMP_MODULES is equivalent to setting -M */
- if (strcmp(opt_arg, "DUMP_MODULES") == 0)
+ 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;
destroy_and_exit_process(process, 0);
case 'L':
- ap_show_directives();
- destroy_and_exit_process(process, 0);
+ ap_run_mode = AP_SQ_RM_CONFIG_DUMP;
+ showdirectives = 1;
+ break;
case 't':
if (ap_run_mode == AP_SQ_RM_UNKNOWN)
ap_run_mode = AP_SQ_RM_CONFIG_DUMP;
new = (char **)apr_array_push(ap_server_config_defines);
*new = "DUMP_VHOSTS";
+ new = (char **)apr_array_push(ap_server_config_defines);
+ *new = "DUMP_RUN_CFG";
break;
case 'M':
}
apr_pool_cleanup_register(pconf, &ap_server_conf, ap_pool_cleanup_set_null,
apr_pool_cleanup_null);
+ /* sort hooks here to make sure pre_config hooks are sorted properly */
apr_hook_sort_all();
if (ap_run_pre_config(pconf, plog, ptemp) != OK) {
ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR, 0,
- NULL, "Pre-configuration failed");
+ NULL, APLOGNO(00013) "Pre-configuration failed");
destroy_and_exit_process(process, 1);
}
if (rv == OK) {
ap_fixup_virtual_hosts(pconf, ap_server_conf);
ap_fini_vhost_config(pconf, ap_server_conf);
+ /*
+ * Sort hooks again because ap_process_config_tree may have add modules
+ * and hence hooks. This happens with mod_perl and modules written in
+ * perl.
+ */
+ apr_hook_sort_all();
if (ap_run_check_config(pconf, plog, ptemp, ap_server_conf) != OK) {
ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR, 0,
- NULL, "Configuration check failed");
+ NULL, APLOGNO(00014) "Configuration check failed");
destroy_and_exit_process(process, 1);
}
if (showcompile) { /* deferred due to dynamically loaded MPM */
show_compile_settings();
}
+ else if (showdirectives) { /* deferred in case of DSOs */
+ ap_show_directives();
+ destroy_and_exit_process(process, 0);
+ }
else {
ap_run_test_config(pconf, ap_server_conf);
if (ap_run_mode == AP_SQ_RM_CONFIG_TEST)
}
}
+ /* If our config failed, deal with that here. */
+ if (rv != OK) {
+ destroy_and_exit_process(process, 1);
+ }
+
signal_server = APR_RETRIEVE_OPTIONAL_FN(ap_signal_server);
if (signal_server) {
int exit_status;
}
}
- /* If our config failed, deal with that here. */
- if (rv != OK) {
- destroy_and_exit_process(process, 1);
- }
-
apr_pool_clear(plog);
if ( ap_run_open_logs(pconf, plog, ptemp, ap_server_conf) != OK) {
ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR,
- 0, NULL, "Unable to open logs");
+ 0, NULL, APLOGNO(00015) "Unable to open logs");
destroy_and_exit_process(process, 1);
}
if ( ap_run_post_config(pconf, plog, ptemp, ap_server_conf) != OK) {
ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR, 0,
- NULL, "Configuration Failed");
+ NULL, APLOGNO(00016) "Configuration Failed");
destroy_and_exit_process(process, 1);
}
apr_pool_destroy(ptemp);
- for (;;) {
- ap_config_generation++;
+ do {
ap_main_state = AP_SQ_MS_DESTROY_CONFIG;
apr_hook_deregister_all();
apr_pool_clear(pconf);
ap_clear_auth_internal();
ap_main_state = AP_SQ_MS_CREATE_CONFIG;
+ ap_config_generation++;
for (mod = ap_prelinked_modules; *mod != NULL; mod++) {
ap_register_hooks(*mod, pconf);
}
}
apr_pool_cleanup_register(pconf, &ap_server_conf,
ap_pool_cleanup_set_null, apr_pool_cleanup_null);
+ /* sort hooks here to make sure pre_config hooks are sorted properly */
apr_hook_sort_all();
if (ap_run_pre_config(pconf, plog, ptemp) != OK) {
- ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR,
- 0, NULL, "Pre-configuration failed");
+ ap_log_error(APLOG_MARK, APLOG_EMERG, 0, NULL,
+ APLOGNO(00017) "Pre-configuration failed, exiting");
destroy_and_exit_process(process, 1);
}
}
ap_fixup_virtual_hosts(pconf, ap_server_conf);
ap_fini_vhost_config(pconf, ap_server_conf);
+ /*
+ * Sort hooks again because ap_process_config_tree may have add modules
+ * and hence hooks. This happens with mod_perl and modules written in
+ * perl.
+ */
+ apr_hook_sort_all();
if (ap_run_check_config(pconf, plog, ptemp, ap_server_conf) != OK) {
- ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR, 0,
- NULL, "Configuration check failed");
+ ap_log_error(APLOG_MARK, APLOG_EMERG, 0, NULL,
+ APLOGNO(00018) "Configuration check failed, exiting");
destroy_and_exit_process(process, 1);
}
apr_pool_clear(plog);
if (ap_run_open_logs(pconf, plog, ptemp, ap_server_conf) != OK) {
- ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR,
- 0, NULL, "Unable to open logs");
+ ap_log_error(APLOG_MARK, APLOG_EMERG, 0, NULL,
+ APLOGNO(00019) "Unable to open logs, exiting");
destroy_and_exit_process(process, 1);
}
if (ap_run_post_config(pconf, plog, ptemp, ap_server_conf) != OK) {
- ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR,
- 0, NULL, "Configuration Failed");
+ ap_log_error(APLOG_MARK, APLOG_EMERG, 0, NULL,
+ APLOGNO(00020) "Configuration Failed, exiting");
destroy_and_exit_process(process, 1);
}
ap_run_optional_fn_retrieve();
ap_main_state = AP_SQ_MS_RUN_MPM;
- if (ap_run_mpm(pconf, plog, ap_server_conf) != OK)
- break;
+ rc = ap_run_mpm(pconf, plog, ap_server_conf);
apr_pool_lock(pconf, 0);
- }
- apr_pool_lock(pconf, 0);
- destroy_and_exit_process(process, 0);
+ } while (rc == OK);
+
+ if (rc == DONE) {
+ rc = OK;
+ }
+ else if (rc != OK) {
+ ap_log_error(APLOG_MARK, APLOG_EMERG, 0, NULL, APLOGNO(02818)
+ "MPM run failed, exiting");
+ }
+ destroy_and_exit_process(process, rc);
- return 0; /* Termination 'ok' */
+ /* NOTREACHED */
+ return !OK;
}
#ifdef AP_USING_AUTOCONF