config.c revision fd0edaa8e3d4dd67d0604ccef2e96b071db96643
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder/* ====================================================================
e9458b1a7a19a63aa4c179f9ab20f4d50681c168Jens Elkner * Copyright (c) 1995-1999 The Apache Group. All rights reserved.
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * Redistribution and use in source and binary forms, with or without
98890889ffb2e8f6f722b00e265a211f13b5a861Corneliu-Claudiu Prodescu * modification, are permitted provided that the following conditions
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * 1. Redistributions of source code must retain the above copyright
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * notice, this list of conditions and the following disclaimer.
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * 2. Redistributions in binary form must reproduce the above copyright
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * notice, this list of conditions and the following disclaimer in
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * the documentation and/or other materials provided with the
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * distribution.
4ca0c94efd3f03e6fdd2e7e68471d338b4a224dcChristian Maeder * 3. All advertising materials mentioning features or use of this
4ca0c94efd3f03e6fdd2e7e68471d338b4a224dcChristian Maeder * software must display the following acknowledgment:
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * "This product includes software developed by the Apache Group
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * for use in the Apache HTTP server project (http://www.apache.org/)."
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * 4. The names "Apache Server" and "Apache Group" must not be used to
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * endorse or promote products derived from this software without
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * prior written permission. For written permission, please contact
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * apache@apache.org.
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * 5. Products derived from this software may not be called "Apache"
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * nor may "Apache" appear in their names without prior written
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * permission of the Apache Group.
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * 6. Redistributions of any form whatsoever must retain the following
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * acknowledgment:
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * "This product includes software developed by the Apache Group
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * for use in the Apache HTTP server project (http://www.apache.org/)."
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE GROUP OR
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * OF THE POSSIBILITY OF SUCH DAMAGE.
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * ====================================================================
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * This software consists of voluntary contributions made by many
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * individuals on behalf of the Apache Group and was originally based
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * on public domain software written at the National Center for
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * Supercomputing Applications, University of Illinois, Urbana-Champaign.
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * For more information on the Apache Group and the Apache HTTP server
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * project, please see <http://www.apache.org/>.
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * http_config.c: once was auxillary functions for reading httpd's config
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * file and converting filenames into a namespace
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * Wall-to-wall rewrite for Apache... commands which are part of the
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * server core can now be found next door in "http_core.c". Now contains
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * general command loop, and functions which do bookkeeping for the new
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * Apache config stuff (modules and configuration vectors).
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder#include "http_log.h" /* for errors in parse_htaccess */
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder#include "http_request.h" /* for default_handler (see invoke_handler) */
0469a57f53095155ada14b17f4caa48810ec41dfChristian MaederIMPLEMENT_HOOK_RUN_ALL(int,header_parser,(request_rec *r),(r),OK,DECLINED)
0469a57f53095155ada14b17f4caa48810ec41dfChristian MaederIMPLEMENT_HOOK_VOID(pre_config,(pool *pconf,pool *plog,pool *ptemp),
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder (pool *pconf, pool *plog, pool *ptemp, server_rec *s),
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder (pool *pconf, pool *plog, pool *ptemp, server_rec *s),
0469a57f53095155ada14b17f4caa48810ec41dfChristian MaederIMPLEMENT_HOOK_VOID(child_init,(pool *pchild, server_rec *s),(pchild,s))
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder/****************************************************************
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * We begin with the functions which deal with the linked list
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * of modules which control just about all of the server operation.
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder/* total_modules is the number of modules that have been linked
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * into the server.
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder/* dynamic_modules is the number of modules that have been added
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * after the pre-loaded ones have been set up. It shouldn't be larger
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * than DYNAMIC_MODULE_LIMIT.
0469a57f53095155ada14b17f4caa48810ec41dfChristian MaederAPI_VAR_EXPORT module **ap_loaded_modules=NULL;
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maedertypedef int (*handler_func) (request_rec *);
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maedertypedef void *(*dir_maker_func) (pool *, char *);
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maedertypedef void *(*merger_func) (pool *, void *, void *);
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder/* Dealing with config vectors. These are associated with per-directory,
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * per-server, and per-request configuration, and have a void* pointer for
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * each modules. The nature of the structure pointed to is private to the
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * module in question... the core doesn't (and can't) know. However, there
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * are defined interfaces which allow it to create instances of its private
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * per-directory and per-server structures, and to merge the per-directory
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * structures of a directory and its subdirectory (producing a new one in
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * which the defaults applying to the base directory have been properly
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * overridden).
0469a57f53095155ada14b17f4caa48810ec41dfChristian MaederAPI_EXPORT(void *) ap_get_module_config(void *conf_vector, module *m)
0469a57f53095155ada14b17f4caa48810ec41dfChristian MaederAPI_EXPORT(void) ap_set_module_config(void *conf_vector, module *m, void *val)
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder void **conf_vector = (void **) ap_pcalloc(p, sizeof(void *) *
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder return (void *) conf_vector;
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maederstatic void *create_default_per_dir_config(pool *p)
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder void **conf_vector = (void **) ap_pcalloc(p, sizeof(void *) * (total_modules + DYNAMIC_MODULE_LIMIT));
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder for (modp = top_module; modp; modp = modp->next) {
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder dir_maker_func df = modp->create_dir_config;
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder conf_vector[modp->module_index] = (*df) (p, NULL);
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder return (void *) conf_vector;
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder ap_merge_per_dir_configs(pool *p, void *base, void *new)
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder void **conf_vector = (void **) ap_palloc(p, sizeof(void *) * total_modules);
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder for (modp = top_module; modp; modp = modp->next) {
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder conf_vector[i] = (*df) (p, base_vector[i], new_vector[i]);
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder conf_vector[i] = new_vector[i] ? new_vector[i] : base_vector[i];
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder return (void *) conf_vector;
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maederstatic void *create_server_config(pool *p, server_rec *s)
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder void **conf_vector = (void **) ap_pcalloc(p, sizeof(void *) * (total_modules + DYNAMIC_MODULE_LIMIT));
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder for (modp = top_module; modp; modp = modp->next) {
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder conf_vector[modp->module_index] = (*modp->create_server_config) (p, s);
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder return (void *) conf_vector;
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maederstatic void merge_server_configs(pool *p, void *base, void *virt)
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder /* Can reuse the 'virt' vector for the spine of it, since we don't
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * have to deal with the moral equivalent of .htaccess files here...
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder for (modp = top_module; modp; modp = modp->next) {
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder merger_func df = modp->merge_server_config;
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder virt_vector[i] = (*df) (p, base_vector[i], virt_vector[i]);
0469a57f53095155ada14b17f4caa48810ec41dfChristian MaederCORE_EXPORT(void *) ap_create_per_dir_config(pool *p)
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * For speed/efficiency we generate a compact list of all the handlers
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * and wildcard handlers. This means we won't have to scan the entire
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder * module list looking for handlers... where we'll find a whole whack
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maedertypedef struct {
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder for (modp = top_module; modp; modp = modp->next) {
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder for (handp = modp->handlers; handp->content_type; ++handp) {
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder ph = handlers = ap_palloc(p, sizeof(*ph)*(nhandlers + 1));
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder pw = wildhandlers = ap_palloc(p, sizeof(*pw)*(nwildhandlers + 1));
0469a57f53095155ada14b17f4caa48810ec41dfChristian Maeder for (modp = top_module; modp; modp = modp->next) {
4ca0c94efd3f03e6fdd2e7e68471d338b4a224dcChristian Maeder for (handp = modp->handlers; handp->content_type; ++handp) {
4ca0c94efd3f03e6fdd2e7e68471d338b4a224dcChristian Maeder if ((starp = strchr(handp->content_type, '*'))) {
const char *handler;
if (r->handler) {
return result;
return result;
return HTTP_INTERNAL_SERVER_ERROR;
int g_bDebugHooks;
const char *g_szCurrentHookName;
if(m->register_hooks)
m->register_hooks();
/* This could be called from an AddModule httpd.conf command,
top_module = m;
* only the filename (e.g. mod_includes.c). So check for path
register_hooks(m);
if (modp == m) {
if (!modp) {
m->name);
module **m;
*m++ = mod;
*m = NULL;
module **m;
int done;
*m++ = *m2;
*m = NULL;
void ap_setup_prelinked_modules()
module **m;
total_modules = 0;
*m2++ = *m++;
ap_add_module(*m);
return m->name;
return modp;
return NULL;
*m = NULL;
m = next_m;
const char *errmsg;
case RAW_ARGS:
return ((const char *(*)(cmd_parms *, void *, const char *))
case NO_ARGS:
if (*args != 0)
NULL);
return ((const char *(*)(cmd_parms *, void *))
case TAKE1:
return ((const char *(*)(cmd_parms *, void *, const char *))
case TAKE2:
return ((const char *(*)(cmd_parms *, void *, const char *,
case TAKE12:
return ((const char *(*)(cmd_parms *, void *, const char *,
case TAKE3:
return ((const char *(*)(cmd_parms *, void *, const char *,
case TAKE23:
return ((const char *(*)(cmd_parms *, void *, const char *,
case TAKE123:
return ((const char *(*)(cmd_parms *, void *, const char *,
case TAKE13:
return ((const char *(*)(cmd_parms *, void *, const char *,
case ITERATE:
return errmsg;
return NULL;
case ITERATE2:
return errmsg;
return NULL;
case FLAG:
NULL);
return ((const char *(*)(cmd_parms *, void *, int))
NULL);
return cmds;
++cmds;
return NULL;
return cmdp;
return NULL;
return mconfig;
void *oldconfig;
return NULL;
args = l;
return NULL;
return retval;
char l[MAX_STRING_LEN];
if (errmsg) {
return errmsg;
return NULL;
return NULL;
return NULL;
return NULL;
p = arg;
return NULL;
return file;
int curr_idx;
return NULL;
return buf;
const char *errmsg;
if (errmsg) {
const char *errmsg;
/* don't require conf/httpd.conf if we have a -C or -c switch */
if (errmsg) {
const char *d, const char *access_name)
const char *errmsg;
return OK;
while (access_name[0]) {
ap_cfg_closefile(f);
if (errmsg) {
return HTTP_INTERNAL_SERVER_ERROR;
filename);
return HTTP_FORBIDDEN;
return OK;
#ifdef RLIMIT_NOFILE
s->timeout = 0;
s->keep_alive_timeout = 0;
*ps = s;
s->port = 0;
fixup_virtual_hosts(p, s);
ap_fini_vhost_config(p, s);
if (m->create_server_config)
(*m->create_server_config)(p, s));
if (m->create_dir_config)
void ap_show_directives()
for (n = 0; ap_loaded_modules[n]; ++n)
void ap_show_modules()
for (n = 0; ap_loaded_modules[n]; ++n)