config.c revision 5dea9095cbfab622c65e5f2f806007aaa7d7761a
08cb74ca432a8c24e39f17dedce527e6a47b8001jerenkrantz/* ====================================================================
08cb74ca432a8c24e39f17dedce527e6a47b8001jerenkrantz * The Apache Software License, Version 1.1
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb *
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd * Copyright (c) 2000 The Apache Software Foundation. All rights
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd * reserved.
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd *
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * Redistribution and use in source and binary forms, with or without
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd * modification, are permitted provided that the following conditions
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * are met:
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd *
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd * 1. Redistributions of source code must retain the above copyright
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd * notice, this list of conditions and the following disclaimer.
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd *
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd * 2. Redistributions in binary form must reproduce the above copyright
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * notice, this list of conditions and the following disclaimer in
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * the documentation and/or other materials provided with the
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * distribution.
9d129b55f5a43abf43865c6b0eb6dd19bc22aba8ianh *
9d129b55f5a43abf43865c6b0eb6dd19bc22aba8ianh * 3. The end-user documentation included with the redistribution,
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * if any, must include the following acknowledgment:
9d129b55f5a43abf43865c6b0eb6dd19bc22aba8ianh * "This product includes software developed by the
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * Apache Software Foundation (http://www.apache.org/)."
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * Alternately, this acknowledgment may appear in the software itself,
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * if and wherever such third-party acknowledgments normally appear.
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb *
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * 4. The names "Apache" and "Apache Software Foundation" must
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * not be used to endorse or promote products derived from this
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * software without prior written permission. For written
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * permission, please contact apache@apache.org.
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb *
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * 5. Products derived from this software may not be called "Apache",
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * nor may "Apache" appear in their name, without prior written
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * permission of the Apache Software Foundation.
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb *
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
f888346b48f5e5b5e3f0a47dedb8cefd2759a4e2gregames * SUCH DAMAGE.
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * ====================================================================
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb *
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * This software consists of voluntary contributions made by many
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * individuals on behalf of the Apache Software Foundation. For more
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * information on the Apache Software Foundation, please see
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * <http://www.apache.org/>.
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb *
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * Portions of this software are based upon public domain software
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz * originally written at the National Center for Supercomputing Applications,
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz * University of Illinois, Urbana-Champaign.
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz */
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz/*
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz * http_config.c: once was auxillary functions for reading httpd's config
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz * file and converting filenames into a namespace
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz *
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz * Rob McCool
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb *
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * Wall-to-wall rewrite for Apache... commands which are part of the
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * server core can now be found next door in "http_core.c". Now contains
4f9c22c4f27571d54197be9674e1fc0d528192aestriker * general command loop, and functions which do bookkeeping for the new
a2a0abd88b19e042a3eb2a9fa1702c25ad51303dwrowe * Apache config stuff (modules and configuration vectors).
4f9c22c4f27571d54197be9674e1fc0d528192aestriker *
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * rst
4f9c22c4f27571d54197be9674e1fc0d528192aestriker *
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb */
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb#include "apr.h"
4f9c22c4f27571d54197be9674e1fc0d528192aestriker#include "apr_strings.h"
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb#include "apr_portable.h"
4f9c22c4f27571d54197be9674e1fc0d528192aestriker#include "apr_file_io.h"
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
4f9c22c4f27571d54197be9674e1fc0d528192aestriker#if APR_HAVE_STDIO_H
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb#include <stdio.h>
4f9c22c4f27571d54197be9674e1fc0d528192aestriker#endif
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb#define CORE_PRIVATE
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe#include "ap_config.h"
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe#include "httpd.h"
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe#include "http_config.h"
2d399cd7535887fceaa9f8f116eb98ce68ddd602trawick#include "http_protocol.h"
c2cf53a40a9814eb91db2cdf820f97d943f21628coar#include "http_core.h"
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe#include "http_log.h" /* for errors in parse_htaccess */
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe#include "http_request.h" /* for default_handler (see invoke_handler) */
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar#include "http_main.h"
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe#include "http_vhost.h"
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar#include "util_cfgtree.h"
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe#ifdef HAVE_ARPA_INET_H
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe#include <arpa/inet.h>
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe#endif
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe#ifdef HAVE_STRINGS_H
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe#include <strings.h>
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe#endif
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewroweAP_DECLARE_DATA const char *ap_server_argv0;
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe
3e392a5afd51526de3cb15d57ee46d8cb160ae65gregamesAP_DECLARE_DATA const char *ap_server_root;
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewroweAP_DECLARE_DATA apr_array_header_t *ap_server_pre_read_config;
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewroweAP_DECLARE_DATA apr_array_header_t *ap_server_post_read_config;
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewroweAP_DECLARE_DATA apr_array_header_t *ap_server_config_defines;
8419e6f8bff1a3617933f3ba760d2bdec7442f44coar
8419e6f8bff1a3617933f3ba760d2bdec7442f44coarAP_DECLARE_DATA ap_directive_t *ap_conftree;
8419e6f8bff1a3617933f3ba760d2bdec7442f44coar
8419e6f8bff1a3617933f3ba760d2bdec7442f44coarAP_HOOK_STRUCT(
8419e6f8bff1a3617933f3ba760d2bdec7442f44coar AP_HOOK_LINK(header_parser)
8419e6f8bff1a3617933f3ba760d2bdec7442f44coar AP_HOOK_LINK(pre_config)
8419e6f8bff1a3617933f3ba760d2bdec7442f44coar AP_HOOK_LINK(post_config)
8419e6f8bff1a3617933f3ba760d2bdec7442f44coar AP_HOOK_LINK(open_logs)
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz AP_HOOK_LINK(child_init)
2a6e98ba4ffa30ded5d8831664c5cb2a170a56b6coar)
8419e6f8bff1a3617933f3ba760d2bdec7442f44coar
8419e6f8bff1a3617933f3ba760d2bdec7442f44coarAP_IMPLEMENT_HOOK_RUN_ALL(int,header_parser,
8419e6f8bff1a3617933f3ba760d2bdec7442f44coar (request_rec *r),(r),OK,DECLINED)
8419e6f8bff1a3617933f3ba760d2bdec7442f44coarAP_IMPLEMENT_HOOK_VOID(pre_config,
8419e6f8bff1a3617933f3ba760d2bdec7442f44coar (apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp),
8419e6f8bff1a3617933f3ba760d2bdec7442f44coar (pconf,plog,ptemp))
2a6e98ba4ffa30ded5d8831664c5cb2a170a56b6coarAP_IMPLEMENT_HOOK_VOID(post_config,
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz (apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp,
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz server_rec *s),(pconf,plog,ptemp,s))
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewroweAP_IMPLEMENT_HOOK_VOID(open_logs,
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe (apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp,
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe server_rec *s),(pconf,plog,ptemp,s))
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewroweAP_IMPLEMENT_HOOK_VOID(child_init,
4f9c22c4f27571d54197be9674e1fc0d528192aestriker (apr_pool_t *pchild, server_rec *s),(pchild,s))
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
3e392a5afd51526de3cb15d57ee46d8cb160ae65gregames/****************************************************************
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe *
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar * We begin with the functions which deal with the linked list
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe * of modules which control just about all of the server operation.
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe */
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe/* total_modules is the number of modules that have been linked
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe * into the server.
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe */
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowestatic int total_modules = 0;
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe/* dynamic_modules is the number of modules that have been added
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe * after the pre-loaded ones have been set up. It shouldn't be larger
4f9c22c4f27571d54197be9674e1fc0d528192aestriker * than DYNAMIC_MODULE_LIMIT.
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe */
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowestatic int dynamic_modules = 0;
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wroweAP_DECLARE_DATA module *top_module = NULL;
c2cf53a40a9814eb91db2cdf820f97d943f21628coarAP_DECLARE_DATA module **ap_loaded_modules=NULL;
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe
4775dfc34c90fada8c7c4d6a57ed8a3114d55c2dtrawicktypedef int (*handler_func) (request_rec *);
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowetypedef void *(*dir_maker_func) (apr_pool_t *, char *);
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowetypedef void *(*merger_func) (apr_pool_t *, void *, void *);
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe/* Dealing with config vectors. These are associated with per-directory,
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar * per-server, and per-request configuration, and have a void* pointer for
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe * each modules. The nature of the structure pointed to is private to the
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe * module in question... the core doesn't (and can't) know. However, there
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe * are defined interfaces which allow it to create instances of its private
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe * per-directory and per-server structures, and to merge the per-directory
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe * structures of a directory and its subdirectory (producing a new one in
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe * which the defaults applying to the base directory have been properly
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe * overridden).
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe */
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe#ifndef ap_get_module_config
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewroweAP_DECLARE(void *) ap_get_module_config(void *conf_vector, module *m)
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe{
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe void **confv = (void **) conf_vector;
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe return confv[m->module_index];
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe}
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe#endif
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe#ifndef ap_set_module_config
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wroweAP_DECLARE(void) ap_set_module_config(void *conf_vector, module *m, void *val)
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe{
4f9c22c4f27571d54197be9674e1fc0d528192aestriker void **confv = (void **) conf_vector;
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe confv[m->module_index] = val;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker}
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe#endif
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowestatic void *create_empty_config(apr_pool_t *p)
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe{
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar void **conf_vector = (void **) apr_pcalloc(p, sizeof(void *) *
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe (total_modules + DYNAMIC_MODULE_LIMIT));
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe return (void *) conf_vector;
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe}
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowestatic void *create_default_per_dir_config(apr_pool_t *p)
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe{
4f9c22c4f27571d54197be9674e1fc0d528192aestriker void **conf_vector = (void **) apr_pcalloc(p, sizeof(void *) * (total_modules + DYNAMIC_MODULE_LIMIT));
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe module *modp;
c2cf53a40a9814eb91db2cdf820f97d943f21628coar
c2cf53a40a9814eb91db2cdf820f97d943f21628coar for (modp = top_module; modp; modp = modp->next) {
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe dir_maker_func df = modp->create_dir_config;
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz if (df)
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz conf_vector[modp->module_index] = (*df) (p, NULL);
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe }
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
c2cf53a40a9814eb91db2cdf820f97d943f21628coar return (void *) conf_vector;
c2cf53a40a9814eb91db2cdf820f97d943f21628coar}
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantzvoid *
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz ap_merge_per_dir_configs(apr_pool_t *p, void *base, void *new)
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz{
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe void **conf_vector = (void **) apr_palloc(p, sizeof(void *) * total_modules);
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe void **base_vector = (void **) base;
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe void **new_vector = (void **) new;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker module *modp;
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe
08ab23ee4e41ac8587da5a3bb8d4e9c49523b0b8nd for (modp = top_module; modp; modp = modp->next) {
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe merger_func df = modp->merge_dir_config;
08ab23ee4e41ac8587da5a3bb8d4e9c49523b0b8nd int i = modp->module_index;
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe
4f9c22c4f27571d54197be9674e1fc0d528192aestriker if (df && new_vector[i])
c2cf53a40a9814eb91db2cdf820f97d943f21628coar conf_vector[i] = (*df) (p, base_vector[i], new_vector[i]);
c2cf53a40a9814eb91db2cdf820f97d943f21628coar else
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe conf_vector[i] = new_vector[i] ? new_vector[i] : base_vector[i];
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz }
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz return (void *) conf_vector;
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe}
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
c2cf53a40a9814eb91db2cdf820f97d943f21628coarstatic void *create_server_config(apr_pool_t *p, server_rec *s)
c2cf53a40a9814eb91db2cdf820f97d943f21628coar{
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe void **conf_vector = (void **) apr_pcalloc(p, sizeof(void *) * (total_modules + DYNAMIC_MODULE_LIMIT));
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz module *modp;
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz for (modp = top_module; modp; modp = modp->next) {
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe if (modp->create_server_config)
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe conf_vector[modp->module_index] = (*modp->create_server_config) (p, s);
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe }
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe return (void *) conf_vector;
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe}
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowestatic void merge_server_configs(apr_pool_t *p, void *base, void *virt)
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe{
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe /* Can reuse the 'virt' vector for the spine of it, since we don't
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz * have to deal with the moral equivalent of .htaccess files here...
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe */
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe void **base_vector = (void **) base;
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe void **virt_vector = (void **) virt;
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe module *modp;
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe for (modp = top_module; modp; modp = modp->next) {
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe merger_func df = modp->merge_server_config;
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe int i = modp->module_index;
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe if (!virt_vector[i])
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe virt_vector[i] = base_vector[i];
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe else if (df)
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe virt_vector[i] = (*df) (p, base_vector[i], virt_vector[i]);
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe }
4f9c22c4f27571d54197be9674e1fc0d528192aestriker}
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowevoid *ap_create_request_config(apr_pool_t *p)
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe{
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe return create_empty_config(p);
0540a0b469147b52e858587270dba31c2aaa9e09wrowe}
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowevoid *ap_create_conn_config(apr_pool_t *p)
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe{
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe return create_empty_config(p);
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe}
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
4f9c22c4f27571d54197be9674e1fc0d528192aestrikerAP_CORE_DECLARE(void *) ap_create_per_dir_config(apr_pool_t *p)
4f9c22c4f27571d54197be9674e1fc0d528192aestriker{
4f9c22c4f27571d54197be9674e1fc0d528192aestriker return create_empty_config(p);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker}
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe/*
a2b181763cb35fd899feb4a436aeadaa80bf91eabrianp * For speed/efficiency we generate a compact list of all the handlers
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe * and wildcard handlers. This means we won't have to scan the entire
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe * module list looking for handlers... where we'll find a whole whack
a2b181763cb35fd899feb4a436aeadaa80bf91eabrianp * of NULLs.
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe */
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowetypedef struct {
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe handler_rec hr;
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe size_t len;
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe} fast_handler_rec;
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowestatic fast_handler_rec *handlers;
a2b181763cb35fd899feb4a436aeadaa80bf91eabrianpstatic fast_handler_rec *wildhandlers;
a2b181763cb35fd899feb4a436aeadaa80bf91eabrianp
a2b181763cb35fd899feb4a436aeadaa80bf91eabrianpstatic void init_handlers(apr_pool_t *p)
a2b181763cb35fd899feb4a436aeadaa80bf91eabrianp{
4f9c22c4f27571d54197be9674e1fc0d528192aestriker module *modp;
a2b181763cb35fd899feb4a436aeadaa80bf91eabrianp int nhandlers = 0;
a2b181763cb35fd899feb4a436aeadaa80bf91eabrianp int nwildhandlers = 0;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker const handler_rec *handp;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker fast_handler_rec *ph, *pw;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker const char *starp;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
4f9c22c4f27571d54197be9674e1fc0d528192aestriker for (modp = top_module; modp; modp = modp->next) {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker if (!modp->handlers)
4f9c22c4f27571d54197be9674e1fc0d528192aestriker continue;
a2b181763cb35fd899feb4a436aeadaa80bf91eabrianp for (handp = modp->handlers; handp->content_type; ++handp) {
7a2edaa0193cbb0d79a65a8461a609a9402aea49brianp if (ap_strchr_c(handp->content_type, '*')) {
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe nwildhandlers ++;
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe } else {
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe nhandlers ++;
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe }
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe }
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe }
4f9c22c4f27571d54197be9674e1fc0d528192aestriker ph = handlers = apr_palloc(p, sizeof(*ph)*(nhandlers + 1));
a2b181763cb35fd899feb4a436aeadaa80bf91eabrianp pw = wildhandlers = apr_palloc(p, sizeof(*pw)*(nwildhandlers + 1));
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe for (modp = top_module; modp; modp = modp->next) {
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe if (!modp->handlers)
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe continue;
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe for (handp = modp->handlers; handp->content_type; ++handp) {
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb if ((starp = ap_strchr_c(handp->content_type, '*'))) {
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb pw->hr.content_type = handp->content_type;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb pw->hr.handler = handp->handler;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb pw->len = starp - handp->content_type;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb pw ++;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb } else {
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb ph->hr.content_type = handp->content_type;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb ph->hr.handler = handp->handler;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb ph->len = strlen(handp->content_type);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb ph ++;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb }
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb }
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb }
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb pw->hr.content_type = NULL;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb pw->hr.handler = NULL;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb ph->hr.content_type = NULL;
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe ph->hr.handler = NULL;
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe}
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwroweint ap_invoke_handler(request_rec *r)
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe{
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe fast_handler_rec *handp;
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe const char *handler;
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe const char *p;
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe size_t handler_len;
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe int result = HTTP_INTERNAL_SERVER_ERROR;
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe
4f9c22c4f27571d54197be9674e1fc0d528192aestriker if (r->handler) {
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe handler = r->handler;
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe handler_len = strlen(handler);
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe }
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe else {
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe handler = r->content_type ? r->content_type : ap_default_type(r);
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe if ((p = ap_strchr_c(handler, ';')) != NULL) {
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz /* MIME type arguments */
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe while (p > handler && p[-1] == ' ')
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar --p; /* strip trailing spaces */
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe handler_len = p - handler;
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar }
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe else {
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz handler_len = strlen(handler);
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz }
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz }
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe
659ad814f714e556bdd03e1d771cba156baab92ewrowe /* Pass one --- direct matches */
659ad814f714e556bdd03e1d771cba156baab92ewrowe
659ad814f714e556bdd03e1d771cba156baab92ewrowe for (handp = handlers; handp->hr.content_type; ++handp) {
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe if (handler_len == handp->len
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar && !strncmp(handler, handp->hr.content_type, handler_len)) {
11fb2f3611e6ff9a541e10b13e3108934f828141gregames result = (*handp->hr.handler) (r);
11fb2f3611e6ff9a541e10b13e3108934f828141gregames
11fb2f3611e6ff9a541e10b13e3108934f828141gregames if (result != DECLINED)
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz return result;
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz }
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz }
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz
4f9c22c4f27571d54197be9674e1fc0d528192aestriker /* Pass two --- wildcard matches */
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe for (handp = wildhandlers; handp->hr.content_type; ++handp) {
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe if (handler_len >= handp->len
4f9c22c4f27571d54197be9674e1fc0d528192aestriker && !strncmp(handler, handp->hr.content_type, handp->len)) {
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe result = (*handp->hr.handler) (r);
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe if (result != DECLINED)
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar return result;
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick }
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick }
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe if (result == HTTP_INTERNAL_SERVER_ERROR && r->handler && r->filename) {
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_WARNING, 0, r,
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar "handler \"%s\" not found for: %s", r->handler, r->filename);
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe }
4f9c22c4f27571d54197be9674e1fc0d528192aestriker return HTTP_INTERNAL_SERVER_ERROR;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker}
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoarAP_DECLARE(int) ap_method_is_limited(cmd_parms *cmd, const char *method) {
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe int methnum;
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick int i;
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe char **xmethod;
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe methnum = ap_method_number_of(method);
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe /*
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe * The simple case: a method hard-coded into Apache.
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz */
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz if (methnum != M_INVALID) {
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz return (methnum & cmd->limited);
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz }
4f9c22c4f27571d54197be9674e1fc0d528192aestriker /*
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe * Some extension method we don't know implicitly.
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe */
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb if ((cmd->limited_xmethods == NULL)
8aefbd756763807188d2e3ce336a8680e4893066wrowe || (cmd->limited_xmethods->nelts == 0)) {
700b96db75e7cfadb5219978c1735b710d583763wrowe return 0;
700b96db75e7cfadb5219978c1735b710d583763wrowe }
700b96db75e7cfadb5219978c1735b710d583763wrowe xmethod = (char **) cmd->limited_xmethods->elts;
700b96db75e7cfadb5219978c1735b710d583763wrowe for (i = 0; i < cmd->limited_xmethods->nelts; ++i) {
700b96db75e7cfadb5219978c1735b710d583763wrowe if (strcmp(method, xmethod[i]) == 0) {
700b96db75e7cfadb5219978c1735b710d583763wrowe return 1;
700b96db75e7cfadb5219978c1735b710d583763wrowe }
700b96db75e7cfadb5219978c1735b710d583763wrowe }
700b96db75e7cfadb5219978c1735b710d583763wrowe return 0;
700b96db75e7cfadb5219978c1735b710d583763wrowe}
700b96db75e7cfadb5219978c1735b710d583763wrowe
700b96db75e7cfadb5219978c1735b710d583763wroweAP_DECLARE(void) ap_register_hooks(module *m)
700b96db75e7cfadb5219978c1735b710d583763wrowe {
700b96db75e7cfadb5219978c1735b710d583763wrowe if(m->register_hooks)
700b96db75e7cfadb5219978c1735b710d583763wrowe {
700b96db75e7cfadb5219978c1735b710d583763wrowe if(getenv("SHOW_HOOKS"))
103a93c625bcde1a6a7a5155b64dcda36f612180pquerna {
700b96db75e7cfadb5219978c1735b710d583763wrowe printf("Registering hooks for %s\n",m->name);
700b96db75e7cfadb5219978c1735b710d583763wrowe ap_debug_module_hooks=1;
6964758306167dd898baedd21048bd1515dd9d30trawick }
700b96db75e7cfadb5219978c1735b710d583763wrowe ap_current_hooking_module=m->name;
700b96db75e7cfadb5219978c1735b710d583763wrowe m->register_hooks();
700b96db75e7cfadb5219978c1735b710d583763wrowe }
700b96db75e7cfadb5219978c1735b710d583763wrowe }
700b96db75e7cfadb5219978c1735b710d583763wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowe/* One-time setup for precompiled modules --- NOT to be done on restart */
700b96db75e7cfadb5219978c1735b710d583763wrowe
700b96db75e7cfadb5219978c1735b710d583763wroweAP_DECLARE(void) ap_add_module(module *m)
700b96db75e7cfadb5219978c1735b710d583763wrowe{
700b96db75e7cfadb5219978c1735b710d583763wrowe /* This could be called from an AddModule httpd.conf command,
700b96db75e7cfadb5219978c1735b710d583763wrowe * after the file has been linked and the module structure within it
700b96db75e7cfadb5219978c1735b710d583763wrowe * teased out...
700b96db75e7cfadb5219978c1735b710d583763wrowe */
700b96db75e7cfadb5219978c1735b710d583763wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowe if (m->version != MODULE_MAGIC_NUMBER_MAJOR) {
700b96db75e7cfadb5219978c1735b710d583763wrowe ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
700b96db75e7cfadb5219978c1735b710d583763wrowe "%s: module \"%s\" is not compatible with this "
700b96db75e7cfadb5219978c1735b710d583763wrowe "version of Apache.", ap_server_argv0, m->name);
700b96db75e7cfadb5219978c1735b710d583763wrowe ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, "Please contact the vendor for the correct version.");
700b96db75e7cfadb5219978c1735b710d583763wrowe exit(1);
700b96db75e7cfadb5219978c1735b710d583763wrowe }
700b96db75e7cfadb5219978c1735b710d583763wrowe
103a93c625bcde1a6a7a5155b64dcda36f612180pquerna if (m->next == NULL) {
103a93c625bcde1a6a7a5155b64dcda36f612180pquerna m->next = top_module;
700b96db75e7cfadb5219978c1735b710d583763wrowe top_module = m;
700b96db75e7cfadb5219978c1735b710d583763wrowe }
700b96db75e7cfadb5219978c1735b710d583763wrowe if (m->module_index == -1) {
8aefbd756763807188d2e3ce336a8680e4893066wrowe m->module_index = total_modules++;
8aefbd756763807188d2e3ce336a8680e4893066wrowe dynamic_modules++;
8aefbd756763807188d2e3ce336a8680e4893066wrowe
8aefbd756763807188d2e3ce336a8680e4893066wrowe if (dynamic_modules > DYNAMIC_MODULE_LIMIT) {
8aefbd756763807188d2e3ce336a8680e4893066wrowe ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
8aefbd756763807188d2e3ce336a8680e4893066wrowe "%s: module \"%s\" could not be loaded, because"
8aefbd756763807188d2e3ce336a8680e4893066wrowe " the dynamic", ap_server_argv0, m->name);
8aefbd756763807188d2e3ce336a8680e4893066wrowe ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
8aefbd756763807188d2e3ce336a8680e4893066wrowe "module limit was reached. Please increase "
8aefbd756763807188d2e3ce336a8680e4893066wrowe "DYNAMIC_MODULE_LIMIT and recompile.");
8aefbd756763807188d2e3ce336a8680e4893066wrowe exit(1);
8aefbd756763807188d2e3ce336a8680e4893066wrowe }
8aefbd756763807188d2e3ce336a8680e4893066wrowe }
8aefbd756763807188d2e3ce336a8680e4893066wrowe
8aefbd756763807188d2e3ce336a8680e4893066wrowe /* Some C compilers put a complete path into __FILE__, but we want
a2a0abd88b19e042a3eb2a9fa1702c25ad51303dwrowe * only the filename (e.g. mod_includes.c). So check for path
8aefbd756763807188d2e3ce336a8680e4893066wrowe * components (Unix and DOS), and remove them.
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe */
8aefbd756763807188d2e3ce336a8680e4893066wrowe
8aefbd756763807188d2e3ce336a8680e4893066wrowe if (ap_strrchr_c(m->name, '/'))
2fa5b5878e7567e2875807c3e2a2b3b0d3ef74bewrowe m->name = 1 + ap_strrchr_c(m->name, '/');
2fa5b5878e7567e2875807c3e2a2b3b0d3ef74bewrowe if (ap_strrchr_c(m->name, '\\'))
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe m->name = 1 + ap_strrchr_c(m->name, '\\');
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
8aefbd756763807188d2e3ce336a8680e4893066wrowe#ifdef _OSD_POSIX /* __FILE__="*POSIX(/home/martin/apache/src/modules/standard/mod_info.c)" */
8aefbd756763807188d2e3ce336a8680e4893066wrowe /* We cannot fix the string in-place, because it's const */
dc8692c6c0ca616a09aa12dad005f2ef23baa1a0wrowe if (m->name[strlen(m->name)-1]==')') {
a8d11d78181478da6a672f7fbc58b8d523351f49wrowe char *tmp = strdup(m->name); /* FIXME:memory leak, albeit a small one */
4f9c22c4f27571d54197be9674e1fc0d528192aestriker tmp[strlen(tmp)-1] = '\0';
23c6309e36a63b13b61c35999c978017521993d6wrowe m->name = tmp;
23c6309e36a63b13b61c35999c978017521993d6wrowe }
4f9c22c4f27571d54197be9674e1fc0d528192aestriker#endif /*_OSD_POSIX*/
23c6309e36a63b13b61c35999c978017521993d6wrowe
8aefbd756763807188d2e3ce336a8680e4893066wrowe /* FIXME: is this the right place to call this? */
23c6309e36a63b13b61c35999c978017521993d6wrowe ap_register_hooks(m);
2d399cd7535887fceaa9f8f116eb98ce68ddd602trawick}
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
23c6309e36a63b13b61c35999c978017521993d6wrowe/*
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe * remove_module undoes what add_module did. There are some caveats:
8aefbd756763807188d2e3ce336a8680e4893066wrowe * when the module is removed, its slot is lost so all the current
8aefbd756763807188d2e3ce336a8680e4893066wrowe * per-dir and per-server configurations are invalid. So we should
cf6ef072483172309861d06e85b1aeff4573c060wrowe * only ever call this function when you are invalidating almost
cf6ef072483172309861d06e85b1aeff4573c060wrowe * all our current data. I.e. when doing a restart.
cf6ef072483172309861d06e85b1aeff4573c060wrowe */
8aefbd756763807188d2e3ce336a8680e4893066wrowe
4f9c22c4f27571d54197be9674e1fc0d528192aestrikerAP_DECLARE(void) ap_remove_module(module *m)
4f9c22c4f27571d54197be9674e1fc0d528192aestriker{
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe module *modp;
2d399cd7535887fceaa9f8f116eb98ce68ddd602trawick
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe modp = top_module;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker if (modp == m) {
a8d11d78181478da6a672f7fbc58b8d523351f49wrowe /* We are the top module, special case */
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe top_module = modp->next;
8aefbd756763807188d2e3ce336a8680e4893066wrowe m->next = NULL;
8aefbd756763807188d2e3ce336a8680e4893066wrowe }
cf6ef072483172309861d06e85b1aeff4573c060wrowe else {
cf6ef072483172309861d06e85b1aeff4573c060wrowe /* Not the top module, find use. When found modp will
cf6ef072483172309861d06e85b1aeff4573c060wrowe * point to the module _before_ us in the list
8aefbd756763807188d2e3ce336a8680e4893066wrowe */
cf6ef072483172309861d06e85b1aeff4573c060wrowe
cf6ef072483172309861d06e85b1aeff4573c060wrowe while (modp && modp->next != m) {
a2b181763cb35fd899feb4a436aeadaa80bf91eabrianp modp = modp->next;
cf6ef072483172309861d06e85b1aeff4573c060wrowe }
4f9c22c4f27571d54197be9674e1fc0d528192aestriker if (!modp) {
cf6ef072483172309861d06e85b1aeff4573c060wrowe /* Uh-oh, this module doesn't exist */
cf6ef072483172309861d06e85b1aeff4573c060wrowe ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, 0, NULL,
cf6ef072483172309861d06e85b1aeff4573c060wrowe "Cannot remove module %s: not found in module list",
cf6ef072483172309861d06e85b1aeff4573c060wrowe m->name);
cf6ef072483172309861d06e85b1aeff4573c060wrowe return;
cf6ef072483172309861d06e85b1aeff4573c060wrowe }
cf6ef072483172309861d06e85b1aeff4573c060wrowe /* Eliminate us from the module list */
cf6ef072483172309861d06e85b1aeff4573c060wrowe modp->next = modp->next->next;
cf6ef072483172309861d06e85b1aeff4573c060wrowe }
69adb3d949e3dd17c0492a01fc2cf298832c7eefwrowe
ecde48c75338ff5712f2036711f813c6dedca28ewrowe m->module_index = -1; /* simulate being unloaded, should
d75626f0952c6152a99acd013a4f127d46f0f9edtrawick * be unnecessary */
d75626f0952c6152a99acd013a4f127d46f0f9edtrawick dynamic_modules--;
d75626f0952c6152a99acd013a4f127d46f0f9edtrawick total_modules--;
d75626f0952c6152a99acd013a4f127d46f0f9edtrawick}
d75626f0952c6152a99acd013a4f127d46f0f9edtrawick
d75626f0952c6152a99acd013a4f127d46f0f9edtrawickAP_DECLARE(void) ap_add_loaded_module(module *mod)
d75626f0952c6152a99acd013a4f127d46f0f9edtrawick{
d75626f0952c6152a99acd013a4f127d46f0f9edtrawick module **m;
ecde48c75338ff5712f2036711f813c6dedca28ewrowe
ecde48c75338ff5712f2036711f813c6dedca28ewrowe /*
d75626f0952c6152a99acd013a4f127d46f0f9edtrawick * Add module pointer to top of chained module list
ecde48c75338ff5712f2036711f813c6dedca28ewrowe */
ecde48c75338ff5712f2036711f813c6dedca28ewrowe ap_add_module(mod);
ecde48c75338ff5712f2036711f813c6dedca28ewrowe
ecde48c75338ff5712f2036711f813c6dedca28ewrowe /*
ecde48c75338ff5712f2036711f813c6dedca28ewrowe * And module pointer to list of loaded modules
d75626f0952c6152a99acd013a4f127d46f0f9edtrawick *
cf6ef072483172309861d06e85b1aeff4573c060wrowe * Notes: 1. ap_add_module() would already complain if no more space
cf6ef072483172309861d06e85b1aeff4573c060wrowe * exists for adding a dynamically loaded module
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar * 2. ap_add_module() accepts double inclusion, so we have
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe * to accept this, too.
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar */
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar for (m = ap_loaded_modules; *m != NULL; m++)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe ;
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar *m++ = mod;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe *m = NULL;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe}
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
e4a3f3c2f080cac75a15a6454cca429b8161c050wroweAP_DECLARE(void) ap_remove_loaded_module(module *mod)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe{
4f9c22c4f27571d54197be9674e1fc0d528192aestriker module **m;
23c6309e36a63b13b61c35999c978017521993d6wrowe module **m2;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker int done;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
4f9c22c4f27571d54197be9674e1fc0d528192aestriker /*
c2cf53a40a9814eb91db2cdf820f97d943f21628coar * Remove module pointer from chained module list
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe */
4f9c22c4f27571d54197be9674e1fc0d528192aestriker ap_remove_module(mod);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe /*
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe * Remove module pointer from list of loaded modules
a9a4544168a37b43bd180b3703ccee995f27a80awrowe *
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe * Note: 1. We cannot determine if the module was successfully
a9a4544168a37b43bd180b3703ccee995f27a80awrowe * removed by ap_remove_module().
4f9c22c4f27571d54197be9674e1fc0d528192aestriker * 2. We have not to complain explicity when the module
a9a4544168a37b43bd180b3703ccee995f27a80awrowe * is not found because ap_remove_module() did it
a9a4544168a37b43bd180b3703ccee995f27a80awrowe * for us already.
a9a4544168a37b43bd180b3703ccee995f27a80awrowe */
a9a4544168a37b43bd180b3703ccee995f27a80awrowe for (m = m2 = ap_loaded_modules, done = 0; *m2 != NULL; m2++) {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker if (*m2 == mod && done == 0)
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar done = 1;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe else
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar *m++ = *m2;
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar }
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe *m = NULL;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe}
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
e4a3f3c2f080cac75a15a6454cca429b8161c050wroweAP_DECLARE(void) ap_setup_prelinked_modules(process_rec *process)
8aefbd756763807188d2e3ce336a8680e4893066wrowe{
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe module **m;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe module **m2;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe ap_global_hook_pool=process->pconf;
700b96db75e7cfadb5219978c1735b710d583763wrowe
cf6ef072483172309861d06e85b1aeff4573c060wrowe /*
cf6ef072483172309861d06e85b1aeff4573c060wrowe * Initialise total_modules variable and module indices
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe */
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe total_modules = 0;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe for (m = ap_preloaded_modules; *m != NULL; m++)
8aefbd756763807188d2e3ce336a8680e4893066wrowe (*m)->module_index = total_modules++;
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz /*
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz * Initialise list of loaded modules
cf6ef072483172309861d06e85b1aeff4573c060wrowe */
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe ap_loaded_modules = (module **)apr_palloc(process->pool,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe sizeof(module *)*(total_modules+DYNAMIC_MODULE_LIMIT+1));
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe if (ap_loaded_modules == NULL) {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe "Ouch! Out of memory in ap_setup_prelinked_modules()!");
2fd8d1e14fc47762d1e01660b544d5e2a75c825dtrawick }
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe for (m = ap_preloaded_modules, m2 = ap_loaded_modules; *m != NULL; )
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe *m2++ = *m++;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe *m2 = NULL;
8aefbd756763807188d2e3ce336a8680e4893066wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe /*
700b96db75e7cfadb5219978c1735b710d583763wrowe * Initialize chain of linked (=activate) modules
700b96db75e7cfadb5219978c1735b710d583763wrowe */
700b96db75e7cfadb5219978c1735b710d583763wrowe for (m = ap_prelinked_modules; *m != NULL; m++)
700b96db75e7cfadb5219978c1735b710d583763wrowe ap_add_module(*m);
8aefbd756763807188d2e3ce336a8680e4893066wrowe
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe ap_sort_hooks();
4f9c22c4f27571d54197be9674e1fc0d528192aestriker}
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe
1b315ee865b0f11e582beb64127ca3a99a319d2fwroweAP_DECLARE(const char *) ap_find_module_name(module *m)
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe{
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe return m->name;
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe}
59513b1275fdc2021d4949ee03ae8229469abb86wrowe
4f9c22c4f27571d54197be9674e1fc0d528192aestrikerAP_DECLARE(module *) ap_find_linked_module(const char *name)
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe{
4f9c22c4f27571d54197be9674e1fc0d528192aestriker module *modp;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe for (modp = top_module; modp; modp = modp->next) {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker if (strcmp(modp->name, name) == 0)
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe return modp;
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe }
4f9c22c4f27571d54197be9674e1fc0d528192aestriker return NULL;
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe}
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe/* Add a named module. Returns 1 if module found, 0 otherwise. */
4f9c22c4f27571d54197be9674e1fc0d528192aestrikerAP_DECLARE(int) ap_add_named_module(const char *name)
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe{
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe module *modp;
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe int i = 0;
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe for (modp = ap_loaded_modules[i]; modp; modp = ap_loaded_modules[++i]) {
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe if (strcmp(modp->name, name) == 0) {
cf6ef072483172309861d06e85b1aeff4573c060wrowe /* Only add modules that are not already enabled. */
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe if (modp->next == NULL) {
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe ap_add_module(modp);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker }
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe return 1;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker }
4f9c22c4f27571d54197be9674e1fc0d528192aestriker }
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe return 0;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker}
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe
4f9c22c4f27571d54197be9674e1fc0d528192aestriker/* Clear the internal list of modules, in preparation for starting over. */
1b315ee865b0f11e582beb64127ca3a99a319d2fwroweAP_DECLARE(void) ap_clear_module_list()
4f9c22c4f27571d54197be9674e1fc0d528192aestriker{
4f9c22c4f27571d54197be9674e1fc0d528192aestriker module **m = &top_module;
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe module **next_m;
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe while (*m) {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker next_m = &((*m)->next);
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe *m = NULL;
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe m = next_m;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker }
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe /* This is required; so we add it always. */
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe ap_add_named_module("http_core.c");
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe}
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe/*****************************************************************
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe *
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe * Resource, access, and .htaccess config files now parsed by a common
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe * command loop.
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe *
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe * Let's begin with the basics; parsing the line and
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe * invoking the function...
cf6ef072483172309861d06e85b1aeff4573c060wrowe */
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
4f9c22c4f27571d54197be9674e1fc0d528192aestrikerstatic const char *invoke_cmd(const command_rec *cmd, cmd_parms *parms,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe void *mconfig, const char *args)
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe{
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe char *w, *w2, *w3;
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe const char *errmsg;
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe if ((parms->override & cmd->req_override) == 0)
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe return apr_pstrcat(parms->pool, cmd->name, " not allowed here", NULL);
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe parms->info = cmd->cmd_data;
38bcc87d9a06e8ba81165421403f275eca4e313btrawick parms->cmd = cmd;
38bcc87d9a06e8ba81165421403f275eca4e313btrawick
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe switch (cmd->args_how) {
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz case RAW_ARGS:
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe#ifdef RESOLVE_ENV_PER_TOKEN
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe args = ap_resolve_env(parms->pool,args);
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe#endif
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe return cmd->AP_RAW_ARGS(parms, mconfig, args);
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe case NO_ARGS:
4f9c22c4f27571d54197be9674e1fc0d528192aestriker if (*args != 0)
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe return apr_pstrcat(parms->pool, cmd->name, " takes no arguments",
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe NULL);
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe return cmd->AP_NO_ARGS(parms, mconfig);
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe case TAKE1:
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz w = ap_getword_conf(parms->pool, &args);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz if (*w == '\0' || *args != 0)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return apr_pstrcat(parms->pool, cmd->name, " takes one argument",
cf6ef072483172309861d06e85b1aeff4573c060wrowe cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL);
cf6ef072483172309861d06e85b1aeff4573c060wrowe
8aefbd756763807188d2e3ce336a8680e4893066wrowe return cmd->AP_TAKE1(parms, mconfig, w);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe case TAKE2:
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe w = ap_getword_conf(parms->pool, &args);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker w2 = ap_getword_conf(parms->pool, &args);
700b96db75e7cfadb5219978c1735b710d583763wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowe if (*w == '\0' || *w2 == '\0' || *args != 0)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return apr_pstrcat(parms->pool, cmd->name, " takes two arguments",
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
cf6ef072483172309861d06e85b1aeff4573c060wrowe return cmd->AP_TAKE2(parms, mconfig, w, w2);
cf6ef072483172309861d06e85b1aeff4573c060wrowe
4f9c22c4f27571d54197be9674e1fc0d528192aestriker case TAKE12:
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz w = ap_getword_conf(parms->pool, &args);
cf6ef072483172309861d06e85b1aeff4573c060wrowe w2 = ap_getword_conf(parms->pool, &args);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe if (*w == '\0' || *args != 0)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return apr_pstrcat(parms->pool, cmd->name, " takes 1-2 arguments",
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL);
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz
4f9c22c4f27571d54197be9674e1fc0d528192aestriker return cmd->AP_TAKE2(parms, mconfig, w, *w2 ? w2 : NULL);
548b2980e83f609186a76e98fb245d02e8547bc3jerenkrantz
548b2980e83f609186a76e98fb245d02e8547bc3jerenkrantz case TAKE3:
4fca95918a9c0ae93593806544b425d0adc2fcc3wrowe
548b2980e83f609186a76e98fb245d02e8547bc3jerenkrantz w = ap_getword_conf(parms->pool, &args);
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz w2 = ap_getword_conf(parms->pool, &args);
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz w3 = ap_getword_conf(parms->pool, &args);
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar if (*w == '\0' || *w2 == '\0' || *w3 == '\0' || *args != 0)
8aefbd756763807188d2e3ce336a8680e4893066wrowe return apr_pstrcat(parms->pool, cmd->name, " takes three arguments",
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
4fca95918a9c0ae93593806544b425d0adc2fcc3wrowe return cmd->AP_TAKE3(parms, mconfig, w, w2, w3);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
8aefbd756763807188d2e3ce336a8680e4893066wrowe case TAKE23:
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe w = ap_getword_conf(parms->pool, &args);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe w2 = ap_getword_conf(parms->pool, &args);
8aefbd756763807188d2e3ce336a8680e4893066wrowe w3 = *args ? ap_getword_conf(parms->pool, &args) : NULL;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe if (*w == '\0' || *w2 == '\0' || *args != 0)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return apr_pstrcat(parms->pool, cmd->name,
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar " takes two or three arguments",
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL);
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar
8aefbd756763807188d2e3ce336a8680e4893066wrowe return cmd->AP_TAKE3(parms, mconfig, w, w2, w3);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
4f9c22c4f27571d54197be9674e1fc0d528192aestriker case TAKE123:
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe w = ap_getword_conf(parms->pool, &args);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe w2 = *args ? ap_getword_conf(parms->pool, &args) : NULL;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe w3 = *args ? ap_getword_conf(parms->pool, &args) : NULL;
f08810eff40a2bddd2bc0103453c4ae775ea62bewrowe
f08810eff40a2bddd2bc0103453c4ae775ea62bewrowe if (*w == '\0' || *args != 0)
f08810eff40a2bddd2bc0103453c4ae775ea62bewrowe return apr_pstrcat(parms->pool, cmd->name,
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick " takes one, two or three arguments",
f08810eff40a2bddd2bc0103453c4ae775ea62bewrowe cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return cmd->AP_TAKE3(parms, mconfig, w, w2, w3);
8aefbd756763807188d2e3ce336a8680e4893066wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowe case TAKE13:
700b96db75e7cfadb5219978c1735b710d583763wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowe w = ap_getword_conf(parms->pool, &args);
700b96db75e7cfadb5219978c1735b710d583763wrowe w2 = *args ? ap_getword_conf(parms->pool, &args) : NULL;
700b96db75e7cfadb5219978c1735b710d583763wrowe w3 = *args ? ap_getword_conf(parms->pool, &args) : NULL;
700b96db75e7cfadb5219978c1735b710d583763wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe if (*w == '\0' || (w2 && *w2 && !w3) || *args != 0)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return apr_pstrcat(parms->pool, cmd->name,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe " takes one or three arguments",
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return cmd->AP_TAKE3(parms, mconfig, w, w2, w3);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowe case ITERATE:
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
4f9c22c4f27571d54197be9674e1fc0d528192aestriker while (*(w = ap_getword_conf(parms->pool, &args)) != '\0')
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe {
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe if ((errmsg = cmd->AP_TAKE1(parms, mconfig, w)))
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return errmsg;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe }
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return NULL;
8aefbd756763807188d2e3ce336a8680e4893066wrowe
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar case ITERATE2:
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe w = ap_getword_conf(parms->pool, &args);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar if (*w == '\0' || *args == 0)
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar return apr_pstrcat(parms->pool, cmd->name,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe " requires at least two arguments",
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe while (*(w2 = ap_getword_conf(parms->pool, &args)) != '\0')
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe {
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe if ((errmsg = cmd->AP_TAKE2(parms, mconfig, w, w2)))
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return errmsg;
8aefbd756763807188d2e3ce336a8680e4893066wrowe }
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return NULL;
8aefbd756763807188d2e3ce336a8680e4893066wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowe case FLAG:
700b96db75e7cfadb5219978c1735b710d583763wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe w = ap_getword_conf(parms->pool, &args);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowe if (*w == '\0' || (strcasecmp(w, "on") && strcasecmp(w, "off")))
700b96db75e7cfadb5219978c1735b710d583763wrowe return apr_pstrcat(parms->pool, cmd->name, " must be On or Off",
700b96db75e7cfadb5219978c1735b710d583763wrowe NULL);
700b96db75e7cfadb5219978c1735b710d583763wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowe return cmd->AP_FLAG(parms, mconfig, strcasecmp(w, "off") != 0);
700b96db75e7cfadb5219978c1735b710d583763wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowe default:
700b96db75e7cfadb5219978c1735b710d583763wrowe
103a93c625bcde1a6a7a5155b64dcda36f612180pquerna return apr_pstrcat(parms->pool, cmd->name,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe " is improperly configured internally (server bug)",
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe NULL);
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar }
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe}
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar
e4a3f3c2f080cac75a15a6454cca429b8161c050wroweAP_CORE_DECLARE(const command_rec *) ap_find_command(const char *name, const command_rec *cmds)
700b96db75e7cfadb5219978c1735b710d583763wrowe{
700b96db75e7cfadb5219978c1735b710d583763wrowe while (cmds->name)
700b96db75e7cfadb5219978c1735b710d583763wrowe if (!strcasecmp(name, cmds->name))
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return cmds;
700b96db75e7cfadb5219978c1735b710d583763wrowe else
700b96db75e7cfadb5219978c1735b710d583763wrowe ++cmds;
700b96db75e7cfadb5219978c1735b710d583763wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowe return NULL;
700b96db75e7cfadb5219978c1735b710d583763wrowe}
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
700b96db75e7cfadb5219978c1735b710d583763wroweAP_CORE_DECLARE(const command_rec *) ap_find_command_in_modules(const char *cmd_name, module **mod)
700b96db75e7cfadb5219978c1735b710d583763wrowe{
700b96db75e7cfadb5219978c1735b710d583763wrowe const command_rec *cmdp;
700b96db75e7cfadb5219978c1735b710d583763wrowe module *modp;
700b96db75e7cfadb5219978c1735b710d583763wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowe for (modp = *mod; modp; modp = modp->next)
700b96db75e7cfadb5219978c1735b710d583763wrowe if (modp->cmds && (cmdp = ap_find_command(cmd_name, modp->cmds))) {
700b96db75e7cfadb5219978c1735b710d583763wrowe *mod = modp;
700b96db75e7cfadb5219978c1735b710d583763wrowe return cmdp;
700b96db75e7cfadb5219978c1735b710d583763wrowe }
700b96db75e7cfadb5219978c1735b710d583763wrowe
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar return NULL;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe}
700b96db75e7cfadb5219978c1735b710d583763wrowe
700b96db75e7cfadb5219978c1735b710d583763wroweAP_CORE_DECLARE(void *) ap_set_config_vectors(cmd_parms *parms, void *config, module *mod)
700b96db75e7cfadb5219978c1735b710d583763wrowe{
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe void *mconfig = ap_get_module_config(config, mod);
700b96db75e7cfadb5219978c1735b710d583763wrowe void *sconfig = ap_get_module_config(parms->server->module_config, mod);
700b96db75e7cfadb5219978c1735b710d583763wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe if (!mconfig && mod->create_dir_config) {
700b96db75e7cfadb5219978c1735b710d583763wrowe mconfig = (*mod->create_dir_config) (parms->pool, parms->path);
700b96db75e7cfadb5219978c1735b710d583763wrowe ap_set_module_config(config, mod, mconfig);
700b96db75e7cfadb5219978c1735b710d583763wrowe }
700b96db75e7cfadb5219978c1735b710d583763wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowe if (!sconfig && mod->create_server_config) {
700b96db75e7cfadb5219978c1735b710d583763wrowe sconfig = (*mod->create_server_config) (parms->pool, parms->server);
700b96db75e7cfadb5219978c1735b710d583763wrowe ap_set_module_config(parms->server->module_config, mod, sconfig);
700b96db75e7cfadb5219978c1735b710d583763wrowe }
700b96db75e7cfadb5219978c1735b710d583763wrowe return mconfig;
700b96db75e7cfadb5219978c1735b710d583763wrowe}
700b96db75e7cfadb5219978c1735b710d583763wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowestatic const char *execute_now(char *cmd_line, const char *args, cmd_parms *parms,
700b96db75e7cfadb5219978c1735b710d583763wrowe apr_pool_t *p, apr_pool_t *ptemp,
700b96db75e7cfadb5219978c1735b710d583763wrowe ap_directive_t **sub_tree, ap_directive_t *parent);
700b96db75e7cfadb5219978c1735b710d583763wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowestatic const char * ap_build_config_sub(apr_pool_t *p, apr_pool_t *temp_pool,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe const char *l, cmd_parms *parms,
8aefbd756763807188d2e3ce336a8680e4893066wrowe ap_directive_t **current,
2520f59894a3e07fefa881ef68aaded763a8d447ben ap_directive_t **curr_parent,
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz ap_directive_t **conftree)
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar{
8aefbd756763807188d2e3ce336a8680e4893066wrowe const char *args;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe char *cmd_name;
8aefbd756763807188d2e3ce336a8680e4893066wrowe ap_directive_t *newdir;
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar module *mod = top_module;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe const command_rec *cmd;
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar
8aefbd756763807188d2e3ce336a8680e4893066wrowe if (*l == '#' || *l == '\0')
4f9c22c4f27571d54197be9674e1fc0d528192aestriker return NULL;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe#if RESOLVE_ENV_PER_TOKEN
8aefbd756763807188d2e3ce336a8680e4893066wrowe args = l;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker#else
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz args = ap_resolve_env(temp_pool, l);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe#endif
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe cmd_name = ap_getword_conf(p, &args);
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz if (*cmd_name == '\0') {
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe /* Note: this branch should not occur. An empty line should have
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz * triggered the exit further above.
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz */
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return NULL;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe }
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe newdir = apr_pcalloc(p, sizeof(ap_directive_t));
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz newdir->filename = parms->config_file->name;
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz newdir->line_num = parms->config_file->line_number;
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz newdir->directive = cmd_name;
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz newdir->args = apr_pstrdup(p, args);
8aefbd756763807188d2e3ce336a8680e4893066wrowe
4f9c22c4f27571d54197be9674e1fc0d528192aestriker if ((cmd = ap_find_command_in_modules(cmd_name, &mod)) != NULL) {
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe if (cmd->req_override & EXEC_ON_READ) {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker const char *retval;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe ap_directive_t *sub_tree = NULL;
ecde48c75338ff5712f2036711f813c6dedca28ewrowe
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar parms->err_directive = newdir;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe retval = execute_now(cmd_name, args, parms, p, temp_pool,
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar &sub_tree, *curr_parent);
8aefbd756763807188d2e3ce336a8680e4893066wrowe if (*current) {
cf6ef072483172309861d06e85b1aeff4573c060wrowe (*current)->next = sub_tree;
cf6ef072483172309861d06e85b1aeff4573c060wrowe }
cf6ef072483172309861d06e85b1aeff4573c060wrowe else {
cf6ef072483172309861d06e85b1aeff4573c060wrowe (*current) = sub_tree;
cf6ef072483172309861d06e85b1aeff4573c060wrowe if (*curr_parent) {
cf6ef072483172309861d06e85b1aeff4573c060wrowe (*curr_parent)->first_child = (*current);
cf6ef072483172309861d06e85b1aeff4573c060wrowe }
4f9c22c4f27571d54197be9674e1fc0d528192aestriker if (*current) {
cf6ef072483172309861d06e85b1aeff4573c060wrowe (*current)->parent = (*curr_parent);
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe }
cf6ef072483172309861d06e85b1aeff4573c060wrowe }
700b96db75e7cfadb5219978c1735b710d583763wrowe if (*current) {
69adb3d949e3dd17c0492a01fc2cf298832c7eefwrowe if (!*conftree) {
69adb3d949e3dd17c0492a01fc2cf298832c7eefwrowe /* Before walking *current to the end of the list,
cf6ef072483172309861d06e85b1aeff4573c060wrowe * set the head to *current.
cf6ef072483172309861d06e85b1aeff4573c060wrowe */
cf6ef072483172309861d06e85b1aeff4573c060wrowe *conftree = *current;
cf6ef072483172309861d06e85b1aeff4573c060wrowe }
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe while ((*current)->next != NULL) {
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick (*current) = (*current)->next;
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick (*current)->parent = (*curr_parent);
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick }
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick }
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick return retval;
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick }
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe }
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick if (cmd_name[0] == '<') {
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick if (cmd_name[1] != '/') {
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe (*current) = ap_add_node(curr_parent, *current, newdir, 1);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe }
c2cf53a40a9814eb91db2cdf820f97d943f21628coar else if (*curr_parent == NULL) {
c2cf53a40a9814eb91db2cdf820f97d943f21628coar parms->err_directive = newdir;
8aefbd756763807188d2e3ce336a8680e4893066wrowe return apr_pstrcat(p, cmd_name,
cf6ef072483172309861d06e85b1aeff4573c060wrowe " without matching <", cmd_name + 2,
8aefbd756763807188d2e3ce336a8680e4893066wrowe " section", NULL);
8aefbd756763807188d2e3ce336a8680e4893066wrowe }
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe else {
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe char *bracket = cmd_name + strlen(cmd_name) - 1;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
8aefbd756763807188d2e3ce336a8680e4893066wrowe if (*bracket != '>') {
8aefbd756763807188d2e3ce336a8680e4893066wrowe return apr_pstrcat(p, cmd_name,
4f9c22c4f27571d54197be9674e1fc0d528192aestriker "> directive missing closing '>'", NULL);
cf6ef072483172309861d06e85b1aeff4573c060wrowe }
4f9c22c4f27571d54197be9674e1fc0d528192aestriker *bracket = '\0';
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe if (strcasecmp(cmd_name + 2,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe (*curr_parent)->directive + 1) != 0) {
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return apr_pstrcat(p, "Expected </",
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe (*curr_parent)->directive + 1, "> but saw ",
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe cmd_name, ">", NULL);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe }
69adb3d949e3dd17c0492a01fc2cf298832c7eefwrowe *bracket = '>';
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe /* done with this section; move up a level */
4f9c22c4f27571d54197be9674e1fc0d528192aestriker *current = *curr_parent;
cf6ef072483172309861d06e85b1aeff4573c060wrowe *curr_parent = (*current)->parent;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe }
cadddb2c31d24d48f4017db4df0a29687432326cwrowe }
cadddb2c31d24d48f4017db4df0a29687432326cwrowe else {
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe *current = ap_add_node(curr_parent, *current, newdir, 0);
cf6ef072483172309861d06e85b1aeff4573c060wrowe }
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return NULL;
8aefbd756763807188d2e3ce336a8680e4893066wrowe}
cf6ef072483172309861d06e85b1aeff4573c060wrowe
cf6ef072483172309861d06e85b1aeff4573c060wroweconst char *ap_build_cont_config(apr_pool_t *p, apr_pool_t *temp_pool,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe cmd_parms *parms,
4f9c22c4f27571d54197be9674e1fc0d528192aestriker ap_directive_t **current,
700b96db75e7cfadb5219978c1735b710d583763wrowe ap_directive_t **curr_parent,
2d399cd7535887fceaa9f8f116eb98ce68ddd602trawick char *orig_directive)
71fe373d064756fb261876443806ece033ee3309slive{
71fe373d064756fb261876443806ece033ee3309slive char l[MAX_STRING_LEN];
c2cf53a40a9814eb91db2cdf820f97d943f21628coar char *bracket;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe const char *retval;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe ap_directive_t *sub_tree = NULL;
ecde48c75338ff5712f2036711f813c6dedca28ewrowe
8aefbd756763807188d2e3ce336a8680e4893066wrowe bracket = apr_pstrcat(p, orig_directive + 1, ">", NULL);
ecde48c75338ff5712f2036711f813c6dedca28ewrowe while (!(ap_cfg_getline(l, MAX_STRING_LEN, parms->config_file))) {
ecde48c75338ff5712f2036711f813c6dedca28ewrowe if (!memcmp(l, "</", 2) &&
ecde48c75338ff5712f2036711f813c6dedca28ewrowe (strcasecmp(l + 2, bracket) == 0) &&
ecde48c75338ff5712f2036711f813c6dedca28ewrowe (*curr_parent == NULL)) {
ecde48c75338ff5712f2036711f813c6dedca28ewrowe break;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe }
ecde48c75338ff5712f2036711f813c6dedca28ewrowe retval = ap_build_config_sub(p, temp_pool, l, parms, current,
ecde48c75338ff5712f2036711f813c6dedca28ewrowe curr_parent, &sub_tree);
ecde48c75338ff5712f2036711f813c6dedca28ewrowe if (retval != NULL)
ecde48c75338ff5712f2036711f813c6dedca28ewrowe return retval;
ecde48c75338ff5712f2036711f813c6dedca28ewrowe if (sub_tree == NULL && curr_parent != NULL) {
ecde48c75338ff5712f2036711f813c6dedca28ewrowe sub_tree = *curr_parent;
ecde48c75338ff5712f2036711f813c6dedca28ewrowe }
ecde48c75338ff5712f2036711f813c6dedca28ewrowe if (sub_tree == NULL && current != NULL) {
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe sub_tree = *current;
8aefbd756763807188d2e3ce336a8680e4893066wrowe }
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe }
cf6ef072483172309861d06e85b1aeff4573c060wrowe *current = sub_tree;
cf6ef072483172309861d06e85b1aeff4573c060wrowe return NULL;
cf6ef072483172309861d06e85b1aeff4573c060wrowe}
cf6ef072483172309861d06e85b1aeff4573c060wrowe
cf6ef072483172309861d06e85b1aeff4573c060wrowestatic const char *ap_walk_config_sub(const ap_directive_t *current,
69adb3d949e3dd17c0492a01fc2cf298832c7eefwrowe cmd_parms *parms, void *config)
cf6ef072483172309861d06e85b1aeff4573c060wrowe{
cf6ef072483172309861d06e85b1aeff4573c060wrowe module *mod = top_module;
cf6ef072483172309861d06e85b1aeff4573c060wrowe
cf6ef072483172309861d06e85b1aeff4573c060wrowe while (1) {
cf6ef072483172309861d06e85b1aeff4573c060wrowe const command_rec *cmd;
cf6ef072483172309861d06e85b1aeff4573c060wrowe
cf6ef072483172309861d06e85b1aeff4573c060wrowe if (!(cmd = ap_find_command_in_modules(current->directive, &mod))) {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker parms->err_directive = current;
cf6ef072483172309861d06e85b1aeff4573c060wrowe return apr_pstrcat(parms->pool, "Invalid command '",
cf6ef072483172309861d06e85b1aeff4573c060wrowe current->directive,
cf6ef072483172309861d06e85b1aeff4573c060wrowe "', perhaps mis-spelled or defined by a module "
cf6ef072483172309861d06e85b1aeff4573c060wrowe "not included in the server configuration",
cf6ef072483172309861d06e85b1aeff4573c060wrowe NULL);
cf6ef072483172309861d06e85b1aeff4573c060wrowe }
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe else {
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe void *mconfig = ap_set_config_vectors(parms,config, mod);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe const char *retval;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe retval = invoke_cmd(cmd, parms, mconfig, current->args);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe if (retval == NULL) {
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return NULL;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker }
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe if (strcmp(retval, DECLINE_CMD) != 0) {
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe /* If the directive in error has already been set, don't
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar * replace it. Otherwise, an error inside a container
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe * will be reported as occuring on the first line of the
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar * container.
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe */
ef5650b61a8e35f3cc93ec07e73efc17ea329894jorton if (!parms->err_directive) {
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe parms->err_directive = current;
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar }
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return retval;
700b96db75e7cfadb5219978c1735b710d583763wrowe }
700b96db75e7cfadb5219978c1735b710d583763wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowe mod = mod->next; /* Next time around, skip this one */
700b96db75e7cfadb5219978c1735b710d583763wrowe }
700b96db75e7cfadb5219978c1735b710d583763wrowe }
700b96db75e7cfadb5219978c1735b710d583763wrowe /* NOTREACHED */
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe}
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wroweAP_DECLARE(const char *) ap_walk_config(ap_directive_t *current,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe cmd_parms *parms, void *config)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe{
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe void *oldconfig = parms->context;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
700b96db75e7cfadb5219978c1735b710d583763wrowe parms->context = config;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
4f9c22c4f27571d54197be9674e1fc0d528192aestriker /* scan through all directives, executing each one */
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe for (; current != NULL; current = current->next) {
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe const char *errmsg;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe parms->directive = current;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe /* actually parse the command and execute the correct function */
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe errmsg = ap_walk_config_sub(current, parms, config);
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar if (errmsg != NULL) {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker /* restore the context (just in case) */
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe parms->context = oldconfig;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return errmsg;
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar }
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar }
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar parms->context = oldconfig;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return NULL;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe}
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe
8aefbd756763807188d2e3ce336a8680e4893066wroweAP_DECLARE(const char *) ap_build_config(cmd_parms *parms,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe apr_pool_t *p, apr_pool_t *temp_pool,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe ap_directive_t **conftree)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe{
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe ap_directive_t *current = *conftree;
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar ap_directive_t *curr_parent = NULL;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe char l[MAX_STRING_LEN];
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar const char *errmsg;
8aefbd756763807188d2e3ce336a8680e4893066wrowe
8aefbd756763807188d2e3ce336a8680e4893066wrowe if (current != NULL) {
c2cf53a40a9814eb91db2cdf820f97d943f21628coar while (current->next) {
c2cf53a40a9814eb91db2cdf820f97d943f21628coar current = current->next;
c2cf53a40a9814eb91db2cdf820f97d943f21628coar }
c2cf53a40a9814eb91db2cdf820f97d943f21628coar }
0ec08ecdcb42129d147888bda504787b164da39cerikabele
8aefbd756763807188d2e3ce336a8680e4893066wrowe while (!(ap_cfg_getline(l, MAX_STRING_LEN, parms->config_file))) {
8aefbd756763807188d2e3ce336a8680e4893066wrowe
8aefbd756763807188d2e3ce336a8680e4893066wrowe errmsg = ap_build_config_sub(p, temp_pool, l, parms,
8aefbd756763807188d2e3ce336a8680e4893066wrowe &current, &curr_parent, conftree);
8aefbd756763807188d2e3ce336a8680e4893066wrowe if (errmsg != NULL)
8aefbd756763807188d2e3ce336a8680e4893066wrowe return errmsg;
5bb29f57ae0184d2b3c1cdf35132f8ceb011f882wrowe
8aefbd756763807188d2e3ce336a8680e4893066wrowe if (*conftree == NULL && curr_parent != NULL) {
8aefbd756763807188d2e3ce336a8680e4893066wrowe *conftree = curr_parent;
8aefbd756763807188d2e3ce336a8680e4893066wrowe }
c2cf53a40a9814eb91db2cdf820f97d943f21628coar if (*conftree == NULL && current != NULL) {
c2cf53a40a9814eb91db2cdf820f97d943f21628coar *conftree = current;
2d399cd7535887fceaa9f8f116eb98ce68ddd602trawick }
c2cf53a40a9814eb91db2cdf820f97d943f21628coar }
8aefbd756763807188d2e3ce336a8680e4893066wrowe
8aefbd756763807188d2e3ce336a8680e4893066wrowe if (curr_parent != NULL) {
8aefbd756763807188d2e3ce336a8680e4893066wrowe errmsg = "";
8aefbd756763807188d2e3ce336a8680e4893066wrowe while (curr_parent != NULL) {
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe errmsg = apr_psprintf(p, "%s%s%s:%u: %s> was not closed.",
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe errmsg,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe *errmsg == '\0' ? "" : APR_EOL_STR,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe curr_parent->filename,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe curr_parent->line_num,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe curr_parent->directive);
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar curr_parent = curr_parent->parent;
0540a0b469147b52e858587270dba31c2aaa9e09wrowe }
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar return errmsg;
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar }
0540a0b469147b52e858587270dba31c2aaa9e09wrowe
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar return NULL;
0540a0b469147b52e858587270dba31c2aaa9e09wrowe}
0540a0b469147b52e858587270dba31c2aaa9e09wrowe
a9a4544168a37b43bd180b3703ccee995f27a80awrowe/*
0540a0b469147b52e858587270dba31c2aaa9e09wrowe * Generic command functions...
0540a0b469147b52e858587270dba31c2aaa9e09wrowe */
0540a0b469147b52e858587270dba31c2aaa9e09wrowe
dc8692c6c0ca616a09aa12dad005f2ef23baa1a0wroweAP_DECLARE_NONSTD(const char *) ap_set_string_slot(cmd_parms *cmd,
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar void *struct_ptr,
0540a0b469147b52e858587270dba31c2aaa9e09wrowe const char *arg)
0540a0b469147b52e858587270dba31c2aaa9e09wrowe{
0540a0b469147b52e858587270dba31c2aaa9e09wrowe /* This one's pretty generic... */
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar
0540a0b469147b52e858587270dba31c2aaa9e09wrowe int offset = (int) (long) cmd->info;
dc8692c6c0ca616a09aa12dad005f2ef23baa1a0wrowe *(const char **) ((char *)struct_ptr + offset) = arg;
0540a0b469147b52e858587270dba31c2aaa9e09wrowe return NULL;
8aefbd756763807188d2e3ce336a8680e4893066wrowe}
8aefbd756763807188d2e3ce336a8680e4893066wrowe
0540a0b469147b52e858587270dba31c2aaa9e09wroweAP_DECLARE_NONSTD(const char *) ap_set_string_slot_lower(cmd_parms *cmd,
a2a0abd88b19e042a3eb2a9fa1702c25ad51303dwrowe void *struct_ptr,
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb const char *arg_)
948096a99010fccf648814fecf38f75c689172d7wrowe{
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb /* This one's pretty generic... */
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb char *arg=apr_pstrdup(cmd->pool,arg_);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
0540a0b469147b52e858587270dba31c2aaa9e09wrowe int offset = (int) (long) cmd->info;
948096a99010fccf648814fecf38f75c689172d7wrowe ap_str_tolower(arg);
948096a99010fccf648814fecf38f75c689172d7wrowe *(char **) ((char *)struct_ptr + offset) = arg;
948096a99010fccf648814fecf38f75c689172d7wrowe return NULL;
948096a99010fccf648814fecf38f75c689172d7wrowe}
dc8692c6c0ca616a09aa12dad005f2ef23baa1a0wrowe
dc8692c6c0ca616a09aa12dad005f2ef23baa1a0wroweAP_DECLARE_NONSTD(const char *) ap_set_flag_slot(cmd_parms *cmd,
053497224246c4dbef9af594cacf5c00ed271e6cwrowe void *struct_ptr_v, int arg)
0540a0b469147b52e858587270dba31c2aaa9e09wrowe{
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz /* This one's pretty generic too... */
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb int offset = (int) (long) cmd->info;
42da244268b11ec661b528510f80a18b73c51727brianp char *struct_ptr = (char *)struct_ptr_v;
42da244268b11ec661b528510f80a18b73c51727brianp *(int *) (struct_ptr + offset) = arg ? 1 : 0;
948096a99010fccf648814fecf38f75c689172d7wrowe return NULL;
948096a99010fccf648814fecf38f75c689172d7wrowe}
948096a99010fccf648814fecf38f75c689172d7wrowe
948096a99010fccf648814fecf38f75c689172d7wroweAP_DECLARE_NONSTD(const char *) ap_set_file_slot(cmd_parms *cmd, void *struct_ptr,
948096a99010fccf648814fecf38f75c689172d7wrowe const char *arg)
948096a99010fccf648814fecf38f75c689172d7wrowe{
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz /* Prepend server_root to relative arg.
948096a99010fccf648814fecf38f75c689172d7wrowe This allows .htaccess to be independent of server_root,
948096a99010fccf648814fecf38f75c689172d7wrowe so the server can be moved or mirrored with less pain. */
948096a99010fccf648814fecf38f75c689172d7wrowe char *p;
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz int offset = (int) (long) cmd->info;
948096a99010fccf648814fecf38f75c689172d7wrowe#ifndef OS2
948096a99010fccf648814fecf38f75c689172d7wrowe arg = ap_os_canonical_filename(cmd->pool, arg);
053497224246c4dbef9af594cacf5c00ed271e6cwrowe#endif
948096a99010fccf648814fecf38f75c689172d7wrowe if (ap_os_is_path_absolute(arg))
948096a99010fccf648814fecf38f75c689172d7wrowe p = apr_pstrdup(cmd->pool, arg);
948096a99010fccf648814fecf38f75c689172d7wrowe else
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb p = ap_make_full_path(cmd->pool, ap_server_root, arg);
c2cf53a40a9814eb91db2cdf820f97d943f21628coar *(char **) ((char*)struct_ptr + offset) = p;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker return NULL;
c2cf53a40a9814eb91db2cdf820f97d943f21628coar}
948096a99010fccf648814fecf38f75c689172d7wrowe
4f9c22c4f27571d54197be9674e1fc0d528192aestriker/*****************************************************************
948096a99010fccf648814fecf38f75c689172d7wrowe *
948096a99010fccf648814fecf38f75c689172d7wrowe * Reading whole config files...
053497224246c4dbef9af594cacf5c00ed271e6cwrowe */
a9a4544168a37b43bd180b3703ccee995f27a80awrowe
948096a99010fccf648814fecf38f75c689172d7wrowestatic cmd_parms default_parms =
a9a4544168a37b43bd180b3703ccee995f27a80awrowe{NULL, 0, -1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
a9a4544168a37b43bd180b3703ccee995f27a80awroweAP_DECLARE(const char *) ap_server_root_relative(apr_pool_t *p, const char *file)
a9a4544168a37b43bd180b3703ccee995f27a80awrowe{
a9a4544168a37b43bd180b3703ccee995f27a80awrowe#ifndef OS2
a9a4544168a37b43bd180b3703ccee995f27a80awrowe file = ap_os_canonical_filename(p, file);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker#endif
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar if(ap_os_is_path_absolute(file))
948096a99010fccf648814fecf38f75c689172d7wrowe return file;
948096a99010fccf648814fecf38f75c689172d7wrowe return ap_make_full_path(p, ap_server_root, file);
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar}
948096a99010fccf648814fecf38f75c689172d7wrowe
948096a99010fccf648814fecf38f75c689172d7wroweAP_DECLARE(const char *) ap_soak_end_container(cmd_parms *cmd, char *directive)
4f9c22c4f27571d54197be9674e1fc0d528192aestriker{
948096a99010fccf648814fecf38f75c689172d7wrowe char l[MAX_STRING_LEN];
948096a99010fccf648814fecf38f75c689172d7wrowe const char *args;
aecb17a45c6d3ee4729ed5f68dc4270f211ee7a8fielding char *cmd_name;
948096a99010fccf648814fecf38f75c689172d7wrowe
aa047239dedf0d26e8efecfade32e7337f35df19wrowe while(!(ap_cfg_getline(l, MAX_STRING_LEN, cmd->config_file))) {
948096a99010fccf648814fecf38f75c689172d7wrowe#if RESOLVE_ENV_PER_TOKEN
948096a99010fccf648814fecf38f75c689172d7wrowe args = l;
948096a99010fccf648814fecf38f75c689172d7wrowe#else
948096a99010fccf648814fecf38f75c689172d7wrowe args = ap_resolve_env(cmd->temp_pool, l);
948096a99010fccf648814fecf38f75c689172d7wrowe#endif
053497224246c4dbef9af594cacf5c00ed271e6cwrowe cmd_name = ap_getword_conf(cmd->pool, &args);
0540a0b469147b52e858587270dba31c2aaa9e09wrowe if (cmd_name[0] == '<') {
053497224246c4dbef9af594cacf5c00ed271e6cwrowe if (cmd_name[1] == '/') {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker cmd_name[strlen(cmd_name) - 1] = '\0';
0540a0b469147b52e858587270dba31c2aaa9e09wrowe if (strcasecmp(cmd_name + 2, directive + 1) != 0) {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker return apr_pstrcat(cmd->pool, "Expected </",
aa047239dedf0d26e8efecfade32e7337f35df19wrowe directive + 1, "> but saw ",
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz cmd_name, ">", NULL);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb }
053497224246c4dbef9af594cacf5c00ed271e6cwrowe break;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker }
053497224246c4dbef9af594cacf5c00ed271e6cwrowe else {
053497224246c4dbef9af594cacf5c00ed271e6cwrowe ap_soak_end_container(cmd, cmd_name);
053497224246c4dbef9af594cacf5c00ed271e6cwrowe }
4f9c22c4f27571d54197be9674e1fc0d528192aestriker }
c2cf53a40a9814eb91db2cdf820f97d943f21628coar }
c2cf53a40a9814eb91db2cdf820f97d943f21628coar return NULL;
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick}
c2cf53a40a9814eb91db2cdf820f97d943f21628coar
4f9c22c4f27571d54197be9674e1fc0d528192aestrikerstatic const char *execute_now(char *cmd_line, const char *args, cmd_parms *parms,
4f9c22c4f27571d54197be9674e1fc0d528192aestriker apr_pool_t *p, apr_pool_t *ptemp,
4f9c22c4f27571d54197be9674e1fc0d528192aestriker ap_directive_t **sub_tree, ap_directive_t *parent)
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz{
053497224246c4dbef9af594cacf5c00ed271e6cwrowe module *mod = top_module;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb const command_rec *cmd;
948096a99010fccf648814fecf38f75c689172d7wrowe
948096a99010fccf648814fecf38f75c689172d7wrowe if (!(cmd = ap_find_command_in_modules(cmd_line, &mod))) {
948096a99010fccf648814fecf38f75c689172d7wrowe return apr_pstrcat(parms->pool, "Invalid command '",
0540a0b469147b52e858587270dba31c2aaa9e09wrowe cmd_line,
948096a99010fccf648814fecf38f75c689172d7wrowe "', perhaps mis-spelled or defined by a module "
948096a99010fccf648814fecf38f75c689172d7wrowe "not included in the server configuration",
948096a99010fccf648814fecf38f75c689172d7wrowe NULL);
948096a99010fccf648814fecf38f75c689172d7wrowe }
948096a99010fccf648814fecf38f75c689172d7wrowe else {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker return invoke_cmd(cmd, parms, sub_tree, args);
948096a99010fccf648814fecf38f75c689172d7wrowe }
948096a99010fccf648814fecf38f75c689172d7wrowe}
948096a99010fccf648814fecf38f75c689172d7wrowe
948096a99010fccf648814fecf38f75c689172d7wrowe/* This structure and the following functions are needed for the
948096a99010fccf648814fecf38f75c689172d7wrowe * table-based config file reading. They are passed to the
948096a99010fccf648814fecf38f75c689172d7wrowe * cfg_open_custom() routine.
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb */
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar
4f9c22c4f27571d54197be9674e1fc0d528192aestriker/* Structure to be passed to cfg_open_custom(): it contains an
948096a99010fccf648814fecf38f75c689172d7wrowe * index which is incremented from 0 to nelts on each call to
0540a0b469147b52e858587270dba31c2aaa9e09wrowe * cfg_getline() (which in turn calls arr_elts_getstr())
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar * and an apr_array_header_t pointer for the string array.
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar */
0540a0b469147b52e858587270dba31c2aaa9e09wrowetypedef struct {
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar apr_array_header_t *array;
696218c49632c863d18b25fa52ab63617088cb38wrowe int curr_idx;
948096a99010fccf648814fecf38f75c689172d7wrowe} arr_elts_param_t;
0540a0b469147b52e858587270dba31c2aaa9e09wrowe
948096a99010fccf648814fecf38f75c689172d7wrowe
948096a99010fccf648814fecf38f75c689172d7wrowe/* arr_elts_getstr() returns the next line from the string array. */
4f9c22c4f27571d54197be9674e1fc0d528192aestrikerstatic void *arr_elts_getstr(void *buf, size_t bufsiz, void *param)
948096a99010fccf648814fecf38f75c689172d7wrowe{
948096a99010fccf648814fecf38f75c689172d7wrowe arr_elts_param_t *arr_param = (arr_elts_param_t *) param;
053497224246c4dbef9af594cacf5c00ed271e6cwrowe
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar /* End of array reached? */
948096a99010fccf648814fecf38f75c689172d7wrowe if (++arr_param->curr_idx > arr_param->array->nelts)
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar return NULL;
053497224246c4dbef9af594cacf5c00ed271e6cwrowe
053497224246c4dbef9af594cacf5c00ed271e6cwrowe /* return the line */
a9a4544168a37b43bd180b3703ccee995f27a80awrowe apr_cpystrn(buf, ((char **) arr_param->array->elts)[arr_param->curr_idx - 1], bufsiz);
a9a4544168a37b43bd180b3703ccee995f27a80awrowe
a9a4544168a37b43bd180b3703ccee995f27a80awrowe return buf;
948096a99010fccf648814fecf38f75c689172d7wrowe}
948096a99010fccf648814fecf38f75c689172d7wrowe
053497224246c4dbef9af594cacf5c00ed271e6cwrowe
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar/* arr_elts_close(): dummy close routine (makes sure no more lines can be read) */
053497224246c4dbef9af594cacf5c00ed271e6cwrowestatic int arr_elts_close(void *param)
053497224246c4dbef9af594cacf5c00ed271e6cwrowe{
948096a99010fccf648814fecf38f75c689172d7wrowe arr_elts_param_t *arr_param = (arr_elts_param_t *) param;
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar arr_param->curr_idx = arr_param->array->nelts;
948096a99010fccf648814fecf38f75c689172d7wrowe return 0;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb}
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbstatic void process_command_config(server_rec *s, apr_array_header_t *arr,
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb ap_directive_t **conftree, apr_pool_t *p,
a2a0abd88b19e042a3eb2a9fa1702c25ad51303dwrowe apr_pool_t *ptemp)
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb{
aa047239dedf0d26e8efecfade32e7337f35df19wrowe const char *errmsg;
aa047239dedf0d26e8efecfade32e7337f35df19wrowe cmd_parms parms;
aa047239dedf0d26e8efecfade32e7337f35df19wrowe arr_elts_param_t arr_parms;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
0540a0b469147b52e858587270dba31c2aaa9e09wrowe arr_parms.curr_idx = 0;
aa047239dedf0d26e8efecfade32e7337f35df19wrowe arr_parms.array = arr;
aa047239dedf0d26e8efecfade32e7337f35df19wrowe
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb parms = default_parms;
dc8692c6c0ca616a09aa12dad005f2ef23baa1a0wrowe parms.pool = p;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker parms.temp_pool = ptemp;
dc8692c6c0ca616a09aa12dad005f2ef23baa1a0wrowe parms.server = s;
dc8692c6c0ca616a09aa12dad005f2ef23baa1a0wrowe parms.override = (RSRC_CONF | OR_ALL) & ~(OR_AUTHCFG | OR_LIMIT);
b5bd19d82874782007a2f9bcb19341a483c1270cwrowe
dc8692c6c0ca616a09aa12dad005f2ef23baa1a0wrowe parms.config_file = ap_pcfg_open_custom(p, "-c/-C directives",
dc8692c6c0ca616a09aa12dad005f2ef23baa1a0wrowe &arr_parms, NULL,
dc8692c6c0ca616a09aa12dad005f2ef23baa1a0wrowe arr_elts_getstr, arr_elts_close);
a2b181763cb35fd899feb4a436aeadaa80bf91eabrianp
aa047239dedf0d26e8efecfade32e7337f35df19wrowe errmsg = ap_build_config(&parms, p, ptemp, conftree);
aa047239dedf0d26e8efecfade32e7337f35df19wrowe if (errmsg) {
aa047239dedf0d26e8efecfade32e7337f35df19wrowe ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
aa047239dedf0d26e8efecfade32e7337f35df19wrowe "Syntax error in -C/-c directive:" APR_EOL_STR "%s",
aa047239dedf0d26e8efecfade32e7337f35df19wrowe errmsg);
0540a0b469147b52e858587270dba31c2aaa9e09wrowe exit(1);
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz }
aa047239dedf0d26e8efecfade32e7337f35df19wrowe
aa047239dedf0d26e8efecfade32e7337f35df19wrowe ap_cfg_closefile(parms.config_file);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker}
aa047239dedf0d26e8efecfade32e7337f35df19wrowe
aa047239dedf0d26e8efecfade32e7337f35df19wrowetypedef struct {
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb char *fname;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb} fnames;
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbstatic int fname_alphasort(const void *fn1, const void *fn2)
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb{
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz const fnames *f1 = fn1;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb const fnames *f2 = fn2;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
aa047239dedf0d26e8efecfade32e7337f35df19wrowe return strcmp(f1->fname,f2->fname);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker}
aa047239dedf0d26e8efecfade32e7337f35df19wrowe
aa047239dedf0d26e8efecfade32e7337f35df19wrowevoid ap_process_resource_config(server_rec *s, const char *fname,
c2cf53a40a9814eb91db2cdf820f97d943f21628coar ap_directive_t **conftree, apr_pool_t *p,
4f9c22c4f27571d54197be9674e1fc0d528192aestriker apr_pool_t *ptemp)
c2cf53a40a9814eb91db2cdf820f97d943f21628coar{
aa047239dedf0d26e8efecfade32e7337f35df19wrowe cmd_parms parms;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker apr_finfo_t finfo;
aa047239dedf0d26e8efecfade32e7337f35df19wrowe const char *errmsg;
aa047239dedf0d26e8efecfade32e7337f35df19wrowe configfile_t *cfp;
aa047239dedf0d26e8efecfade32e7337f35df19wrowe
a9a4544168a37b43bd180b3703ccee995f27a80awrowe fname = ap_server_root_relative(p, fname);
a9a4544168a37b43bd180b3703ccee995f27a80awrowe
a9a4544168a37b43bd180b3703ccee995f27a80awrowe /* don't require conf/httpd.conf if we have a -C or -c switch */
4f9c22c4f27571d54197be9674e1fc0d528192aestriker if ((ap_server_pre_read_config->nelts
a9a4544168a37b43bd180b3703ccee995f27a80awrowe || ap_server_post_read_config->nelts)
a9a4544168a37b43bd180b3703ccee995f27a80awrowe && !(strcmp(fname, ap_server_root_relative(p, SERVER_CONFIG_FILE)))) {
aa047239dedf0d26e8efecfade32e7337f35df19wrowe if (apr_stat(&finfo, fname, p) != APR_SUCCESS)
a9a4544168a37b43bd180b3703ccee995f27a80awrowe return;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker }
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar
aa047239dedf0d26e8efecfade32e7337f35df19wrowe /*
c2cf53a40a9814eb91db2cdf820f97d943f21628coar * here we want to check if the candidate file is really a
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar * directory, and most definitely NOT a symlink (to prevent
aa047239dedf0d26e8efecfade32e7337f35df19wrowe * horrible loops). If so, let's recurse and toss it back into
aa047239dedf0d26e8efecfade32e7337f35df19wrowe * the function.
4f9c22c4f27571d54197be9674e1fc0d528192aestriker */
aa047239dedf0d26e8efecfade32e7337f35df19wrowe if (ap_is_rdirectory(fname)) {
aa047239dedf0d26e8efecfade32e7337f35df19wrowe apr_dir_t *dirp;
0540a0b469147b52e858587270dba31c2aaa9e09wrowe int current;
aa047239dedf0d26e8efecfade32e7337f35df19wrowe apr_array_header_t *candidates = NULL;
aa047239dedf0d26e8efecfade32e7337f35df19wrowe fnames *fnew;
aa047239dedf0d26e8efecfade32e7337f35df19wrowe
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb /*
aa047239dedf0d26e8efecfade32e7337f35df19wrowe * first course of business is to grok all the directory
aa047239dedf0d26e8efecfade32e7337f35df19wrowe * entries here and store 'em away. Recall we need full pathnames
aa047239dedf0d26e8efecfade32e7337f35df19wrowe * for this.
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb */
0540a0b469147b52e858587270dba31c2aaa9e09wrowe fprintf(stderr, "Processing config directory: %s\n", fname);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker if (apr_dir_open(&dirp, fname, p) != APR_SUCCESS) {
0540a0b469147b52e858587270dba31c2aaa9e09wrowe perror("fopen");
0540a0b469147b52e858587270dba31c2aaa9e09wrowe fprintf(stderr, "%s: could not open config directory %s\n",
aa047239dedf0d26e8efecfade32e7337f35df19wrowe ap_server_argv0, fname);
aa047239dedf0d26e8efecfade32e7337f35df19wrowe exit(1);
c2cf53a40a9814eb91db2cdf820f97d943f21628coar }
c2cf53a40a9814eb91db2cdf820f97d943f21628coar candidates = apr_make_array(p, 1, sizeof(fnames));
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick while (apr_readdir(dirp) == APR_SUCCESS) {
c2cf53a40a9814eb91db2cdf820f97d943f21628coar const char *d_name;
aa047239dedf0d26e8efecfade32e7337f35df19wrowe apr_get_dir_filename(&d_name, dirp);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb /* strip out '.' and '..' */
aa047239dedf0d26e8efecfade32e7337f35df19wrowe if (strcmp(d_name, ".") &&
aa047239dedf0d26e8efecfade32e7337f35df19wrowe strcmp(d_name, "..")) {
aa047239dedf0d26e8efecfade32e7337f35df19wrowe fnew = (fnames *) apr_push_array(candidates);
aa047239dedf0d26e8efecfade32e7337f35df19wrowe fnew->fname = ap_make_full_path(p, fname, d_name);
0540a0b469147b52e858587270dba31c2aaa9e09wrowe }
aa047239dedf0d26e8efecfade32e7337f35df19wrowe }
aa047239dedf0d26e8efecfade32e7337f35df19wrowe apr_closedir(dirp);
aa047239dedf0d26e8efecfade32e7337f35df19wrowe if (candidates->nelts != 0) {
aa047239dedf0d26e8efecfade32e7337f35df19wrowe qsort((void *) candidates->elts, candidates->nelts,
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb sizeof(fnames), fname_alphasort);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker /*
aa047239dedf0d26e8efecfade32e7337f35df19wrowe * Now recurse these... we handle errors and subdirectories
aa047239dedf0d26e8efecfade32e7337f35df19wrowe * via the recursion, which is nice
aa047239dedf0d26e8efecfade32e7337f35df19wrowe */
aa047239dedf0d26e8efecfade32e7337f35df19wrowe for (current = 0; current < candidates->nelts; ++current) {
aa047239dedf0d26e8efecfade32e7337f35df19wrowe fnew = &((fnames *) candidates->elts)[current];
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb fprintf(stderr, " Processing config file: %s\n", fnew->fname);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb ap_process_resource_config(s, fnew->fname, conftree, p, ptemp);
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar }
4f9c22c4f27571d54197be9674e1fc0d528192aestriker }
aa047239dedf0d26e8efecfade32e7337f35df19wrowe return;
0540a0b469147b52e858587270dba31c2aaa9e09wrowe }
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar /* GCC's initialization extensions are soooo nice here... */
0540a0b469147b52e858587270dba31c2aaa9e09wrowe
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar parms = default_parms;
aa047239dedf0d26e8efecfade32e7337f35df19wrowe parms.pool = p;
aa047239dedf0d26e8efecfade32e7337f35df19wrowe parms.temp_pool = ptemp;
0540a0b469147b52e858587270dba31c2aaa9e09wrowe parms.server = s;
aa047239dedf0d26e8efecfade32e7337f35df19wrowe parms.override = (RSRC_CONF | OR_ALL) & ~(OR_AUTHCFG | OR_LIMIT);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
4f9c22c4f27571d54197be9674e1fc0d528192aestriker if (ap_pcfg_openfile(&cfp, p, fname) != APR_SUCCESS) {
aa047239dedf0d26e8efecfade32e7337f35df19wrowe ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
aa047239dedf0d26e8efecfade32e7337f35df19wrowe "%s: could not open document config file %s",
aa047239dedf0d26e8efecfade32e7337f35df19wrowe ap_server_argv0, fname);
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar exit(1);
aa047239dedf0d26e8efecfade32e7337f35df19wrowe }
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb parms.config_file = cfp;
dc8692c6c0ca616a09aa12dad005f2ef23baa1a0wrowe
a9a4544168a37b43bd180b3703ccee995f27a80awrowe errmsg = ap_build_config(&parms, p, ptemp, conftree);
a9a4544168a37b43bd180b3703ccee995f27a80awrowe
a9a4544168a37b43bd180b3703ccee995f27a80awrowe if (errmsg != NULL) {
aa047239dedf0d26e8efecfade32e7337f35df19wrowe ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
aa047239dedf0d26e8efecfade32e7337f35df19wrowe "Syntax error on line %d of %s:",
dc8692c6c0ca616a09aa12dad005f2ef23baa1a0wrowe parms.err_directive->line_num,
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar parms.err_directive->filename);
aa047239dedf0d26e8efecfade32e7337f35df19wrowe ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
aa047239dedf0d26e8efecfade32e7337f35df19wrowe "%s", errmsg);
aa047239dedf0d26e8efecfade32e7337f35df19wrowe exit(1);
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar }
aa047239dedf0d26e8efecfade32e7337f35df19wrowe
dc8692c6c0ca616a09aa12dad005f2ef23baa1a0wrowe ap_cfg_closefile(cfp);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb}
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbAP_DECLARE(void)ap_process_config_tree(server_rec *s, ap_directive_t *conftree,
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb apr_pool_t *p, apr_pool_t *ptemp)
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb{
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb const char *errmsg;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb cmd_parms parms;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb parms = default_parms;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb parms.pool = p;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb parms.temp_pool = ptemp;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb parms.server = s;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb parms.override = (RSRC_CONF | OR_ALL) & ~(OR_AUTHCFG | OR_LIMIT);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb parms.limited = -1;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb errmsg = ap_walk_config(conftree, &parms, s->lookup_defaults);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb if (errmsg) {
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb ap_log_perror(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, p,
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb "Syntax error on line %d of %s:",
4f9c22c4f27571d54197be9674e1fc0d528192aestriker parms.err_directive->line_num,
d2220a04f870f632b8cec1e6713dbb980ed5e386wrowe parms.err_directive->filename);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb ap_log_perror(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, p,
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb "%s", errmsg);
d2220a04f870f632b8cec1e6713dbb980ed5e386wrowe exit(1);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker }
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb}
6fd5761878f22fb9a2de0835807a29784bf367abtrawick
d2220a04f870f632b8cec1e6713dbb980ed5e386wroweint ap_parse_htaccess(void **result, request_rec *r, int override,
d2220a04f870f632b8cec1e6713dbb980ed5e386wrowe const char *d, const char *access_name) {
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb configfile_t *f = NULL;
e68544ae924174ca227ede8e2e722cefa00ea0d3wrowe cmd_parms parms;
e68544ae924174ca227ede8e2e722cefa00ea0d3wrowe char *filename = NULL;
e68544ae924174ca227ede8e2e722cefa00ea0d3wrowe const struct htaccess_result *cache;
e68544ae924174ca227ede8e2e722cefa00ea0d3wrowe struct htaccess_result *new;
e68544ae924174ca227ede8e2e722cefa00ea0d3wrowe void *dc = NULL;
e68544ae924174ca227ede8e2e722cefa00ea0d3wrowe apr_status_t status;
e68544ae924174ca227ede8e2e722cefa00ea0d3wrowe
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe/* firstly, search cache */
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe for (cache = r->htaccess; cache != NULL; cache = cache->next)
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe if (cache->override == override && strcmp(cache->dir, d) == 0) {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker if (cache->htaccess != NULL)
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe *result = cache->htaccess;
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe return OK;
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe }
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe
4f9c22c4f27571d54197be9674e1fc0d528192aestriker parms = default_parms;
e68544ae924174ca227ede8e2e722cefa00ea0d3wrowe parms.override = override;
e68544ae924174ca227ede8e2e722cefa00ea0d3wrowe parms.pool = r->pool;
e68544ae924174ca227ede8e2e722cefa00ea0d3wrowe parms.temp_pool = r->pool;
e68544ae924174ca227ede8e2e722cefa00ea0d3wrowe parms.server = r->server;
e68544ae924174ca227ede8e2e722cefa00ea0d3wrowe parms.path = apr_pstrdup(r->pool, d);
e68544ae924174ca227ede8e2e722cefa00ea0d3wrowe
e68544ae924174ca227ede8e2e722cefa00ea0d3wrowe /* loop through the access names and find the first one */
ebe7da316894e2b93b4a905fccd2496d0ed1bc78rbb
ebe7da316894e2b93b4a905fccd2496d0ed1bc78rbb while (access_name[0]) {
ebe7da316894e2b93b4a905fccd2496d0ed1bc78rbb filename = ap_make_full_path(r->pool, d,
ebe7da316894e2b93b4a905fccd2496d0ed1bc78rbb ap_getword_conf(r->pool, &access_name));
4f9c22c4f27571d54197be9674e1fc0d528192aestriker status = ap_pcfg_openfile(&f, r->pool, filename);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
e68544ae924174ca227ede8e2e722cefa00ea0d3wrowe if (status == APR_SUCCESS) {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker const char *errmsg;
e57e920838f31508f1418aa4c25ce55b345b2cebrbb ap_directive_t *temptree = NULL;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
e68544ae924174ca227ede8e2e722cefa00ea0d3wrowe dc = ap_create_per_dir_config(r->pool);
e68544ae924174ca227ede8e2e722cefa00ea0d3wrowe
e57e920838f31508f1418aa4c25ce55b345b2cebrbb parms.config_file = f;
e57e920838f31508f1418aa4c25ce55b345b2cebrbb errmsg = ap_build_config(&parms, r->pool, r->pool, &temptree);
e57e920838f31508f1418aa4c25ce55b345b2cebrbb if (errmsg == NULL)
e57e920838f31508f1418aa4c25ce55b345b2cebrbb errmsg = ap_walk_config(temptree, &parms, dc);
e57e920838f31508f1418aa4c25ce55b345b2cebrbb
e57e920838f31508f1418aa4c25ce55b345b2cebrbb ap_cfg_closefile(f);
e57e920838f31508f1418aa4c25ce55b345b2cebrbb
e57e920838f31508f1418aa4c25ce55b345b2cebrbb if (errmsg) {
e57e920838f31508f1418aa4c25ce55b345b2cebrbb ap_log_rerror(APLOG_MARK, APLOG_ALERT|APLOG_NOERRNO, 0, r,
e57e920838f31508f1418aa4c25ce55b345b2cebrbb "%s: %s", filename, errmsg);
e68544ae924174ca227ede8e2e722cefa00ea0d3wrowe return HTTP_INTERNAL_SERVER_ERROR;
e68544ae924174ca227ede8e2e722cefa00ea0d3wrowe }
e68544ae924174ca227ede8e2e722cefa00ea0d3wrowe *result = dc;
e68544ae924174ca227ede8e2e722cefa00ea0d3wrowe break;
e68544ae924174ca227ede8e2e722cefa00ea0d3wrowe } else {
d2220a04f870f632b8cec1e6713dbb980ed5e386wrowe if (!APR_STATUS_IS_ENOENT(status) && !APR_STATUS_IS_ENOTDIR(status)) {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker ap_log_rerror(APLOG_MARK, APLOG_CRIT, status, r,
d2220a04f870f632b8cec1e6713dbb980ed5e386wrowe "%s pcfg_openfile: unable to check htaccess file, "
d2220a04f870f632b8cec1e6713dbb980ed5e386wrowe "ensure it is readable",
d2220a04f870f632b8cec1e6713dbb980ed5e386wrowe filename);
d2220a04f870f632b8cec1e6713dbb980ed5e386wrowe apr_table_setn(r->notes, "error-notes",
d2220a04f870f632b8cec1e6713dbb980ed5e386wrowe "Server unable to read htaccess file, denying "
e68544ae924174ca227ede8e2e722cefa00ea0d3wrowe "access to be safe");
e68544ae924174ca227ede8e2e722cefa00ea0d3wrowe return HTTP_FORBIDDEN;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb }
c2cf53a40a9814eb91db2cdf820f97d943f21628coar }
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb }
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb/* cache it */
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb new = apr_palloc(r->pool, sizeof(struct htaccess_result));
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb new->dir = parms.path;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb new->override = override;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker new->htaccess = dc;
68b29bcadd6c46aecdc9fe14c93555a2238ad2aagregames/* add to head of list */
68b29bcadd6c46aecdc9fe14c93555a2238ad2aagregames new->next = r->htaccess;
68b29bcadd6c46aecdc9fe14c93555a2238ad2aagregames r->htaccess = new;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
4f9c22c4f27571d54197be9674e1fc0d528192aestriker return OK;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb}
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
4f9c22c4f27571d54197be9674e1fc0d528192aestrikerAP_CORE_DECLARE(const char *) ap_init_virtual_host(apr_pool_t *p, const char *hostname,
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb server_rec *main_server, server_rec **ps)
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb{
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb server_rec *s = (server_rec *) apr_pcalloc(p, sizeof(server_rec));
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb /* TODO: this crap belongs in http_core */
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb s->process = main_server->process;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb s->server_admin = NULL;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker s->server_hostname = NULL;
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar s->error_fname = NULL;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb s->timeout = 0;
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar s->keep_alive_timeout = 0;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker s->keep_alive = -1;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb s->keep_alive_max = -1;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker s->error_log = main_server->error_log;
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar s->loglevel = main_server->loglevel;
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar /* useful default, otherwise we get a port of 0 on redirects */
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb s->port = main_server->port;
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar s->next = NULL;
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar
4f9c22c4f27571d54197be9674e1fc0d528192aestriker s->is_virtual = 1;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb s->names = apr_make_array(p, 4, sizeof(char **));
4f9c22c4f27571d54197be9674e1fc0d528192aestriker s->wild_names = apr_make_array(p, 4, sizeof(char **));
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe s->module_config = create_empty_config(p);
b67fb549910fa0faf4cdd8aeaf9aeab51d4b6a92wrowe s->lookup_defaults = ap_create_per_dir_config(p);
e8eee56a2ea20f673e5942fb58e1426a7561c7acstas
b67fb549910fa0faf4cdd8aeaf9aeab51d4b6a92wrowe s->limit_req_line = main_server->limit_req_line;
b67fb549910fa0faf4cdd8aeaf9aeab51d4b6a92wrowe s->limit_req_fieldsize = main_server->limit_req_fieldsize;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb s->limit_req_fields = main_server->limit_req_fields;
b67fb549910fa0faf4cdd8aeaf9aeab51d4b6a92wrowe
8011ccb9e0700e5a396e2362dab1d9386206277fcolm *ps = s;
8011ccb9e0700e5a396e2362dab1d9386206277fcolm
b67fb549910fa0faf4cdd8aeaf9aeab51d4b6a92wrowe return ap_parse_vhost_addrs(p, hostname, s);
b67fb549910fa0faf4cdd8aeaf9aeab51d4b6a92wrowe}
d2220a04f870f632b8cec1e6713dbb980ed5e386wrowe
b45c1c292ff1fa635004ae81fa691f8cb3cdda85rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbAP_DECLARE(void) ap_fixup_virtual_hosts(apr_pool_t *p, server_rec *main_server)
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb{
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb server_rec *virt;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
e8eee56a2ea20f673e5942fb58e1426a7561c7acstas for (virt = main_server->next; virt; virt = virt->next) {
e8eee56a2ea20f673e5942fb58e1426a7561c7acstas merge_server_configs(p, main_server->module_config,
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar virt->module_config);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb virt->lookup_defaults =
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb ap_merge_per_dir_configs(p, main_server->lookup_defaults,
e8eee56a2ea20f673e5942fb58e1426a7561c7acstas virt->lookup_defaults);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
c880637396a01f4acfcf7e35fe423ced2d86c3b4nd if (virt->server_admin == NULL)
c880637396a01f4acfcf7e35fe423ced2d86c3b4nd virt->server_admin = main_server->server_admin;
c880637396a01f4acfcf7e35fe423ced2d86c3b4nd
a8c55845ffa7170766e410dbd799353127b628f9nd if (virt->timeout == 0)
c880637396a01f4acfcf7e35fe423ced2d86c3b4nd virt->timeout = main_server->timeout;
c880637396a01f4acfcf7e35fe423ced2d86c3b4nd
c880637396a01f4acfcf7e35fe423ced2d86c3b4nd if (virt->keep_alive_timeout == 0)
c880637396a01f4acfcf7e35fe423ced2d86c3b4nd virt->keep_alive_timeout = main_server->keep_alive_timeout;
30b4a330a5f651eb5198fa93dbb9f3d3594564c9stoddard
30b4a330a5f651eb5198fa93dbb9f3d3594564c9stoddard if (virt->keep_alive == -1)
30b4a330a5f651eb5198fa93dbb9f3d3594564c9stoddard virt->keep_alive = main_server->keep_alive;
6edf0ccf36ca2792b20058833680375b9256f2e0colm
6edf0ccf36ca2792b20058833680375b9256f2e0colm if (virt->keep_alive_max == -1)
6edf0ccf36ca2792b20058833680375b9256f2e0colm virt->keep_alive_max = main_server->keep_alive_max;
6edf0ccf36ca2792b20058833680375b9256f2e0colm
6edf0ccf36ca2792b20058833680375b9256f2e0colm /* XXX: this is really something that should be dealt with by a
6edf0ccf36ca2792b20058833680375b9256f2e0colm * post-config api phase */
30b4a330a5f651eb5198fa93dbb9f3d3594564c9stoddard ap_core_reorder_directories(p, virt);
6edf0ccf36ca2792b20058833680375b9256f2e0colm }
6edf0ccf36ca2792b20058833680375b9256f2e0colm ap_core_reorder_directories(p, main_server);
6edf0ccf36ca2792b20058833680375b9256f2e0colm}
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
6edf0ccf36ca2792b20058833680375b9256f2e0colm/*****************************************************************
30b4a330a5f651eb5198fa93dbb9f3d3594564c9stoddard *
30b4a330a5f651eb5198fa93dbb9f3d3594564c9stoddard * Getting *everything* configured...
30b4a330a5f651eb5198fa93dbb9f3d3594564c9stoddard */
30b4a330a5f651eb5198fa93dbb9f3d3594564c9stoddard
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbstatic void init_config_globals(apr_pool_t *p)
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb{
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb /* Global virtual host hash bucket pointers. Init to null. */
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb ap_init_vhost_config(p);
e8eee56a2ea20f673e5942fb58e1426a7561c7acstas}
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbstatic server_rec *init_server_config(process_rec *process, apr_pool_t *p)
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb{
e8eee56a2ea20f673e5942fb58e1426a7561c7acstas apr_status_t rv;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb server_rec *s = (server_rec *) apr_pcalloc(p, sizeof(server_rec));
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
efa1a34b0a7785fc72863eff175b0cfc1ecb0e38wrowe apr_open_stderr(&s->error_log, p);
117026201e6d8fe7d82416b8a7324830f5a87292wrowe s->process = process;
3cd826b00280881e5a2f03d8ec1f8d55802b93dewrowe s->port = 0;
117026201e6d8fe7d82416b8a7324830f5a87292wrowe s->server_admin = DEFAULT_ADMIN;
117026201e6d8fe7d82416b8a7324830f5a87292wrowe s->server_hostname = NULL;
117026201e6d8fe7d82416b8a7324830f5a87292wrowe s->error_fname = DEFAULT_ERRORLOG;
117026201e6d8fe7d82416b8a7324830f5a87292wrowe s->loglevel = DEFAULT_LOGLEVEL;
117026201e6d8fe7d82416b8a7324830f5a87292wrowe s->limit_req_line = DEFAULT_LIMIT_REQUEST_LINE;
6c24fd6cfe148639988d5b335185ffb215662801wrowe s->limit_req_fieldsize = DEFAULT_LIMIT_REQUEST_FIELDSIZE;
117026201e6d8fe7d82416b8a7324830f5a87292wrowe s->limit_req_fields = DEFAULT_LIMIT_REQUEST_FIELDS;
d2220a04f870f632b8cec1e6713dbb980ed5e386wrowe s->timeout = DEFAULT_TIMEOUT;
117026201e6d8fe7d82416b8a7324830f5a87292wrowe s->keep_alive_timeout = DEFAULT_KEEPALIVE_TIMEOUT;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker s->keep_alive_max = DEFAULT_KEEPALIVE;
cadddb2c31d24d48f4017db4df0a29687432326cwrowe s->keep_alive = 1;
117026201e6d8fe7d82416b8a7324830f5a87292wrowe s->next = NULL;
f888346b48f5e5b5e3f0a47dedb8cefd2759a4e2gregames s->addrs = apr_pcalloc(p, sizeof(server_addr_rec));
f888346b48f5e5b5e3f0a47dedb8cefd2759a4e2gregames /* NOT virtual host; don't match any real network interface */
3cd826b00280881e5a2f03d8ec1f8d55802b93dewrowe rv = apr_getaddrinfo(&s->addrs->host_addr,
4f9c22c4f27571d54197be9674e1fc0d528192aestriker NULL, APR_INET, 0, 0, p);
3cd826b00280881e5a2f03d8ec1f8d55802b93dewrowe ap_assert(rv == APR_SUCCESS); /* otherwise: bug or no storage */
3cd826b00280881e5a2f03d8ec1f8d55802b93dewrowe s->addrs->host_port = 0; /* matches any port */
3cd826b00280881e5a2f03d8ec1f8d55802b93dewrowe s->addrs->virthost = ""; /* must be non-NULL */
f888346b48f5e5b5e3f0a47dedb8cefd2759a4e2gregames s->names = s->wild_names = NULL;
f888346b48f5e5b5e3f0a47dedb8cefd2759a4e2gregames
f888346b48f5e5b5e3f0a47dedb8cefd2759a4e2gregames s->module_config = create_server_config(p, s);
f888346b48f5e5b5e3f0a47dedb8cefd2759a4e2gregames s->lookup_defaults = create_default_per_dir_config(p);
3cd826b00280881e5a2f03d8ec1f8d55802b93dewrowe
3cd826b00280881e5a2f03d8ec1f8d55802b93dewrowe return s;
3cd826b00280881e5a2f03d8ec1f8d55802b93dewrowe}
3cd826b00280881e5a2f03d8ec1f8d55802b93dewrowe
3cd826b00280881e5a2f03d8ec1f8d55802b93dewrowe
3cd826b00280881e5a2f03d8ec1f8d55802b93dewroweAP_DECLARE(server_rec*) ap_read_config(process_rec *process, apr_pool_t *ptemp,
dc3a3d949b7ef46b8385858c822267e39b665c12nd const char *confname,
f888346b48f5e5b5e3f0a47dedb8cefd2759a4e2gregames ap_directive_t **conftree)
f888346b48f5e5b5e3f0a47dedb8cefd2759a4e2gregames{
f888346b48f5e5b5e3f0a47dedb8cefd2759a4e2gregames apr_pool_t *p = process->pconf;
dc3a3d949b7ef46b8385858c822267e39b665c12nd server_rec *s = init_server_config(process, p);
dc3a3d949b7ef46b8385858c822267e39b665c12nd
dc3a3d949b7ef46b8385858c822267e39b665c12nd init_config_globals(p);
f888346b48f5e5b5e3f0a47dedb8cefd2759a4e2gregames
4f9c22c4f27571d54197be9674e1fc0d528192aestriker /* All server-wide config files now have the SAME syntax... */
cadddb2c31d24d48f4017db4df0a29687432326cwrowe
117026201e6d8fe7d82416b8a7324830f5a87292wrowe process_command_config(s, ap_server_pre_read_config, conftree,
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar p, ptemp);
e7505ba54ac56ae30e4e250f912f3dbaf92ca45fwrowe
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar ap_process_resource_config(s, confname, conftree, p, ptemp);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
cadddb2c31d24d48f4017db4df0a29687432326cwrowe process_command_config(s, ap_server_post_read_config, conftree,
4f9c22c4f27571d54197be9674e1fc0d528192aestriker p, ptemp);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
cadddb2c31d24d48f4017db4df0a29687432326cwrowe return s;
5b3abd2fecc712f08ad728114aa77137b9f67716wrowe}
85bb5b92490e4f095aae394118fc588a8f4c486fwrowe
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowevoid ap_single_module_configure(apr_pool_t *p, server_rec *s, module *m)
efa1a34b0a7785fc72863eff175b0cfc1ecb0e38wrowe{
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe if (m->create_server_config)
beda1fb2f11c52ca4612460a5d5ba47398143efbwrowe ap_set_module_config(s->module_config, m,
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick (*m->create_server_config)(p, s));
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick if (m->create_dir_config)
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick ap_set_module_config(s->lookup_defaults, m,
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick (*m->create_dir_config)(p, NULL));
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe}
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwroweAP_DECLARE(void) ap_run_rewrite_args(process_rec *process)
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe{
c2cf53a40a9814eb91db2cdf820f97d943f21628coar module *m;
c2cf53a40a9814eb91db2cdf820f97d943f21628coar
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe for (m = top_module; m; m = m->next)
c2cf53a40a9814eb91db2cdf820f97d943f21628coar if (m->rewrite_args)
117026201e6d8fe7d82416b8a7324830f5a87292wrowe (*m->rewrite_args) (process);
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar}
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawickAP_DECLARE(void) ap_post_config_hook(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s)
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick{
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar ap_run_post_config(pconf,plog,ptemp,s);
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe init_handlers(pconf);
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar}
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar
117026201e6d8fe7d82416b8a7324830f5a87292wrowevoid ap_child_init_hook(apr_pool_t *pchild, server_rec *s)
117026201e6d8fe7d82416b8a7324830f5a87292wrowe{
c2cf53a40a9814eb91db2cdf820f97d943f21628coar /* TODO: uh this seems ugly, is there a better way? */
117026201e6d8fe7d82416b8a7324830f5a87292wrowe /*ap_child_init_alloc(); PUT THIS BACK IN XXXXX */
1067418d9ed9ed9daeb3ca4f74e72db810c49833wrowe
cadddb2c31d24d48f4017db4df0a29687432326cwrowe ap_run_child_init(pchild,s);
cadddb2c31d24d48f4017db4df0a29687432326cwrowe}
cadddb2c31d24d48f4017db4df0a29687432326cwrowe
cadddb2c31d24d48f4017db4df0a29687432326cwrowe/********************************************************************
4f9c22c4f27571d54197be9674e1fc0d528192aestriker * Configuration directives are restricted in terms of where they may
c2cf53a40a9814eb91db2cdf820f97d943f21628coar * appear in the main configuration files and/or .htaccess files according
c2cf53a40a9814eb91db2cdf820f97d943f21628coar * to the bitmask req_override in the command_rec structure.
cadddb2c31d24d48f4017db4df0a29687432326cwrowe * If any of the overrides set in req_override are also allowed in the
cadddb2c31d24d48f4017db4df0a29687432326cwrowe * context in which the command is read, then the command is allowed.
cadddb2c31d24d48f4017db4df0a29687432326cwrowe * The context is determined as follows:
cadddb2c31d24d48f4017db4df0a29687432326cwrowe *
cadddb2c31d24d48f4017db4df0a29687432326cwrowe * inside *.conf --> override = (RSRC_CONF|OR_ALL)&~(OR_AUTHCFG|OR_LIMIT);
cadddb2c31d24d48f4017db4df0a29687432326cwrowe * within <Directory> or <Location> --> override = OR_ALL|ACCESS_CONF;
3cd826b00280881e5a2f03d8ec1f8d55802b93dewrowe * within .htaccess --> override = AllowOverride for current directory;
3cd826b00280881e5a2f03d8ec1f8d55802b93dewrowe *
cadddb2c31d24d48f4017db4df0a29687432326cwrowe * the result is, well, a rather confusing set of possibilities for when
3cd826b00280881e5a2f03d8ec1f8d55802b93dewrowe * a particular directive is allowed to be used. This procedure prints
3cd826b00280881e5a2f03d8ec1f8d55802b93dewrowe * in English where the given (pc) directive can be used.
3cd826b00280881e5a2f03d8ec1f8d55802b93dewrowe */
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoarstatic void show_overrides(const command_rec *pc, module *pm)
cadddb2c31d24d48f4017db4df0a29687432326cwrowe{
cadddb2c31d24d48f4017db4df0a29687432326cwrowe int n = 0;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker
3cd826b00280881e5a2f03d8ec1f8d55802b93dewrowe printf("\tAllowed in *.conf ");
3cd826b00280881e5a2f03d8ec1f8d55802b93dewrowe if ((pc->req_override & (OR_OPTIONS | OR_FILEINFO | OR_INDEXES)) ||
4f9c22c4f27571d54197be9674e1fc0d528192aestriker ((pc->req_override & RSRC_CONF) &&
4f9c22c4f27571d54197be9674e1fc0d528192aestriker ((pc->req_override & (ACCESS_CONF | OR_AUTHCFG | OR_LIMIT)))))
3cd826b00280881e5a2f03d8ec1f8d55802b93dewrowe printf("anywhere");
3cd826b00280881e5a2f03d8ec1f8d55802b93dewrowe else if (pc->req_override & RSRC_CONF)
3cd826b00280881e5a2f03d8ec1f8d55802b93dewrowe printf("only outside <Directory>, <Files> or <Location>");
3cd826b00280881e5a2f03d8ec1f8d55802b93dewrowe else
cadddb2c31d24d48f4017db4df0a29687432326cwrowe printf("only inside <Directory>, <Files> or <Location>");
c880637396a01f4acfcf7e35fe423ced2d86c3b4nd
c880637396a01f4acfcf7e35fe423ced2d86c3b4nd /* Warn if the directive is allowed inside <Directory> or .htaccess
a8c55845ffa7170766e410dbd799353127b628f9nd * but module doesn't support per-dir configuration */
c880637396a01f4acfcf7e35fe423ced2d86c3b4nd
c880637396a01f4acfcf7e35fe423ced2d86c3b4nd if ((pc->req_override & (OR_ALL | ACCESS_CONF)) && !pm->create_dir_config)
c880637396a01f4acfcf7e35fe423ced2d86c3b4nd printf(" [no per-dir config]");
c880637396a01f4acfcf7e35fe423ced2d86c3b4nd
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe if (pc->req_override & OR_ALL) {
1067418d9ed9ed9daeb3ca4f74e72db810c49833wrowe printf(" and in .htaccess\n\twhen AllowOverride");
1067418d9ed9ed9daeb3ca4f74e72db810c49833wrowe
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe if ((pc->req_override & OR_ALL) == OR_ALL)
1067418d9ed9ed9daeb3ca4f74e72db810c49833wrowe printf(" isn't None");
117026201e6d8fe7d82416b8a7324830f5a87292wrowe else {
117026201e6d8fe7d82416b8a7324830f5a87292wrowe printf(" includes ");
b67fb549910fa0faf4cdd8aeaf9aeab51d4b6a92wrowe
c2cf53a40a9814eb91db2cdf820f97d943f21628coar if (pc->req_override & OR_AUTHCFG) {
c2cf53a40a9814eb91db2cdf820f97d943f21628coar if (n++)
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb printf(" or ");
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb printf("AuthConfig");
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb }
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb if (pc->req_override & OR_LIMIT) {
5bb29f57ae0184d2b3c1cdf35132f8ceb011f882wrowe if (n++)
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb printf(" or ");
d2220a04f870f632b8cec1e6713dbb980ed5e386wrowe printf("Limit");
b45c1c292ff1fa635004ae81fa691f8cb3cdda85rbb }
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb if (pc->req_override & OR_OPTIONS) {
5bb29f57ae0184d2b3c1cdf35132f8ceb011f882wrowe if (n++)
5bb29f57ae0184d2b3c1cdf35132f8ceb011f882wrowe printf(" or ");
ecc4a080f07af3fbc1b91bbd00997ec1d592c6f9wrowe printf("Options");
5bb29f57ae0184d2b3c1cdf35132f8ceb011f882wrowe }
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar if (pc->req_override & OR_FILEINFO) {
2d2dadb81bf34e3bc9321eabcd971a738431b364wrowe if (n++)
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar printf(" or ");
4f9c22c4f27571d54197be9674e1fc0d528192aestriker printf("FileInfo");
5bb29f57ae0184d2b3c1cdf35132f8ceb011f882wrowe }
5bb29f57ae0184d2b3c1cdf35132f8ceb011f882wrowe if (pc->req_override & OR_INDEXES) {
5bb29f57ae0184d2b3c1cdf35132f8ceb011f882wrowe if (n++)
5bb29f57ae0184d2b3c1cdf35132f8ceb011f882wrowe printf(" or ");
5bb29f57ae0184d2b3c1cdf35132f8ceb011f882wrowe printf("Indexes");
4f9c22c4f27571d54197be9674e1fc0d528192aestriker }
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar }
ecc4a080f07af3fbc1b91bbd00997ec1d592c6f9wrowe }
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar printf("\n");
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb}
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb/* Show the preloaded configuration directives, the help string explaining
4f9c22c4f27571d54197be9674e1fc0d528192aestriker * the directive arguments, in what module they are handled, and in
5b3abd2fecc712f08ad728114aa77137b9f67716wrowe * what parts of the configuration they are allowed. Used for httpd -h.
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb */
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbAP_DECLARE(void) ap_show_directives()
af7e32b660b02a378e91d40987e59b28864db954jwoolley{
4f9c22c4f27571d54197be9674e1fc0d528192aestriker const command_rec *pc;
c2cf53a40a9814eb91db2cdf820f97d943f21628coar int n;
0540a0b469147b52e858587270dba31c2aaa9e09wrowe
0540a0b469147b52e858587270dba31c2aaa9e09wrowe for (n = 0; ap_loaded_modules[n]; ++n)
0540a0b469147b52e858587270dba31c2aaa9e09wrowe for (pc = ap_loaded_modules[n]->cmds; pc && pc->name; ++pc) {
c2cf53a40a9814eb91db2cdf820f97d943f21628coar printf("%s (%s)\n", pc->name, ap_loaded_modules[n]->name);
c2cf53a40a9814eb91db2cdf820f97d943f21628coar if (pc->errmsg)
0540a0b469147b52e858587270dba31c2aaa9e09wrowe printf("\t%s\n", pc->errmsg);
c2cf53a40a9814eb91db2cdf820f97d943f21628coar show_overrides(pc, ap_loaded_modules[n]);
0540a0b469147b52e858587270dba31c2aaa9e09wrowe }
0540a0b469147b52e858587270dba31c2aaa9e09wrowe}
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick/* Show the preloaded module names. Used for httpd -l. */
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawickAP_DECLARE(void) ap_show_modules()
c2cf53a40a9814eb91db2cdf820f97d943f21628coar{
0540a0b469147b52e858587270dba31c2aaa9e09wrowe int n;
c2cf53a40a9814eb91db2cdf820f97d943f21628coar
0540a0b469147b52e858587270dba31c2aaa9e09wrowe printf("Compiled in modules:\n");
7763a4beb8afca9c8f93db0cb6836124901af52awrowe for (n = 0; ap_loaded_modules[n]; ++n)
0540a0b469147b52e858587270dba31c2aaa9e09wrowe printf(" %s\n", ap_loaded_modules[n]->name);
0540a0b469147b52e858587270dba31c2aaa9e09wrowe}
c2cf53a40a9814eb91db2cdf820f97d943f21628coar
c2cf53a40a9814eb91db2cdf820f97d943f21628coar