Return-Path: Delivered-To: apmail-httpd-cvs-archive@www.apache.org Received: (qmail 14301 invoked from network); 25 Apr 2004 17:23:33 -0000 Received: from daedalus.apache.org (HELO mail.apache.org) (208.185.179.12) by minotaur-2.apache.org with SMTP; 25 Apr 2004 17:23:33 -0000 Received: (qmail 25899 invoked by uid 500); 25 Apr 2004 17:23:24 -0000 Delivered-To: apmail-httpd-cvs-archive@httpd.apache.org Received: (qmail 25866 invoked by uid 500); 25 Apr 2004 17:23:24 -0000 Mailing-List: contact cvs-help@httpd.apache.org; run by ezmlm Precedence: bulk Reply-To: dev@httpd.apache.org list-help: list-unsubscribe: list-post: Delivered-To: mailing list cvs@httpd.apache.org Received: (qmail 25850 invoked by uid 500); 25 Apr 2004 17:23:24 -0000 Delivered-To: apmail-httpd-2.0-cvs@apache.org Received: (qmail 25845 invoked from network); 25 Apr 2004 17:23:24 -0000 Received: from unknown (HELO minotaur.apache.org) (209.237.227.194) by daedalus.apache.org with SMTP; 25 Apr 2004 17:23:24 -0000 Received: (qmail 14293 invoked by uid 1569); 25 Apr 2004 17:23:31 -0000 Date: 25 Apr 2004 17:23:31 -0000 Message-ID: <20040425172331.14291.qmail@minotaur.apache.org> From: nd@apache.org To: httpd-2.0-cvs@apache.org Subject: cvs commit: httpd-2.0/server config.c core.c main.c X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N X-Spam-Rating: minotaur-2.apache.org 1.6.2 0/1000/N nd 2004/04/25 10:23:31 Modified: . CHANGES include ap_mmn.h http_config.h modules/mappers mod_so.c server config.c core.c main.c Log: changed the following APIs to return an error instead of hard exiting: ap_add_module, ap_add_loaded_module, ap_setup_prelinked_modules, and ap_process_resource_config Revision Changes Path 1.1472 +4 -1 httpd-2.0/CHANGES Index: CHANGES =================================================================== RCS file: /home/cvs/httpd-2.0/CHANGES,v retrieving revision 1.1471 retrieving revision 1.1472 diff -u -u -r1.1471 -r1.1472 --- CHANGES 25 Apr 2004 17:05:50 -0000 1.1471 +++ CHANGES 25 Apr 2004 17:23:30 -0000 1.1472 @@ -2,7 +2,10 @@ [Remove entries to the current 2.0 section below, when backported] - *) Removed old and unmaintained ap_add_named_module API. [Andr� Malo] + *) Removed old and unmaintained ap_add_named_module API and changed + the following APIs to return an error instead of hard exiting: + ap_add_module, ap_add_loaded_module, ap_setup_prelinked_modules, + and ap_process_resource_config. [Andr� Malo] *) htpasswd no longer refuses to process files that contain empty lines. [Andr� Malo] 1.68 +2 -0 httpd-2.0/include/ap_mmn.h Index: ap_mmn.h =================================================================== RCS file: /home/cvs/httpd-2.0/include/ap_mmn.h,v retrieving revision 1.67 retrieving revision 1.68 diff -u -u -r1.67 -r1.68 --- ap_mmn.h 25 Apr 2004 17:05:51 -0000 1.67 +++ ap_mmn.h 25 Apr 2004 17:23:31 -0000 1.68 @@ -81,6 +81,8 @@ * 20030821.2 (2.1.0-dev) added ap_escape_errorlog_item * 20030821.3 (2.1.0-dev) added ap_get_server_revision / ap_version_t * 20040425 (2.1.0-dev) removed ap_add_named_module API + * changed ap_add_module, ap_add_loaded_module, + * ap_setup_prelinked_modules, ap_process_resource_config */ #define MODULE_MAGIC_COOKIE 0x41503230UL /* "AP20" */ 1.109 +8 -6 httpd-2.0/include/http_config.h Index: http_config.h =================================================================== RCS file: /home/cvs/httpd-2.0/include/http_config.h,v retrieving revision 1.108 retrieving revision 1.109 diff -u -u -r1.108 -r1.109 --- http_config.h 25 Apr 2004 17:05:51 -0000 1.108 +++ http_config.h 25 Apr 2004 17:23:31 -0000 1.109 @@ -543,7 +543,7 @@ * @param m The module structure of the module to add * @param p The pool of the same lifetime as the module */ -AP_DECLARE(void) ap_add_module(module *m, apr_pool_t *p); +AP_DECLARE(const char *) ap_add_module(module *m, apr_pool_t *p); /** * Remove a module from the server. There are some caveats: @@ -559,7 +559,7 @@ * @param m The module structure of the module to add * @param p The pool with the same lifetime as the module */ -AP_DECLARE(void) ap_add_loaded_module(module *mod, apr_pool_t *p); +AP_DECLARE(const char *) ap_add_loaded_module(module *mod, apr_pool_t *p); /** * Remove a module fromthe chained modules list and the list of loaded modules * @param m the module structure of the module to remove @@ -740,7 +740,7 @@ * Add all of the prelinked modules into the loaded module list * @param process The process that is currently running the server */ -AP_DECLARE(void) ap_setup_prelinked_modules(process_rec *process); +AP_DECLARE(const char *) ap_setup_prelinked_modules(process_rec *process); /** * Show the preloaded configuration directives, the help string explaining @@ -865,9 +865,11 @@ * @param p Pool for general allocation * @param ptem Pool for temporary allocation */ -AP_DECLARE(void) ap_process_resource_config(server_rec *s, const char *fname, - ap_directive_t **conftree, - apr_pool_t *p, apr_pool_t *ptemp); +AP_DECLARE(const char *) ap_process_resource_config(server_rec *s, + const char *fname, + ap_directive_t **conftree, + apr_pool_t *p, + apr_pool_t *ptemp); /** * Process all directives in the config tree 1.56 +5 -1 httpd-2.0/modules/mappers/mod_so.c Index: mod_so.c =================================================================== RCS file: /home/cvs/httpd-2.0/modules/mappers/mod_so.c,v retrieving revision 1.55 retrieving revision 1.56 diff -u -u -r1.55 -r1.56 --- mod_so.c 9 Feb 2004 20:29:20 -0000 1.55 +++ mod_so.c 25 Apr 2004 17:23:31 -0000 1.56 @@ -162,6 +162,7 @@ moduleinfo *modi; moduleinfo *modie; int i; + const char *error; /* we need to setup this value for dummy to make sure that we don't try * to add a non-existant tree into the build when we return to @@ -277,7 +278,10 @@ /* * Add this module to the Apache core structures */ - ap_add_loaded_module(modp, cmd->pool); + error = ap_add_loaded_module(modp, cmd->pool); + if (error) { + return error; + } /* * Register a cleanup in the config apr_pool_t (normally pconf). When 1.177 +121 -97 httpd-2.0/server/config.c Index: config.c =================================================================== RCS file: /home/cvs/httpd-2.0/server/config.c,v retrieving revision 1.176 retrieving revision 1.177 diff -u -u -r1.176 -r1.177 --- config.c 25 Apr 2004 17:05:51 -0000 1.176 +++ config.c 25 Apr 2004 17:23:31 -0000 1.177 @@ -404,7 +404,7 @@ /* One-time setup for precompiled modules --- NOT to be done on restart */ -AP_DECLARE(void) ap_add_module(module *m, apr_pool_t *p) +AP_DECLARE(const char *) ap_add_module(module *m, apr_pool_t *p) { /* This could be called from a LoadModule httpd.conf command, * after the file has been linked and the module structure within it @@ -412,14 +412,10 @@ */ if (m->version != MODULE_MAGIC_NUMBER_MAJOR) { - ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, - "%s: module \"%s\" is not compatible with this " - "version of Apache (found %d, need %d).", - ap_server_argv0, m->name, m->version, - MODULE_MAGIC_NUMBER_MAJOR); - ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, - "Please contact the vendor for the correct version."); - exit(1); + return apr_psprintf(p, "Module \"%s\" is not compatible with this " + "version of Apache (found %d, need %d). Please " + "contact the vendor for the correct version.", + m->name, m->version, MODULE_MAGIC_NUMBER_MAJOR); } if (m->next == NULL) { @@ -432,13 +428,10 @@ dynamic_modules++; if (dynamic_modules > DYNAMIC_MODULE_LIMIT) { - ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, - "%s: module \"%s\" could not be loaded, because" - " the dynamic", ap_server_argv0, m->name); - ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, - "module limit was reached. Please increase " - "DYNAMIC_MODULE_LIMIT and recompile."); - exit(1); + return apr_psprintf(p, "Module \"%s\" could not be loaded, " + "because the dynamic module limit was " + "reached. Please increase " + "DYNAMIC_MODULE_LIMIT and recompile.", m->name); } } @@ -470,6 +463,8 @@ * It doesn't appear to be */ ap_register_hooks(m, p); + + return NULL; } /* @@ -517,14 +512,18 @@ total_modules--; } -AP_DECLARE(void) ap_add_loaded_module(module *mod, apr_pool_t *p) +AP_DECLARE(const char *) ap_add_loaded_module(module *mod, apr_pool_t *p) { module **m; + const char *error; /* * Add module pointer to top of chained module list */ - ap_add_module(mod, p); + error = ap_add_module(mod, p); + if (error) { + return error; + } /* * And module pointer to list of loaded modules @@ -538,6 +537,8 @@ ; *m++ = mod; *m = NULL; + + return NULL; } AP_DECLARE(void) ap_remove_loaded_module(module *mod) @@ -570,10 +571,11 @@ *m = NULL; } -AP_DECLARE(void) ap_setup_prelinked_modules(process_rec *process) +AP_DECLARE(const char *) ap_setup_prelinked_modules(process_rec *process) { module **m; module **m2; + const char *error; apr_hook_global_pool=process->pconf; @@ -591,8 +593,7 @@ sizeof(module *) * (total_modules + DYNAMIC_MODULE_LIMIT + 1)); if (ap_loaded_modules == NULL) { - ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, - "Ouch! Out of memory in ap_setup_prelinked_modules()!"); + return "Ouch! Out of memory in ap_setup_prelinked_modules()!"; } for (m = ap_preloaded_modules, m2 = ap_loaded_modules; *m != NULL; ) @@ -603,10 +604,16 @@ /* * Initialize chain of linked (=activate) modules */ - for (m = ap_prelinked_modules; *m != NULL; m++) - ap_add_module(*m, process->pconf); + for (m = ap_prelinked_modules; *m != NULL; m++) { + error = ap_add_module(*m, process->pconf); + if (error) { + return error; + } + } apr_hook_sort_all(); + + return NULL; } AP_DECLARE(const char *) ap_find_module_name(module *m) @@ -1359,9 +1366,11 @@ return 0; } -static void process_command_config(server_rec *s, apr_array_header_t *arr, - ap_directive_t **conftree, apr_pool_t *p, - apr_pool_t *ptemp) +static const char *process_command_config(server_rec *s, + apr_array_header_t *arr, + ap_directive_t **conftree, + apr_pool_t *p, + apr_pool_t *ptemp) { const char *errmsg; cmd_parms parms; @@ -1381,14 +1390,14 @@ arr_elts_getstr, arr_elts_close); errmsg = ap_build_config(&parms, p, ptemp, conftree); + ap_cfg_closefile(parms.config_file); + if (errmsg) { - ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, - "Syntax error in -C/-c directive:" APR_EOL_STR "%s", - errmsg); - exit(1); + return apr_pstrcat(p, "Syntax error in -C/-c directive: ", errmsg, + NULL); } - ap_cfg_closefile(parms.config_file); + return NULL; } typedef struct { @@ -1403,15 +1412,16 @@ return strcmp(f1->fname,f2->fname); } -static void process_resource_config_nofnmatch(server_rec *s, const char *fname, - ap_directive_t **conftree, - apr_pool_t *p, - apr_pool_t *ptemp, - unsigned depth) +static const char *process_resource_config_nofnmatch(server_rec *s, + const char *fname, + ap_directive_t **conftree, + apr_pool_t *p, + apr_pool_t *ptemp, + unsigned depth) { cmd_parms parms; ap_configfile_t *cfp; - const char *errmsg; + const char *error; if (ap_is_directory(p, fname)) { apr_dir_t *dirp; @@ -1420,14 +1430,13 @@ apr_array_header_t *candidates = NULL; fnames *fnew; apr_status_t rv; - char errmsg[120], *path = apr_pstrdup(p, fname); + char *path = apr_pstrdup(p, fname); if (++depth > AP_MAX_INCLUDE_DIR_DEPTH) { - fprintf(stderr, "%s: Directory %s exceeds the maximum include " - "directory nesting level of %u. You have probably a " - "recursion somewhere.\n", ap_server_argv0, path, - AP_MAX_INCLUDE_DIR_DEPTH); - exit(1); + return apr_psprintf(p, "Directory %s exceeds the maximum include " + "directory nesting level of %u. You have " + "probably a recursion somewhere.", path, + AP_MAX_INCLUDE_DIR_DEPTH); } /* @@ -1437,10 +1446,9 @@ */ rv = apr_dir_open(&dirp, path, p); if (rv != APR_SUCCESS) { - fprintf(stderr, "%s: could not open config directory %s: %s\n", - ap_server_argv0, path, - apr_strerror(rv, errmsg, sizeof errmsg)); - exit(1); + char errmsg[120]; + return apr_psprintf(p, "Could not open config directory %s: %s", + path, apr_strerror(rv, errmsg, sizeof errmsg)); } candidates = apr_array_make(p, 1, sizeof(fnames)); @@ -1464,12 +1472,16 @@ */ for (current = 0; current < candidates->nelts; ++current) { fnew = &((fnames *) candidates->elts)[current]; - process_resource_config_nofnmatch(s, fnew->fname, conftree, p, - ptemp, depth); + error = process_resource_config_nofnmatch(s, fnew->fname, + conftree, p, ptemp, + depth); + if (error) { + return error; + } } } - return; + return NULL; } /* GCC's initialization extensions are soooo nice here... */ @@ -1480,35 +1492,28 @@ parms.override = (RSRC_CONF | OR_ALL) & ~(OR_AUTHCFG | OR_LIMIT); if (ap_pcfg_openfile(&cfp, p, fname) != APR_SUCCESS) { - ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, - "%s: could not open document config file %s", - ap_server_argv0, fname); - exit(1); + return apr_pstrcat(p, "Could not open document config file ", + fname, NULL); } parms.config_file = cfp; + error = ap_build_config(&parms, p, ptemp, conftree); + ap_cfg_closefile(cfp); - errmsg = ap_build_config(&parms, p, ptemp, conftree); - - if (errmsg != NULL) { - ap_log_error(APLOG_MARK, APLOG_STARTUP, 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, 0, NULL, - "%s", errmsg); - exit(1); + if (error) { + return apr_psprintf(p, "Syntax error on line %d of %s: %s", + parms.err_directive->line_num, + parms.err_directive->filename, error); } - ap_cfg_closefile(cfp); - - return; + return NULL; } -AP_DECLARE(void) ap_process_resource_config(server_rec *s, const char *fname, - ap_directive_t **conftree, - apr_pool_t *p, - apr_pool_t *ptemp) +AP_DECLARE(const char *) ap_process_resource_config(server_rec *s, + const char *fname, + ap_directive_t **conftree, + apr_pool_t *p, + apr_pool_t *ptemp) { /* XXX: lstat() won't work on the wildcard pattern... */ @@ -1520,11 +1525,12 @@ apr_finfo_t finfo; if (apr_stat(&finfo, fname, APR_FINFO_LINK | APR_FINFO_TYPE, p) != APR_SUCCESS) - return; + return NULL; } if (!apr_fnmatch_test(fname)) { - process_resource_config_nofnmatch(s, fname, conftree, p, ptemp, 0); + return process_resource_config_nofnmatch(s, fname, conftree, p, ptemp, + 0); } else { apr_dir_t *dirp; @@ -1533,7 +1539,7 @@ apr_array_header_t *candidates = NULL; fnames *fnew; apr_status_t rv; - char errmsg[120], *path = apr_pstrdup(p, fname), *pattern = NULL; + char *path = apr_pstrdup(p, fname), *pattern = NULL; pattern = ap_strrchr(path, '/'); @@ -1542,21 +1548,18 @@ *pattern++ = '\0'; if (apr_fnmatch_test(path)) { - fprintf(stderr, "%s: wildcard patterns not allowed in Include " - "%s\n", ap_server_argv0, fname); - exit(1); + return apr_pstrcat(p, "Wildcard patterns not allowed in Include ", + fname, NULL); } if (!ap_is_directory(p, path)){ - fprintf(stderr, "%s: Include directory '%s' not found", - ap_server_argv0, path); - exit(1); + return apr_pstrcat(p, "Include directory '", path, "' not found", + NULL); } if (!apr_fnmatch_test(pattern)) { - fprintf(stderr, "%s: must include a wildcard pattern " - "for Include %s\n", ap_server_argv0, fname); - exit(1); + return apr_pstrcat(p, "Must include a wildcard pattern for " + "Include ", fname, NULL); } /* @@ -1566,10 +1569,9 @@ */ rv = apr_dir_open(&dirp, path, p); if (rv != APR_SUCCESS) { - fprintf(stderr, "%s: could not open config directory %s: %s\n", - ap_server_argv0, path, - apr_strerror(rv, errmsg, sizeof errmsg)); - exit(1); + char errmsg[120]; + return apr_psprintf(p, "Could not open config directory %s: %s", + path, apr_strerror(rv, errmsg, sizeof errmsg)); } candidates = apr_array_make(p, 1, sizeof(fnames)); @@ -1586,6 +1588,8 @@ apr_dir_close(dirp); if (candidates->nelts != 0) { + const char *error; + qsort((void *) candidates->elts, candidates->nelts, sizeof(fnames), fname_alphasort); @@ -1595,13 +1599,17 @@ */ for (current = 0; current < candidates->nelts; ++current) { fnew = &((fnames *) candidates->elts)[current]; - process_resource_config_nofnmatch(s, fnew->fname, conftree, p, - ptemp, 0); + error = process_resource_config_nofnmatch(s, fnew->fname, + conftree, p, + ptemp, 0); + if (error) { + return error; + } } } } - return; + return NULL; } AP_DECLARE(int) ap_process_config_tree(server_rec *s, @@ -1848,15 +1856,20 @@ const char *filename, ap_directive_t **conftree) { - const char *confname; + const char *confname, *error; apr_pool_t *p = process->pconf; server_rec *s = init_server_config(process, p); init_config_globals(p); /* All server-wide config files now have the SAME syntax... */ - process_command_config(s, ap_server_pre_read_config, conftree, - p, ptemp); + error = process_command_config(s, ap_server_pre_read_config, conftree, + p, ptemp); + if (error) { + ap_log_error(APLOG_MARK, APLOG_STARTUP|APLOG_CRIT, 0, NULL, "%s: %s", + ap_server_argv0, error); + return NULL; + } /* process_command_config may change the ServerRoot so * compute this config file name afterwards. @@ -1867,13 +1880,24 @@ ap_log_error(APLOG_MARK, APLOG_STARTUP|APLOG_CRIT, APR_EBADPATH, NULL, "Invalid config file path %s", filename); - exit(1); + return NULL; } - ap_process_resource_config(s, confname, conftree, p, ptemp); + error = ap_process_resource_config(s, confname, conftree, p, ptemp); + if (error) { + ap_log_error(APLOG_MARK, APLOG_STARTUP|APLOG_CRIT, 0, NULL, + "%s: %s", ap_server_argv0, error); + return NULL; + } + + error = process_command_config(s, ap_server_post_read_config, conftree, + p, ptemp); - process_command_config(s, ap_server_post_read_config, conftree, - p, ptemp); + if (error) { + ap_log_error(APLOG_MARK, APLOG_STARTUP|APLOG_CRIT, 0, NULL, "%s: %s", + ap_server_argv0, error); + return NULL; + } return s; } 1.276 +8 -3 httpd-2.0/server/core.c Index: core.c =================================================================== RCS file: /home/cvs/httpd-2.0/server/core.c,v retrieving revision 1.275 retrieving revision 1.276 diff -u -u -r1.275 -r1.276 --- core.c 20 Apr 2004 20:22:13 -0000 1.275 +++ core.c 25 Apr 2004 17:23:31 -0000 1.276 @@ -2250,7 +2250,7 @@ const char *name) { ap_directive_t *conftree = NULL; - const char* conffile; + const char* conffile, *error; unsigned *recursion; void *data; @@ -2278,8 +2278,13 @@ name, NULL); } - ap_process_resource_config(cmd->server, conffile, - &conftree, cmd->pool, cmd->temp_pool); + error = ap_process_resource_config(cmd->server, conffile, + &conftree, cmd->pool, cmd->temp_pool); + if (error) { + *recursion = 0; + return error; + } + *(ap_directive_t **)dummy = conftree; /* recursion level done */ 1.157 +15 -1 httpd-2.0/server/main.c Index: main.c =================================================================== RCS file: /home/cvs/httpd-2.0/server/main.c,v retrieving revision 1.156 retrieving revision 1.157 diff -u -u -r1.156 -r1.157 --- main.c 29 Mar 2004 02:21:29 -0000 1.156 +++ main.c 25 Apr 2004 17:23:31 -0000 1.157 @@ -399,6 +399,7 @@ const char *confname = SERVER_CONFIG_FILE; const char *def_server_root = HTTPD_ROOT; const char *temp_error_log = NULL; + const char *error; process_rec *process; server_rec *server_conf; apr_pool_t *pglobal; @@ -427,7 +428,12 @@ } #endif - ap_setup_prelinked_modules(process); + 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); + destroy_and_exit_process(process, 1); + } apr_pool_create(&pcommands, pglobal); apr_pool_tag(pcommands, "pcommands"); @@ -566,6 +572,10 @@ ap_replace_stderr_log(process->pool, temp_error_log); } server_conf = ap_read_config(process, ptemp, confname, &ap_conftree); + if (!server_conf) { + destroy_and_exit_process(process, 1); + } + if (ap_run_pre_config(pconf, plog, ptemp) != OK) { ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR, 0, NULL, "Pre-configuration failed"); @@ -631,6 +641,10 @@ apr_pool_tag(ptemp, "ptemp"); ap_server_root = def_server_root; server_conf = ap_read_config(process, ptemp, confname, &ap_conftree); + if (!server_conf) { + destroy_and_exit_process(process, 1); + } + if (ap_run_pre_config(pconf, plog, ptemp) != OK) { ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR, 0, NULL, "Pre-configuration failed");