config.c revision b7a0ad483b54711addc5f43f679189619a23c749
6ae232055d4d8a97267517c5e50074c2c819941and/* ====================================================================
6ae232055d4d8a97267517c5e50074c2c819941and * The Apache Software License, Version 1.1
6ae232055d4d8a97267517c5e50074c2c819941and * Copyright (c) 2000 The Apache Software Foundation. All rights
6ae232055d4d8a97267517c5e50074c2c819941and * reserved.
6ae232055d4d8a97267517c5e50074c2c819941and * Redistribution and use in source and binary forms, with or without
6ae232055d4d8a97267517c5e50074c2c819941and * modification, are permitted provided that the following conditions
6ae232055d4d8a97267517c5e50074c2c819941and * are met:
6ae232055d4d8a97267517c5e50074c2c819941and * 1. Redistributions of source code must retain the above copyright
6ae232055d4d8a97267517c5e50074c2c819941and * notice, this list of conditions and the following disclaimer.
6ae232055d4d8a97267517c5e50074c2c819941and * 2. Redistributions in binary form must reproduce the above copyright
6ae232055d4d8a97267517c5e50074c2c819941and * notice, this list of conditions and the following disclaimer in
6ae232055d4d8a97267517c5e50074c2c819941and * the documentation and/or other materials provided with the
6ae232055d4d8a97267517c5e50074c2c819941and * distribution.
6ae232055d4d8a97267517c5e50074c2c819941and * 3. The end-user documentation included with the redistribution,
6ae232055d4d8a97267517c5e50074c2c819941and * if any, must include the following acknowledgment:
6ae232055d4d8a97267517c5e50074c2c819941and * "This product includes software developed by the
4b3a8afbfcea8b265d179a122bf40dfedd1ce280takashi * Apache Software Foundation (http://www.apache.org/)."
ee649f9236fe7fcf255bbfa11f2cce080f996521sf * Alternately, this acknowledgment may appear in the software itself,
6ae232055d4d8a97267517c5e50074c2c819941and * if and wherever such third-party acknowledgments normally appear.
f086b4b402fa9a2fefc7dda85de2a3cc1cd0a654rjung * 4. The names "Apache" and "Apache Software Foundation" must
6ae232055d4d8a97267517c5e50074c2c819941and * not be used to endorse or promote products derived from this
4b575a6b6704b516f22d65a3ad35696d7b9ba372rpluem * software without prior written permission. For written
4b575a6b6704b516f22d65a3ad35696d7b9ba372rpluem * permission, please contact apache@apache.org.
6ae232055d4d8a97267517c5e50074c2c819941and * 5. Products derived from this software may not be called "Apache",
6ae232055d4d8a97267517c5e50074c2c819941and * nor may "Apache" appear in their name, without prior written
6ae232055d4d8a97267517c5e50074c2c819941and * permission of the Apache Software Foundation.
6ae232055d4d8a97267517c5e50074c2c819941and * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
6ae232055d4d8a97267517c5e50074c2c819941and * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
6ae232055d4d8a97267517c5e50074c2c819941and * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
6ae232055d4d8a97267517c5e50074c2c819941and * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
6ae232055d4d8a97267517c5e50074c2c819941and * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
6ae232055d4d8a97267517c5e50074c2c819941and * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
6ae232055d4d8a97267517c5e50074c2c819941and * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
6ae232055d4d8a97267517c5e50074c2c819941and * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
6ae232055d4d8a97267517c5e50074c2c819941and * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
6ae232055d4d8a97267517c5e50074c2c819941and * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
6ae232055d4d8a97267517c5e50074c2c819941and * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
6ae232055d4d8a97267517c5e50074c2c819941and * SUCH DAMAGE.
6ae232055d4d8a97267517c5e50074c2c819941and * ====================================================================
6ae232055d4d8a97267517c5e50074c2c819941and * This software consists of voluntary contributions made by many
6ae232055d4d8a97267517c5e50074c2c819941and * individuals on behalf of the Apache Software Foundation. For more
6ae232055d4d8a97267517c5e50074c2c819941and * information on the Apache Software Foundation, please see
6ae232055d4d8a97267517c5e50074c2c819941and * Portions of this software are based upon public domain software
6ae232055d4d8a97267517c5e50074c2c819941and * originally written at the National Center for Supercomputing Applications,
6ae232055d4d8a97267517c5e50074c2c819941and * University of Illinois, Urbana-Champaign.
6ae232055d4d8a97267517c5e50074c2c819941and * http_config.c: once was auxillary functions for reading httpd's config
6ae232055d4d8a97267517c5e50074c2c819941and * file and converting filenames into a namespace
6ae232055d4d8a97267517c5e50074c2c819941and * Rob McCool
6ae232055d4d8a97267517c5e50074c2c819941and * Wall-to-wall rewrite for Apache... commands which are part of the
6ae232055d4d8a97267517c5e50074c2c819941and * server core can now be found next door in "http_core.c". Now contains
6ae232055d4d8a97267517c5e50074c2c819941and * general command loop, and functions which do bookkeeping for the new
6ae232055d4d8a97267517c5e50074c2c819941and * Apache config stuff (modules and configuration vectors).
6ae232055d4d8a97267517c5e50074c2c819941and#include "http_request.h" /* for default_handler (see invoke_handler) */
6ae232055d4d8a97267517c5e50074c2c819941andAP_DECLARE_DATA apr_array_header_t *ap_server_pre_read_config;
6ae232055d4d8a97267517c5e50074c2c819941andAP_DECLARE_DATA apr_array_header_t *ap_server_post_read_config;
6ae232055d4d8a97267517c5e50074c2c819941andAP_DECLARE_DATA apr_array_header_t *ap_server_config_defines;
6ae232055d4d8a97267517c5e50074c2c819941and (apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp),
6ae232055d4d8a97267517c5e50074c2c819941and/****************************************************************
6ae232055d4d8a97267517c5e50074c2c819941and * We begin with the functions which deal with the linked list
6ae232055d4d8a97267517c5e50074c2c819941and * of modules which control just about all of the server operation.
6ae232055d4d8a97267517c5e50074c2c819941and/* total_modules is the number of modules that have been linked
6ae232055d4d8a97267517c5e50074c2c819941and * into the server.
6ae232055d4d8a97267517c5e50074c2c819941andstatic int total_modules = 0;
6ae232055d4d8a97267517c5e50074c2c819941and/* dynamic_modules is the number of modules that have been added
6ae232055d4d8a97267517c5e50074c2c819941and * after the pre-loaded ones have been set up. It shouldn't be larger
6ae232055d4d8a97267517c5e50074c2c819941and * than DYNAMIC_MODULE_LIMIT.
6ae232055d4d8a97267517c5e50074c2c819941andstatic int dynamic_modules = 0;
6ae232055d4d8a97267517c5e50074c2c819941andtypedef void *(*merger_func) (apr_pool_t *, void *, void *);
6ae232055d4d8a97267517c5e50074c2c819941and/* Dealing with config vectors. These are associated with per-directory,
6ae232055d4d8a97267517c5e50074c2c819941and * per-server, and per-request configuration, and have a void* pointer for
6ae232055d4d8a97267517c5e50074c2c819941and * each modules. The nature of the structure pointed to is private to the
6ae232055d4d8a97267517c5e50074c2c819941and * module in question... the core doesn't (and can't) know. However, there
6ae232055d4d8a97267517c5e50074c2c819941and * are defined interfaces which allow it to create instances of its private
6ae232055d4d8a97267517c5e50074c2c819941and * per-directory and per-server structures, and to merge the per-directory
6ae232055d4d8a97267517c5e50074c2c819941and * structures of a directory and its subdirectory (producing a new one in
6ae232055d4d8a97267517c5e50074c2c819941and * which the defaults applying to the base directory have been properly
6ae232055d4d8a97267517c5e50074c2c819941and * overridden).
6ae232055d4d8a97267517c5e50074c2c819941andAP_DECLARE(void *) ap_get_module_config(void *conf_vector, module *m)
6ae232055d4d8a97267517c5e50074c2c819941andAP_DECLARE(void) ap_set_module_config(void *conf_vector, module *m, void *val)
6ae232055d4d8a97267517c5e50074c2c819941and void **conf_vector = (void **) apr_pcalloc(p, sizeof(void *) *
6ae232055d4d8a97267517c5e50074c2c819941and return (void *) conf_vector;
6ae232055d4d8a97267517c5e50074c2c819941and void **conf_vector = (void **) apr_pcalloc(p, sizeof(void *) * (total_modules + DYNAMIC_MODULE_LIMIT));
6ae232055d4d8a97267517c5e50074c2c819941and return (void *) conf_vector;
6ae232055d4d8a97267517c5e50074c2c819941and ap_merge_per_dir_configs(apr_pool_t *p, void *base, void *new)
6ae232055d4d8a97267517c5e50074c2c819941and void **conf_vector = (void **) apr_palloc(p, sizeof(void *) * total_modules);
6ae232055d4d8a97267517c5e50074c2c819941and conf_vector[i] = (*df) (p, base_vector[i], new_vector[i]);
6ae232055d4d8a97267517c5e50074c2c819941and conf_vector[i] = new_vector[i] ? new_vector[i] : base_vector[i];
6ae232055d4d8a97267517c5e50074c2c819941and return (void *) conf_vector;
6ae232055d4d8a97267517c5e50074c2c819941andstatic void *create_server_config(apr_pool_t *p, server_rec *s)
6ae232055d4d8a97267517c5e50074c2c819941and void **conf_vector = (void **) apr_pcalloc(p, sizeof(void *) * (total_modules + DYNAMIC_MODULE_LIMIT));
6ae232055d4d8a97267517c5e50074c2c819941and conf_vector[modp->module_index] = (*modp->create_server_config) (p, s);
6ae232055d4d8a97267517c5e50074c2c819941and return (void *) conf_vector;
6ae232055d4d8a97267517c5e50074c2c819941andstatic void merge_server_configs(apr_pool_t *p, void *base, void *virt)
6ae232055d4d8a97267517c5e50074c2c819941and /* Can reuse the 'virt' vector for the spine of it, since we don't
6ae232055d4d8a97267517c5e50074c2c819941and * have to deal with the moral equivalent of .htaccess files here...
6ae232055d4d8a97267517c5e50074c2c819941and else if (df)
6ae232055d4d8a97267517c5e50074c2c819941and virt_vector[i] = (*df) (p, base_vector[i], virt_vector[i]);
6ae232055d4d8a97267517c5e50074c2c819941andAP_CORE_DECLARE(void *) ap_create_per_dir_config(apr_pool_t *p)
6ae232055d4d8a97267517c5e50074c2c819941and * For speed/efficiency we generate a compact list of all the handlers
6ae232055d4d8a97267517c5e50074c2c819941and * and wildcard handlers. This means we won't have to scan the entire
6ae232055d4d8a97267517c5e50074c2c819941and * module list looking for handlers... where we'll find a whole whack
6ae232055d4d8a97267517c5e50074c2c819941and * of NULLs.
6ae232055d4d8a97267517c5e50074c2c819941andtypedef struct {
6ae232055d4d8a97267517c5e50074c2c819941and const char *starp;
6ae232055d4d8a97267517c5e50074c2c819941and for (handp = modp->handlers; handp->content_type; ++handp) {
6ae232055d4d8a97267517c5e50074c2c819941and ph = handlers = apr_palloc(p, sizeof(*ph)*(nhandlers + 1));
6ae232055d4d8a97267517c5e50074c2c819941and pw = wildhandlers = apr_palloc(p, sizeof(*pw)*(nwildhandlers + 1));
6ae232055d4d8a97267517c5e50074c2c819941and for (handp = modp->handlers; handp->content_type; ++handp) {
6ae232055d4d8a97267517c5e50074c2c819941and const char *handler;
6ae232055d4d8a97267517c5e50074c2c819941and const char *p;
6ae232055d4d8a97267517c5e50074c2c819941and handler = r->content_type ? r->content_type : ap_default_type(r);
6ae232055d4d8a97267517c5e50074c2c819941and /* MIME type arguments */
6ae232055d4d8a97267517c5e50074c2c819941and --p; /* strip trailing spaces */
6ae232055d4d8a97267517c5e50074c2c819941and /* Pass one --- direct matches */
6ae232055d4d8a97267517c5e50074c2c819941and for (handp = handlers; handp->hr.content_type; ++handp) {
6ae232055d4d8a97267517c5e50074c2c819941and && !strncmp(handler, handp->hr.content_type, handler_len)) {
6ae232055d4d8a97267517c5e50074c2c819941and /* Pass two --- wildcard matches */
6ae232055d4d8a97267517c5e50074c2c819941and for (handp = wildhandlers; handp->hr.content_type; ++handp) {
6ae232055d4d8a97267517c5e50074c2c819941and && !strncmp(handler, handp->hr.content_type, handp->len)) {
6ae232055d4d8a97267517c5e50074c2c819941and if (result == HTTP_INTERNAL_SERVER_ERROR && r->handler && r->filename) {
6ae232055d4d8a97267517c5e50074c2c819941and ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_WARNING, 0, r,
6ae232055d4d8a97267517c5e50074c2c819941and "handler \"%s\" not found for: %s", r->handler, r->filename);
6ae232055d4d8a97267517c5e50074c2c819941andAP_DECLARE(int) ap_method_is_limited(cmd_parms *cmd, const char *method) {
6ae232055d4d8a97267517c5e50074c2c819941and * The simple case: a method hard-coded into Apache.
6ae232055d4d8a97267517c5e50074c2c819941and * Some extension method we don't know implicitly.
6ae232055d4d8a97267517c5e50074c2c819941and/* One-time setup for precompiled modules --- NOT to be done on restart */
6ae232055d4d8a97267517c5e50074c2c819941and /* This could be called from an AddModule httpd.conf command,
6ae232055d4d8a97267517c5e50074c2c819941and * after the file has been linked and the module structure within it
6ae232055d4d8a97267517c5e50074c2c819941and * teased out...
6ae232055d4d8a97267517c5e50074c2c819941and ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
6ae232055d4d8a97267517c5e50074c2c819941and "%s: module \"%s\" is not compatible with this "
6ae232055d4d8a97267517c5e50074c2c819941and ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, "Please contact the vendor for the correct version.");
6ae232055d4d8a97267517c5e50074c2c819941and ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
6ae232055d4d8a97267517c5e50074c2c819941and "%s: module \"%s\" could not be loaded, because"
6ae232055d4d8a97267517c5e50074c2c819941and ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
6ae232055d4d8a97267517c5e50074c2c819941and "module limit was reached. Please increase "
6ae232055d4d8a97267517c5e50074c2c819941and "DYNAMIC_MODULE_LIMIT and recompile.");
6ae232055d4d8a97267517c5e50074c2c819941and /* Some C compilers put a complete path into __FILE__, but we want
6ae232055d4d8a97267517c5e50074c2c819941and * only the filename (e.g. mod_includes.c). So check for path
6ae232055d4d8a97267517c5e50074c2c819941and * components (Unix and DOS), and remove them.
6ae232055d4d8a97267517c5e50074c2c819941and#ifdef _OSD_POSIX /* __FILE__="*POSIX(/home/martin/apache/src/modules/standard/mod_info.c)" */
6ae232055d4d8a97267517c5e50074c2c819941and /* We cannot fix the string in-place, because it's const */
6ae232055d4d8a97267517c5e50074c2c819941and char *tmp = strdup(m->name); /* FIXME:memory leak, albeit a small one */
6ae232055d4d8a97267517c5e50074c2c819941and#endif /*_OSD_POSIX*/
6ae232055d4d8a97267517c5e50074c2c819941and /* FIXME: is this the right place to call this? */
6ae232055d4d8a97267517c5e50074c2c819941and * remove_module undoes what add_module did. There are some caveats:
6ae232055d4d8a97267517c5e50074c2c819941and * when the module is removed, its slot is lost so all the current
6ae232055d4d8a97267517c5e50074c2c819941and * per-dir and per-server configurations are invalid. So we should
6ae232055d4d8a97267517c5e50074c2c819941and * only ever call this function when you are invalidating almost
6ae232055d4d8a97267517c5e50074c2c819941and * all our current data. I.e. when doing a restart.
6ae232055d4d8a97267517c5e50074c2c819941and if (modp == m) {
6ae232055d4d8a97267517c5e50074c2c819941and /* We are the top module, special case */
6ae232055d4d8a97267517c5e50074c2c819941and /* Not the top module, find use. When found modp will
6ae232055d4d8a97267517c5e50074c2c819941and * point to the module _before_ us in the list
6ae232055d4d8a97267517c5e50074c2c819941and /* Uh-oh, this module doesn't exist */
6ae232055d4d8a97267517c5e50074c2c819941and ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, 0, NULL,
6ae232055d4d8a97267517c5e50074c2c819941and "Cannot remove module %s: not found in module list",
6ae232055d4d8a97267517c5e50074c2c819941and /* Eliminate us from the module list */
6ae232055d4d8a97267517c5e50074c2c819941and * be unnecessary */
6ae232055d4d8a97267517c5e50074c2c819941and * Add module pointer to top of chained module list
6ae232055d4d8a97267517c5e50074c2c819941and * And module pointer to list of loaded modules
6ae232055d4d8a97267517c5e50074c2c819941and * Notes: 1. ap_add_module() would already complain if no more space
6ae232055d4d8a97267517c5e50074c2c819941and * exists for adding a dynamically loaded module
6ae232055d4d8a97267517c5e50074c2c819941and * 2. ap_add_module() accepts double inclusion, so we have
070897b4d34cbd17fd2846289189f2a9891f9c84takashi * to accept this, too.
6ae232055d4d8a97267517c5e50074c2c819941and * Remove module pointer from chained module list
6ae232055d4d8a97267517c5e50074c2c819941and * Remove module pointer from list of loaded modules
6ae232055d4d8a97267517c5e50074c2c819941and * Note: 1. We cannot determine if the module was successfully
6ae232055d4d8a97267517c5e50074c2c819941and * removed by ap_remove_module().
6ae232055d4d8a97267517c5e50074c2c819941and * 2. We have not to complain explicity when the module
6ae232055d4d8a97267517c5e50074c2c819941and * is not found because ap_remove_module() did it
6ae232055d4d8a97267517c5e50074c2c819941and * for us already.
6ae232055d4d8a97267517c5e50074c2c819941and for (m = m2 = ap_loaded_modules, done = 0; *m2 != NULL; m2++) {
6ae232055d4d8a97267517c5e50074c2c819941andAP_DECLARE(void) ap_setup_prelinked_modules(process_rec *process)
6ae232055d4d8a97267517c5e50074c2c819941and * Initialise total_modules variable and module indices
6ae232055d4d8a97267517c5e50074c2c819941and * Initialise list of loaded modules
6ae232055d4d8a97267517c5e50074c2c819941and sizeof(module *)*(total_modules+DYNAMIC_MODULE_LIMIT+1));
6ae232055d4d8a97267517c5e50074c2c819941and ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
6ae232055d4d8a97267517c5e50074c2c819941and "Ouch! Out of memory in ap_setup_prelinked_modules()!");
6ae232055d4d8a97267517c5e50074c2c819941and for (m = ap_preloaded_modules, m2 = ap_loaded_modules; *m != NULL; )
6ae232055d4d8a97267517c5e50074c2c819941and *m2++ = *m++;
6ae232055d4d8a97267517c5e50074c2c819941and * Initialize chain of linked (=activate) modules
6ae232055d4d8a97267517c5e50074c2c819941and return m->name;
6ae232055d4d8a97267517c5e50074c2c819941andAP_DECLARE(module *) ap_find_linked_module(const char *name)
6ae232055d4d8a97267517c5e50074c2c819941and/* Add a named module. Returns 1 if module found, 0 otherwise. */
6ae232055d4d8a97267517c5e50074c2c819941and int i = 0;
6ae232055d4d8a97267517c5e50074c2c819941and for (modp = ap_loaded_modules[i]; modp; modp = ap_loaded_modules[++i]) {
6ae232055d4d8a97267517c5e50074c2c819941and /* Only add modules that are not already enabled. */
6ae232055d4d8a97267517c5e50074c2c819941and/* Clear the internal list of modules, in preparation for starting over. */
6ae232055d4d8a97267517c5e50074c2c819941and while (*m) {
6ae232055d4d8a97267517c5e50074c2c819941and /* This is required; so we add it always. */
6ae232055d4d8a97267517c5e50074c2c819941and/*****************************************************************
6ae232055d4d8a97267517c5e50074c2c819941and * Resource, access, and .htaccess config files now parsed by a common
6ae232055d4d8a97267517c5e50074c2c819941and * command loop.
6ae232055d4d8a97267517c5e50074c2c819941and * Let's begin with the basics; parsing the line and
6ae232055d4d8a97267517c5e50074c2c819941and * invoking the function...
6ae232055d4d8a97267517c5e50074c2c819941andstatic const char *invoke_cmd(const command_rec *cmd, cmd_parms *parms,
6ae232055d4d8a97267517c5e50074c2c819941and const char *errmsg;
6ae232055d4d8a97267517c5e50074c2c819941and return apr_pstrcat(parms->pool, cmd->name, " not allowed here", NULL);
6ae232055d4d8a97267517c5e50074c2c819941and if (*args != 0)
6ae232055d4d8a97267517c5e50074c2c819941and return apr_pstrcat(parms->pool, cmd->name, " takes no arguments",
6ae232055d4d8a97267517c5e50074c2c819941and return apr_pstrcat(parms->pool, cmd->name, " takes one argument",
6ae232055d4d8a97267517c5e50074c2c819941and return apr_pstrcat(parms->pool, cmd->name, " takes two arguments",
case TAKE12:
case TAKE3:
case TAKE23:
case TAKE123:
case TAKE13:
case ITERATE:
return errmsg;
return NULL;
case ITERATE2:
return errmsg;
return NULL;
case FLAG:
NULL);
NULL);
return cmds;
++cmds;
return NULL;
return cmdp;
return NULL;
return mconfig;
const char *args;
char *cmd_name;
return NULL;
args = l;
return NULL;
const char *retval;
if (*current) {
if (*curr_parent) {
if (*current) {
if (*current) {
if (!*conftree) {
return retval;
return NULL;
char *orig_directive)
char l[MAX_STRING_LEN];
char *bracket;
const char *retval;
return retval;
return NULL;
NULL);
const char *retval;
return NULL;
return retval;
const char *errmsg;
return errmsg;
return NULL;
char l[MAX_STRING_LEN];
const char *errmsg;
return errmsg;
return errmsg;
return NULL;
void *struct_ptr,
const char *arg)
return NULL;
void *struct_ptr,
const char *arg_)
return NULL;
return NULL;
const char *arg)
#ifndef OS2
return NULL;
#ifndef OS2
return file;
char l[MAX_STRING_LEN];
const char *args;
char *cmd_name;
args = l;
return NULL;
NULL);
int curr_idx;
return NULL;
return buf;
const char *errmsg;
if (errmsg) {
errmsg);
char *fname;
} fnames;
const char *errmsg;
/* don't require conf/httpd.conf if we have a -C or -c switch */
int current;
char *d_name;
const char *errmsg;
if (errmsg) {
const char *d, const char *access_name) {
return OK;
while (access_name[0]) {
const char *errmsg;
ap_cfg_closefile(f);
if (errmsg) {
return HTTP_INTERNAL_SERVER_ERROR;
filename);
return HTTP_FORBIDDEN;
return OK;
s->timeout = 0;
s->keep_alive_timeout = 0;
*ps = s;
s->port = 0;
const char *confname,
p, ptemp);
p, ptemp);
if (m->create_server_config)
(*m->create_server_config)(p, s));
if (m->create_dir_config)
module *m;
if (m->rewrite_args)
AP_DECLARE(void) ap_post_config_hook(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s)
for (n = 0; ap_loaded_modules[n]; ++n)
for (n = 0; ap_loaded_modules[n]; ++n)