config.c revision 30b4a330a5f651eb5198fa93dbb9f3d3594564c9
19887cd06a3af2f045e763986eda19e208bd3f85Zbigniew Jędrzejewski-Szmek/* ====================================================================
19887cd06a3af2f045e763986eda19e208bd3f85Zbigniew Jędrzejewski-Szmek * The Apache Software License, Version 1.1
19887cd06a3af2f045e763986eda19e208bd3f85Zbigniew Jędrzejewski-Szmek * Copyright (c) 2000-2002 The Apache Software Foundation. All rights
19887cd06a3af2f045e763986eda19e208bd3f85Zbigniew Jędrzejewski-Szmek * Redistribution and use in source and binary forms, with or without
19887cd06a3af2f045e763986eda19e208bd3f85Zbigniew Jędrzejewski-Szmek * modification, are permitted provided that the following conditions
19887cd06a3af2f045e763986eda19e208bd3f85Zbigniew Jędrzejewski-Szmek * 1. Redistributions of source code must retain the above copyright
19887cd06a3af2f045e763986eda19e208bd3f85Zbigniew Jędrzejewski-Szmek * notice, this list of conditions and the following disclaimer.
19887cd06a3af2f045e763986eda19e208bd3f85Zbigniew Jędrzejewski-Szmek * 2. Redistributions in binary form must reproduce the above copyright
19887cd06a3af2f045e763986eda19e208bd3f85Zbigniew Jędrzejewski-Szmek * notice, this list of conditions and the following disclaimer in
19887cd06a3af2f045e763986eda19e208bd3f85Zbigniew Jędrzejewski-Szmek * the documentation and/or other materials provided with the
19887cd06a3af2f045e763986eda19e208bd3f85Zbigniew Jędrzejewski-Szmek * 3. The end-user documentation included with the redistribution,
19887cd06a3af2f045e763986eda19e208bd3f85Zbigniew Jędrzejewski-Szmek * if any, must include the following acknowledgment:
19887cd06a3af2f045e763986eda19e208bd3f85Zbigniew Jędrzejewski-Szmek * "This product includes software developed by the
19887cd06a3af2f045e763986eda19e208bd3f85Zbigniew Jędrzejewski-Szmek * Apache Software Foundation (http://www.apache.org/)."
19887cd06a3af2f045e763986eda19e208bd3f85Zbigniew Jędrzejewski-Szmek * Alternately, this acknowledgment may appear in the software itself,
21ac6ff143cc8bebfbd1818af28e8c6f82cd5265Zbigniew Jędrzejewski-Szmek * if and wherever such third-party acknowledgments normally appear.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * 4. The names "Apache" and "Apache Software Foundation" must
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * not be used to endorse or promote products derived from this
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * software without prior written permission. For written
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * permission, please contact apache@apache.org.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * 5. Products derived from this software may not be called "Apache",
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * nor may "Apache" appear in their name, without prior written
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * permission of the Apache Software Foundation.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * ====================================================================
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * This software consists of voluntary contributions made by many
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * individuals on behalf of the Apache Software Foundation. For more
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * information on the Apache Software Foundation, please see
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * Portions of this software are based upon public domain software
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * originally written at the National Center for Supercomputing Applications,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * University of Illinois, Urbana-Champaign.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * http_config.c: once was auxillary functions for reading httpd's config
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * file and converting filenames into a namespace
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * Wall-to-wall rewrite for Apache... commands which are part of the
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * server core can now be found next door in "http_core.c". Now contains
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * general command loop, and functions which do bookkeeping for the new
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * Apache config stuff (modules and configuration vectors).
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek#include "http_log.h" /* for errors in parse_htaccess */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek#include "http_request.h" /* for default_handler (see invoke_handler) */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE_DATA const char *ap_server_argv0 = NULL;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE_DATA const char *ap_server_root = NULL;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE_DATA apr_array_header_t *ap_server_pre_read_config = NULL;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE_DATA apr_array_header_t *ap_server_post_read_config = NULL;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE_DATA apr_array_header_t *ap_server_config_defines = NULL;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE_DATA ap_directive_t *ap_conftree = NULL;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek APR_HOOK_LINK(optional_fn_retrieve)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_IMPLEMENT_HOOK_RUN_ALL(int, header_parser,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek (request_rec *r), (r), OK, DECLINED)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_IMPLEMENT_HOOK_RUN_ALL(int, pre_config,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek (apr_pool_t *pconf, apr_pool_t *plog,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek (pconf, plog, ptemp), OK, DECLINED)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_IMPLEMENT_HOOK_RUN_ALL(int, post_config,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek (apr_pool_t *pconf, apr_pool_t *plog,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek apr_pool_t *ptemp, server_rec *s),
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek (pconf, plog, ptemp, s), OK, DECLINED)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek/* During the course of debugging I expanded this macro out, so
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * rather than remove all the useful information there is in the
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * following lines, I'm going to leave it here in case anyone
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * else finds it useful.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * Ben has looked at it and thinks it correct :)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE(int) ap_hook_post_config(ap_HOOK_post_config_t *pf,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek const char * const *aszPre,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek const char * const *aszSucc,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_LINK_post_config_t *pHook;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (!_hooks.link_post_config) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek _hooks.link_post_config = apr_array_make(apr_global_hook_pool, 1,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek sizeof(ap_LINK_post_config_t));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek apr_hook_sort_register("post_config", &_hooks.link_post_config);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek pHook = apr_array_push(_hooks.link_post_config);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek pHook->pFunc = pf;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek pHook->aszPredecessors = aszPre;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek pHook->aszSuccessors = aszSucc;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek pHook->nOrder = nOrder;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek pHook->szName = apr_current_hooking_module;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (apr_debug_module_hooks)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek apr_show_hook("post_config", aszPre, aszSucc);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE(apr_array_header_t *) ap_hook_get_post_config(void) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return _hooks.link_post_config;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE(int) ap_run_post_config(apr_pool_t *pconf,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek apr_pool_t *plog,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek apr_pool_t *ptemp,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_LINK_post_config_t *pHook;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if(!_hooks.link_post_config)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek pHook = (ap_LINK_post_config_t *)_hooks.link_post_config->elts;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek for (n = 0; n < _hooks.link_post_config->nelts; ++n)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek pHook[n].pFunc (pconf, plog, ptemp, s);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_IMPLEMENT_HOOK_RUN_ALL(int, open_logs,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek (apr_pool_t *pconf, apr_pool_t *plog,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek apr_pool_t *ptemp, server_rec *s),
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek (pconf, plog, ptemp, s), OK, DECLINED)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_IMPLEMENT_HOOK_VOID(child_init,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek (apr_pool_t *pchild, server_rec *s),
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_IMPLEMENT_HOOK_RUN_FIRST(int, handler, (request_rec *r),
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_IMPLEMENT_HOOK_RUN_FIRST(int, quick_handler, (request_rec *r, int lookup),
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_IMPLEMENT_HOOK_VOID(optional_fn_retrieve, (void), ())
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek/****************************************************************
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * We begin with the functions which deal with the linked list
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * of modules which control just about all of the server operation.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek/* total_modules is the number of modules that have been linked
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * into the server.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek/* dynamic_modules is the number of modules that have been added
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * after the pre-loaded ones have been set up. It shouldn't be larger
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * than DYNAMIC_MODULE_LIMIT.
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart PoetteringAP_DECLARE_DATA module *ap_top_module = NULL;
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart PoetteringAP_DECLARE_DATA module **ap_loaded_modules=NULL;
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poetteringtypedef int (*handler_func)(request_rec *);
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poetteringtypedef void *(*dir_maker_func)(apr_pool_t *, char *);
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poetteringtypedef void *(*merger_func)(apr_pool_t *, void *, void *);
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering/* Dealing with config vectors. These are associated with per-directory,
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering * per-server, and per-request configuration, and have a void* pointer for
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering * each modules. The nature of the structure pointed to is private to the
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering * module in question... the core doesn't (and can't) know. However, there
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * are defined interfaces which allow it to create instances of its private
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * per-directory and per-server structures, and to merge the per-directory
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * structures of a directory and its subdirectory (producing a new one in
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * which the defaults applying to the base directory have been properly
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic ap_conf_vector_t *create_empty_config(apr_pool_t *p)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek void *conf_vector = apr_pcalloc(p, sizeof(void *) *
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek (total_modules + DYNAMIC_MODULE_LIMIT));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic ap_conf_vector_t *create_default_per_dir_config(apr_pool_t *p)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek void **conf_vector = apr_pcalloc(p, sizeof(void *) *
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek (total_modules + DYNAMIC_MODULE_LIMIT));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek for (modp = ap_top_module; modp; modp = modp->next) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek dir_maker_func df = modp->create_dir_config;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf_vector[modp->module_index] = (*df)(p, NULL);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return (ap_conf_vector_t *)conf_vector;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_CORE_DECLARE(ap_conf_vector_t *) ap_merge_per_dir_configs(apr_pool_t *p,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek void **conf_vector = apr_palloc(p, sizeof(void *) * total_modules);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek void **base_vector = (void **)base;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek void **new_vector = (void **)new_conf;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek for (modp = ap_top_module; modp; modp = modp->next) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf_vector[i] = base_vector[i];
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek merger_func df = modp->merge_dir_config;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf_vector[i] = (*df)(p, base_vector[i], new_vector[i]);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return (ap_conf_vector_t *)conf_vector;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic ap_conf_vector_t *create_server_config(apr_pool_t *p, server_rec *s)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek void **conf_vector = apr_pcalloc(p, sizeof(void *) *
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek (total_modules + DYNAMIC_MODULE_LIMIT));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek for (modp = ap_top_module; modp; modp = modp->next) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf_vector[modp->module_index] = (*modp->create_server_config)(p, s);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return (ap_conf_vector_t *)conf_vector;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic void merge_server_configs(apr_pool_t *p, ap_conf_vector_t *base,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* Can reuse the 'virt' vector for the spine of it, since we don't
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * have to deal with the moral equivalent of .htaccess files here...
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek void **base_vector = (void **)base;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek void **virt_vector = (void **)virt;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek for (modp = ap_top_module; modp; modp = modp->next) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek merger_func df = modp->merge_server_config;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek virt_vector[i] = base_vector[i];
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek virt_vector[i] = (*df)(p, base_vector[i], virt_vector[i]);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_CORE_DECLARE(ap_conf_vector_t *) ap_create_request_config(apr_pool_t *p)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_CORE_DECLARE(ap_conf_vector_t *) ap_create_conn_config(apr_pool_t *p)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_CORE_DECLARE(ap_conf_vector_t *) ap_create_per_dir_config(apr_pool_t *p)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_CORE_DECLARE(int) ap_invoke_handler(request_rec *r)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek const char *old_handler = r->handler;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * The new insert_filter stage makes the most sense here. We only use
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * it when we are going to run the request, so we must insert filters
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * if any are available. Since the goal of this phase is to allow all
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * modules to insert a filter if they want to, this filter returns
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * void. I just can't see any way that this filter can reasonably
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * fail, either your modules inserts something or it doesn't. rbb
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek handler = r->content_type ? r->content_type : ap_default_type(r);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if ((p=ap_strchr_c(handler, ';')) != NULL) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek char *new_handler = (char *)apr_pmemdup(r->pool, handler,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek char *p2 = new_handler + (p - handler);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* MIME type arguments */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek while (p2 > handler && p2[-1] == ' ')
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek --p2; /* strip trailing spaces */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (result == DECLINED && r->handler && r->filename) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_WARNING, 0, r,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "handler \"%s\" not found for: %s", r->handler, r->filename);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return result == DECLINED ? HTTP_INTERNAL_SERVER_ERROR : result;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE(int) ap_method_is_limited(cmd_parms *cmd, const char *method)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek methnum = ap_method_number_of(method);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * A method number either hardcoded into apache or
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * added by a module and registered.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return (cmd->limited & (AP_METHOD_BIT << methnum)) ? 1 : 0;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return 0; /* not found */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE(void) ap_register_hooks(module *m, apr_pool_t *p)
cb7bb815d2ad7945e63214d21cec1d70152ba6abMarkus Knetschke printf("Registering hooks for %s\n", m->name);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek/* One-time setup for precompiled modules --- NOT to be done on restart */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE(void) ap_add_module(module *m, apr_pool_t *p)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* This could be called from an AddModule httpd.conf command,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * after the file has been linked and the module structure within it
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (m->version != MODULE_MAGIC_NUMBER_MAJOR) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "%s: module \"%s\" is not compatible with this "
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "version of Apache.", ap_server_argv0, m->name);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "Please contact the vendor for the correct version.");
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->module_index = total_modules++;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (dynamic_modules > DYNAMIC_MODULE_LIMIT) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "%s: module \"%s\" could not be loaded, because"
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek " the dynamic", ap_server_argv0, m->name);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "module limit was reached. Please increase "
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "DYNAMIC_MODULE_LIMIT and recompile.");
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* Some C compilers put a complete path into __FILE__, but we want
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * only the filename (e.g. mod_includes.c). So check for path
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * components (Unix and DOS), and remove them.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->name = 1 + ap_strrchr_c(m->name, '/');
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (ap_strrchr_c(m->name, '\\'))
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->name = 1 + ap_strrchr_c(m->name, '\\');
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * "*POSIX(/home/martin/apache/src/modules/standard/mod_info.c)"
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* We cannot fix the string in-place, because it's const */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (m->name[strlen(m->name)-1] == ')') {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek char *tmp = strdup(m->name); /* FIXME: memory leak, albeit a small one */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek#endif /*_OSD_POSIX*/
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* FIXME: is this the right place to call this?
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * It doesn't appear to be
d6ce17c7f02ed3facdb45f65f546e587c2f00950Lennart Poettering * remove_module undoes what add_module did. There are some caveats:
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * when the module is removed, its slot is lost so all the current
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * per-dir and per-server configurations are invalid. So we should
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * only ever call this function when you are invalidating almost
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * all our current data. I.e. when doing a restart.
3fe22bb4b6b5faf27683ad2e231b5a69b6e63a9eLennart PoetteringAP_DECLARE(void) ap_remove_module(module *m)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* We are the top module, special case */
d6ce17c7f02ed3facdb45f65f546e587c2f00950Lennart Poettering /* Not the top module, find use. When found modp will
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * point to the module _before_ us in the list
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek while (modp && modp->next != m) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* Uh-oh, this module doesn't exist */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, 0, NULL,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "Cannot remove module %s: not found in module list",
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* Eliminate us from the module list */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek m->module_index = -1; /* simulate being unloaded, should
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * be unnecessary */
d6ce17c7f02ed3facdb45f65f546e587c2f00950Lennart PoetteringAP_DECLARE(void) ap_add_loaded_module(module *mod, apr_pool_t *p)
7de304525deafe4eb86060321e39787138dbbadfLennart Poettering * Add module pointer to top of chained module list
7de304525deafe4eb86060321e39787138dbbadfLennart Poettering * And module pointer to list of loaded modules
7de304525deafe4eb86060321e39787138dbbadfLennart Poettering * Notes: 1. ap_add_module() would already complain if no more space
7de304525deafe4eb86060321e39787138dbbadfLennart Poettering * exists for adding a dynamically loaded module
7de304525deafe4eb86060321e39787138dbbadfLennart Poettering * 2. ap_add_module() accepts double inclusion, so we have
7de304525deafe4eb86060321e39787138dbbadfLennart Poettering * to accept this, too.
7de304525deafe4eb86060321e39787138dbbadfLennart Poettering for (m = ap_loaded_modules; *m != NULL; m++)
7de304525deafe4eb86060321e39787138dbbadfLennart PoetteringAP_DECLARE(void) ap_remove_loaded_module(module *mod)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * Remove module pointer from chained module list
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * Remove module pointer from list of loaded modules
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * Note: 1. We cannot determine if the module was successfully
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * removed by ap_remove_module().
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * 2. We have not to complain explicity when the module
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * is not found because ap_remove_module() did it
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * for us already.
f8b07704b86886e52902f9b320623ab10aad7dc4Richard Maw for (m = m2 = ap_loaded_modules, done = 0; *m2 != NULL; m2++) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE(void) ap_setup_prelinked_modules(process_rec *process)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek apr_global_hook_pool=process->pconf;
12b42c76672a66c2d4ea7212c14f8f1b5a62b78dTom Gundersen * Initialise total_modules variable and module indices
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek for (m = ap_preloaded_modules; *m != NULL; m++)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek (*m)->module_index = total_modules++;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * Initialise list of loaded modules
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_loaded_modules = (module **)apr_palloc(process->pool,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek sizeof(module *) * (total_modules + DYNAMIC_MODULE_LIMIT + 1));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (ap_loaded_modules == NULL) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
6b94875fa3a7280e7f1c0df11027b927b6961edeRichard Maw "Ouch! Out of memory in ap_setup_prelinked_modules()!");
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek for (m = ap_preloaded_modules, m2 = ap_loaded_modules; *m != NULL; )
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * Initialize chain of linked (=activate) modules
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek for (m = ap_prelinked_modules; *m != NULL; m++)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_add_module(*m, process->pconf);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE(const char *) ap_find_module_name(module *m)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE(module *) ap_find_linked_module(const char *name)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek for (modp = ap_top_module; modp; modp = modp->next) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (strcmp(modp->name, name) == 0)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek/* Add a named module. Returns 1 if module found, 0 otherwise. */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE(int) ap_add_named_module(const char *name, apr_pool_t *p)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek for (modp = ap_loaded_modules[i]; modp; modp = ap_loaded_modules[++i]) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* Only add modules that are not already enabled. */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek/*****************************************************************
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * Resource, access, and .htaccess config files now parsed by a common
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * Let's begin with the basics; parsing the line and
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * invoking the function...
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic const char *invoke_cmd(const command_rec *cmd, cmd_parms *parms,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek void *mconfig, const char *args)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if ((parms->override & cmd->req_override) == 0)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return apr_pstrcat(parms->pool, cmd->name, " not allowed here", NULL);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek args = ap_resolve_env(parms->pool,args);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return cmd->AP_RAW_ARGS(parms, mconfig, args);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return apr_pstrcat(parms->pool, cmd->name, " takes no arguments",
af40e5d3acbdcff09c8809cd1b86ecf8871f65f0Lennart Poettering return apr_pstrcat(parms->pool, cmd->name, " takes one argument",
af40e5d3acbdcff09c8809cd1b86ecf8871f65f0Lennart Poettering cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL);
af40e5d3acbdcff09c8809cd1b86ecf8871f65f0Lennart Poettering w2 = ap_getword_conf(parms->pool, &args);
af40e5d3acbdcff09c8809cd1b86ecf8871f65f0Lennart Poettering if (*w == '\0' || *w2 == '\0' || *args != 0)
af40e5d3acbdcff09c8809cd1b86ecf8871f65f0Lennart Poettering return apr_pstrcat(parms->pool, cmd->name, " takes two arguments",
af40e5d3acbdcff09c8809cd1b86ecf8871f65f0Lennart Poettering cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL);
af40e5d3acbdcff09c8809cd1b86ecf8871f65f0Lennart Poettering return cmd->AP_TAKE2(parms, mconfig, w, w2);
af40e5d3acbdcff09c8809cd1b86ecf8871f65f0Lennart Poettering w2 = ap_getword_conf(parms->pool, &args);
af40e5d3acbdcff09c8809cd1b86ecf8871f65f0Lennart Poettering return apr_pstrcat(parms->pool, cmd->name, " takes 1-2 arguments",
af40e5d3acbdcff09c8809cd1b86ecf8871f65f0Lennart Poettering cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL);
af40e5d3acbdcff09c8809cd1b86ecf8871f65f0Lennart Poettering return cmd->AP_TAKE2(parms, mconfig, w, *w2 ? w2 : NULL);
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering w2 = ap_getword_conf(parms->pool, &args);
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering w3 = ap_getword_conf(parms->pool, &args);
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering if (*w == '\0' || *w2 == '\0' || *w3 == '\0' || *args != 0)
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering return apr_pstrcat(parms->pool, cmd->name, " takes three arguments",
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL);
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering return cmd->AP_TAKE3(parms, mconfig, w, w2, w3);
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering w2 = ap_getword_conf(parms->pool, &args);
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering w3 = *args ? ap_getword_conf(parms->pool, &args) : NULL;
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering if (*w == '\0' || *w2 == '\0' || *args != 0)
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering return apr_pstrcat(parms->pool, cmd->name,
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering " takes two or three arguments",
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL);
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering return cmd->AP_TAKE3(parms, mconfig, w, w2, w3);
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering w2 = *args ? ap_getword_conf(parms->pool, &args) : NULL;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek w3 = *args ? ap_getword_conf(parms->pool, &args) : NULL;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return apr_pstrcat(parms->pool, cmd->name,
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering " takes one, two or three arguments",
af40e5d3acbdcff09c8809cd1b86ecf8871f65f0Lennart Poettering cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return cmd->AP_TAKE3(parms, mconfig, w, w2, w3);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek w = ap_getword_conf(parms->pool, &args);
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering w2 = *args ? ap_getword_conf(parms->pool, &args) : NULL;
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering w3 = *args ? ap_getword_conf(parms->pool, &args) : NULL;
af40e5d3acbdcff09c8809cd1b86ecf8871f65f0Lennart Poettering if (*w == '\0' || (w2 && *w2 && !w3) || *args != 0)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return apr_pstrcat(parms->pool, cmd->name,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek " takes one or three arguments",
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return cmd->AP_TAKE3(parms, mconfig, w, w2, w3);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek while (*(w = ap_getword_conf(parms->pool, &args)) != '\0') {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if ((errmsg = cmd->AP_TAKE1(parms, mconfig, w)))
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek w = ap_getword_conf(parms->pool, &args);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return apr_pstrcat(parms->pool, cmd->name,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek " requires at least two arguments",
7de304525deafe4eb86060321e39787138dbbadfLennart Poettering cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL);
7de304525deafe4eb86060321e39787138dbbadfLennart Poettering while (*(w2 = ap_getword_conf(parms->pool, &args)) != '\0') {
af40e5d3acbdcff09c8809cd1b86ecf8871f65f0Lennart Poettering if ((errmsg = cmd->AP_TAKE2(parms, mconfig, w, w2)))
7de304525deafe4eb86060321e39787138dbbadfLennart Poettering if (*w == '\0' || (strcasecmp(w, "on") && strcasecmp(w, "off")))
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return apr_pstrcat(parms->pool, cmd->name, " must be On or Off",
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return cmd->AP_FLAG(parms, mconfig, strcasecmp(w, "off") != 0);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return apr_pstrcat(parms->pool, cmd->name,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek " is improperly configured internally (server bug)",
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_CORE_DECLARE(const command_rec *) ap_find_command(const char *name,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (!strcasecmp(name, cmds->name))
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_CORE_DECLARE(const command_rec *) ap_find_command_in_modules(
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek const char *cmd_name, module **mod)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek for (modp = *mod; modp; modp = modp->next) {
e0ea94c1e2ab3930c85c6057189a2a829a13a800Lennart Poettering if (modp->cmds && (cmdp = ap_find_command(cmd_name, modp->cmds))) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_CORE_DECLARE(void *) ap_set_config_vectors(server_rec *server,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_conf_vector_t *section_vector,
ac92ced5bb41def1d90f871d6c8cfec2b03c0c7dBenjamin Franzke void *section_config = ap_get_module_config(section_vector, mod);
ac92ced5bb41def1d90f871d6c8cfec2b03c0c7dBenjamin Franzke void *server_config = ap_get_module_config(server->module_config, mod);
ac92ced5bb41def1d90f871d6c8cfec2b03c0c7dBenjamin Franzke if (!section_config && mod->create_dir_config) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* ### need to fix the create_dir_config functions' prototype... */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek section_config = (*mod->create_dir_config)(pconf, (char *)section);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_set_module_config(section_vector, mod, section_config);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (!server_config && mod->create_server_config) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek server_config = (*mod->create_server_config)(pconf, server);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_set_module_config(server->module_config, mod, server_config);
e0ea94c1e2ab3930c85c6057189a2a829a13a800Lennart Poetteringstatic const char *execute_now(char *cmd_line, const char *args,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek apr_pool_t *p, apr_pool_t *ptemp,
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poetteringstatic const char *ap_build_config_sub(apr_pool_t *p, apr_pool_t *temp_pool,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek args = ap_resolve_env(temp_pool, l);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek cmd_name = ap_getword_conf(p, &args);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* Note: this branch should not occur. An empty line should have
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * triggered the exit further above.
16eb4024887b1b79fc56706fda25eadaecdef2d4Zbigniew Jędrzejewski-Szmek char *lastc = cmd_name + strlen(cmd_name) - 1;
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);
mod,
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)
char *endptr;
return error_str;
void *struct_ptr,
const char *arg_)
return NULL;
return NULL;
const char *arg)
const char *path;
if (!path) {
return NULL;
void *struct_ptr,
const char *arg)
char *newpath;
return newpath;
return NULL;
char l[MAX_STRING_LEN];
const char *args;
char *cmd_name;
args = l;
const char *msg;
return msg;
NULL);
NULL);
int curr_idx;
return NULL;
bufsiz);
return buf;
const char *errmsg;
if (errmsg) {
errmsg);
char *fname;
} fnames;
apr_pool_t *p,
const char *errmsg;
/* don't require conf/httpd.conf if we have a -C or -c switch */
int current;
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;
const char *hostname,
s->timeout = 0;
s->keep_alive_timeout = 0;
*ps = s;
s->port = 0;
const char *filename,
const char *confname;
p, ptemp);
if (!confname) {
filename);
p, ptemp);
module *m)
if (m->create_server_config)
(*m->create_server_config)(p, s));
if (m->create_dir_config)
module *m;
if (m->rewrite_args) {
for (n = 0; ap_loaded_modules[n]; ++n) {
for (n = 0; ap_loaded_modules[n]; ++n)
return MPM_NAME;