mod_info.c revision ed4f9ec869d7fc5bd220c8d70ee58eed9b32d60a
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye/* ====================================================================
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * The Apache Software License, Version 1.1
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye *
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * Copyright (c) 2000-2001 The Apache Software Foundation. All rights
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * reserved.
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye *
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * Redistribution and use in source and binary forms, with or without
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * modification, are permitted provided that the following conditions
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * are met:
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye *
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * 1. Redistributions of source code must retain the above copyright
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * notice, this list of conditions and the following disclaimer.
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye *
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * 2. Redistributions in binary form must reproduce the above copyright
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * notice, this list of conditions and the following disclaimer in
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * the documentation and/or other materials provided with the
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * distribution.
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye *
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * 3. The end-user documentation included with the redistribution,
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * if any, must include the following acknowledgment:
fe80b749cd764b1f0f72b2f913b1fe10581911c3Knut Anders Hatlen * "This product includes software developed by the
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * Apache Software Foundation (http://www.apache.org/)."
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * Alternately, this acknowledgment may appear in the software itself,
cf1f7b5e81583dfca30972cfef322266a6928e7fKnut Anders Hatlen * if and wherever such third-party acknowledgments normally appear.
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye *
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye * 4. The names "Apache" and "Apache Software Foundation" must
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye * not be used to endorse or promote products derived from this
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Kosco * software without prior written permission. For written
7e33e87b7d6c9a61ff11d23e37c02274b1223ce1Jens Elkner * permission, please contact apache@apache.org.
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye *
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * 5. Products derived from this software may not be called "Apache",
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * nor may "Apache" appear in their name, without prior written
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * permission of the Apache Software Foundation.
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye *
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * SUCH DAMAGE.
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * ====================================================================
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye *
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * This software consists of voluntary contributions made by many
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * individuals on behalf of the Apache Software Foundation. For more
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * information on the Apache Software Foundation, please see
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * <http://www.apache.org/>.
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye *
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * Portions of this software are based upon public domain software
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * originally written at the National Center for Supercomputing Applications,
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * University of Illinois, Urbana-Champaign.
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye */
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye/*
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * Info Module. Display configuration information for the server and
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * all included modules.
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye *
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * <Location /server-info>
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * SetHandler server-info
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * </Location>
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye *
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * GET /server-info - Returns full configuration page for server and all modules
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * GET /server-info?server - Returns server configuration only
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * GET /server-info?module_name - Returns configuration for a single module
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * GET /server-info?list - Returns quick list of included modules
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye *
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * Rasmus Lerdorf <rasmus@vex.net>, May 1996
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye *
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * 05.01.96 Initial Version
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye *
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * Lou Langholtz <ldl@usi.utah.edu>, July 1997
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye *
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * 07.11.97 Addition of the AddModuleInfo directive
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye *
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * Ryan Morgan <rmorgan@covalent.net>
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye *
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * 8.11.00 Port to Apache 2.0. Read configuation from the configuration
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * tree rather than reparse the entire configuation file.
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye *
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye */
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye#define CORE_PRIVATE
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye#include "httpd.h"
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye#include "http_config.h"
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye#include "http_core.h"
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye#include "http_log.h"
0a0811923cbbd2976425db6f4c78eed811c2825bKnut Anders Hatlen#include "http_main.h"
c6963a7ea2753672325502d342e653700be550a8Lubos Kosco#include "http_protocol.h"
a07b2874263e3c5f0cd2e83441719415d53059c2Knut Anders Hatlen#include "http_request.h"
7e33e87b7d6c9a61ff11d23e37c02274b1223ce1Jens Elkner#include "util_script.h"
7e33e87b7d6c9a61ff11d23e37c02274b1223ce1Jens Elkner#include "apr_strings.h"
c7eb123c8b2081a261deff3c401fbf92ddba1b58Jorgen Austvik#include "apr_lib.h"
c7eb123c8b2081a261deff3c401fbf92ddba1b58Jorgen Austvik#define APR_WANT_STRFUNC
49f592091468eac515dde6139fbc8efa26056b0aJorgen Austvik#include "apr_want.h"
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik#include "ap_mpm.h"
5a0c5ad4116f5a4dd0dd5a0a4e6d02973cd5eef9Lubos Kosco
780cc7d1b57609ff15fb283201e93cb501ebe9e6Jorgen Austviktypedef struct {
780cc7d1b57609ff15fb283201e93cb501ebe9e6Jorgen Austvik const char *name; /* matching module name */
f754dd2bbc98a89a613ab4f76dad5534dc13e929Vladimir Kotal const char *info; /* additional info */
d3d2404f9a49bf70b124053feabe666f85ef5361Knut Anders Hatlen} info_entry;
d3d2404f9a49bf70b124053feabe666f85ef5361Knut Anders Hatlen
780cc7d1b57609ff15fb283201e93cb501ebe9e6Jorgen Austviktypedef struct {
5dd7583c971e0c2c9e99378930d83df43de56098Lubos Kosco apr_array_header_t *more_info;
780cc7d1b57609ff15fb283201e93cb501ebe9e6Jorgen Austvik} info_svr_conf;
7b9f9a1761f76744fc3772181877d5e301f122adKnut Anders Hatlen
5a0c5ad4116f5a4dd0dd5a0a4e6d02973cd5eef9Lubos Koscomodule AP_MODULE_DECLARE_DATA info_module;
0466de7c67573e1ce5e0733325c1e5383270f5d5Knut Anders Hatlen
0466de7c67573e1ce5e0733325c1e5383270f5d5Knut Anders Hatlenstatic void *create_info_config(apr_pool_t *p, server_rec *s)
0466de7c67573e1ce5e0733325c1e5383270f5d5Knut Anders Hatlen{
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye info_svr_conf *conf = (info_svr_conf *) apr_pcalloc(p, sizeof(info_svr_conf));
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye
5a0c5ad4116f5a4dd0dd5a0a4e6d02973cd5eef9Lubos Kosco conf->more_info = apr_array_make(p, 20, sizeof(info_entry));
5a0c5ad4116f5a4dd0dd5a0a4e6d02973cd5eef9Lubos Kosco return conf;
1ed6b730409d4740e941142599767d5eac7e7d92Lubos Kosco}
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvikstatic void *merge_info_config(apr_pool_t *p, void *basev, void *overridesv)
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik{
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye info_svr_conf *new = (info_svr_conf *) apr_pcalloc(p, sizeof(info_svr_conf));
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye info_svr_conf *base = (info_svr_conf *) basev;
8dc938f5c6296cffbadd8e06925dc0762dd79c5aLubos Kosco info_svr_conf *overrides = (info_svr_conf *) overridesv;
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik new->more_info = apr_array_append(p, overrides->more_info, base->more_info);
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik return new;
c7eb123c8b2081a261deff3c401fbf92ddba1b58Jorgen Austvik}
5a0c5ad4116f5a4dd0dd5a0a4e6d02973cd5eef9Lubos Kosco
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvikstatic char *mod_info_html_cmd_string(const char *string, char *buf, size_t buf_len, int close)
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik{
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik const char *s;
49f592091468eac515dde6139fbc8efa26056b0aJorgen Austvik char *t;
49f592091468eac515dde6139fbc8efa26056b0aJorgen Austvik char *end_buf;
5a0c5ad4116f5a4dd0dd5a0a4e6d02973cd5eef9Lubos Kosco
49f592091468eac515dde6139fbc8efa26056b0aJorgen Austvik s = string;
49f592091468eac515dde6139fbc8efa26056b0aJorgen Austvik t = buf;
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik /* keep space for \0 byte */
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik end_buf = buf + buf_len - 1;
5a0c5ad4116f5a4dd0dd5a0a4e6d02973cd5eef9Lubos Kosco while ((*s) && (t < end_buf)) {
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik if (*s == '<') {
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik if (close) {
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik strncpy(t, "&lt;/,", end_buf -t);
b411dcdf67df825303fcb366759169c881936ac9Vladimir Kotal t += 5;
b411dcdf67df825303fcb366759169c881936ac9Vladimir Kotal } else {
b411dcdf67df825303fcb366759169c881936ac9Vladimir Kotal strncpy(t, "&lt;", end_buf - t);
b411dcdf67df825303fcb366759169c881936ac9Vladimir Kotal t += 4;
b411dcdf67df825303fcb366759169c881936ac9Vladimir Kotal }
b411dcdf67df825303fcb366759169c881936ac9Vladimir Kotal }
b411dcdf67df825303fcb366759169c881936ac9Vladimir Kotal else if (*s == '>') {
b411dcdf67df825303fcb366759169c881936ac9Vladimir Kotal strncpy(t, "&gt;", end_buf - t);
b411dcdf67df825303fcb366759169c881936ac9Vladimir Kotal t += 4;
b411dcdf67df825303fcb366759169c881936ac9Vladimir Kotal }
b411dcdf67df825303fcb366759169c881936ac9Vladimir Kotal else if (*s == '&') {
b411dcdf67df825303fcb366759169c881936ac9Vladimir Kotal strncpy(t, "&amp;", end_buf - t);
f9fd2b96d1c5ea62664f74da0e34a04b6511a8ffLubos Kosco t += 5;
b411dcdf67df825303fcb366759169c881936ac9Vladimir Kotal }
b411dcdf67df825303fcb366759169c881936ac9Vladimir Kotal else if (*s == ' ') {
f9fd2b96d1c5ea62664f74da0e34a04b6511a8ffLubos Kosco if (close) {
b411dcdf67df825303fcb366759169c881936ac9Vladimir Kotal strncpy(t, "&gt;", end_buf -t);
b411dcdf67df825303fcb366759169c881936ac9Vladimir Kotal t += 4;
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco break;
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye } else {
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco *t++ = *s;
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco }
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco } else {
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco *t++ = *s;
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco }
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco s++;
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco }
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco /* oops, overflowed... don't overwrite */
ecc9697029dc3bde02537b914756f7c49eb7cd1eLubos Kosco if (t > end_buf) {
ecc9697029dc3bde02537b914756f7c49eb7cd1eLubos Kosco *end_buf = '\0';
45909b3ef8c6e568a87482cb890fec7b5dbb7733Lubos Kosco }
45909b3ef8c6e568a87482cb890fec7b5dbb7733Lubos Kosco else {
fcb68bae47907ba23c545e379c81c3ee6e19f778Lubos Kosco *t = '\0';
fcb68bae47907ba23c545e379c81c3ee6e19f778Lubos Kosco }
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye return (buf);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye}
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Koscostatic void mod_info_module_cmds(request_rec * r, const command_rec * cmds,
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco ap_directive_t * conftree)
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco{
a18d47eb00db31a10f19c353d32966b79113c7a7Ajay Kemparaj AjayK const command_rec *cmd;
a18d47eb00db31a10f19c353d32966b79113c7a7Ajay Kemparaj AjayK ap_directive_t *tmptree = conftree;
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco char buf[MAX_STRING_LEN];
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco char htmlstring[MAX_STRING_LEN];
fbf97ea1786d1e25add88bbfb91810170473bc9fLubos Kosco int block_start = 0;
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco int nest = 0;
fbf97ea1786d1e25add88bbfb91810170473bc9fLubos Kosco
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco while (tmptree != NULL) {
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco cmd = cmds;
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco while (cmd->name) {
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco if ((cmd->name[0] != '<') &&
e3bec3188dc818cc194cd67e6871c6d0af0d6b26Felix Annan (strcasecmp(cmd->name, tmptree->directive) == 0)) {
e3bec3188dc818cc194cd67e6871c6d0af0d6b26Felix Annan if (nest > block_start) {
d7375a57cb329e3ca4984fc3b2923b177ddff562haufelex block_start++;
d7375a57cb329e3ca4984fc3b2923b177ddff562haufelex apr_snprintf(htmlstring, sizeof(htmlstring), "%s %s",
42b608307b682f1c99a0bd0baada73cd825b6792Constantine A. Murenin tmptree->parent->directive,
42b608307b682f1c99a0bd0baada73cd825b6792Constantine A. Murenin tmptree->parent->args);
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco ap_rprintf(r, "<dd><tt>%s</tt><br>\n",
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco mod_info_html_cmd_string(htmlstring, buf,
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye sizeof(buf), 0));
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye }
9cf771c10c134cc953a502f895eaf321ec927f13Lubos Kosco if (nest == 2) {
a5cc1506d5c0704805c6733a46c7f1f8f91ae724Knut Anders Hatlen ap_rprintf(r, "<dd><tt>&nbsp;&nbsp;&nbsp;&nbsp;%s "
a5cc1506d5c0704805c6733a46c7f1f8f91ae724Knut Anders Hatlen "<i>%s</i></tt><br>\n",
a5cc1506d5c0704805c6733a46c7f1f8f91ae724Knut Anders Hatlen tmptree->directive, tmptree->args);
a5cc1506d5c0704805c6733a46c7f1f8f91ae724Knut Anders Hatlen } else if (nest == 1) {
a5cc1506d5c0704805c6733a46c7f1f8f91ae724Knut Anders Hatlen ap_rprintf(r,
9cf771c10c134cc953a502f895eaf321ec927f13Lubos Kosco "<dd><tt>&nbsp;&nbsp;%s <i>%s</i></tt><br>\n",
9cf771c10c134cc953a502f895eaf321ec927f13Lubos Kosco tmptree->directive, tmptree->args);
7b046969a1b2565787df8ae3a8126359e8cd6fafTrond Norbye } else {
7b046969a1b2565787df8ae3a8126359e8cd6fafTrond Norbye ap_rprintf(r, "<dd><tt>%s <i>%s</i></tt><br>\n",
9cf771c10c134cc953a502f895eaf321ec927f13Lubos Kosco mod_info_html_cmd_string(tmptree->directive,
9cf771c10c134cc953a502f895eaf321ec927f13Lubos Kosco buf, sizeof(buf),
7b046969a1b2565787df8ae3a8126359e8cd6fafTrond Norbye 0), tmptree->args);
7b046969a1b2565787df8ae3a8126359e8cd6fafTrond Norbye }
7b046969a1b2565787df8ae3a8126359e8cd6fafTrond Norbye }
a5cc1506d5c0704805c6733a46c7f1f8f91ae724Knut Anders Hatlen ++cmd;
9cf771c10c134cc953a502f895eaf321ec927f13Lubos Kosco }
a5cc1506d5c0704805c6733a46c7f1f8f91ae724Knut Anders Hatlen if (tmptree->first_child != NULL) {
9cf771c10c134cc953a502f895eaf321ec927f13Lubos Kosco tmptree = tmptree->first_child;
9cf771c10c134cc953a502f895eaf321ec927f13Lubos Kosco nest++;
a5cc1506d5c0704805c6733a46c7f1f8f91ae724Knut Anders Hatlen } else if (tmptree->next != NULL) {
a5cc1506d5c0704805c6733a46c7f1f8f91ae724Knut Anders Hatlen tmptree = tmptree->next;
a5cc1506d5c0704805c6733a46c7f1f8f91ae724Knut Anders Hatlen } else {
9cf771c10c134cc953a502f895eaf321ec927f13Lubos Kosco if (block_start) {
a5cc1506d5c0704805c6733a46c7f1f8f91ae724Knut Anders Hatlen apr_snprintf(htmlstring, sizeof(htmlstring), "%s %s",
a5cc1506d5c0704805c6733a46c7f1f8f91ae724Knut Anders Hatlen tmptree->parent->directive,
a5cc1506d5c0704805c6733a46c7f1f8f91ae724Knut Anders Hatlen tmptree->parent->args);
a5cc1506d5c0704805c6733a46c7f1f8f91ae724Knut Anders Hatlen ap_rprintf(r, "<dd><tt>%s</tt><br>\n",
9cf771c10c134cc953a502f895eaf321ec927f13Lubos Kosco mod_info_html_cmd_string(htmlstring, buf,
9cf771c10c134cc953a502f895eaf321ec927f13Lubos Kosco sizeof(buf), 1));
9cf771c10c134cc953a502f895eaf321ec927f13Lubos Kosco block_start--;
9cf771c10c134cc953a502f895eaf321ec927f13Lubos Kosco }
a5cc1506d5c0704805c6733a46c7f1f8f91ae724Knut Anders Hatlen if (tmptree->parent) {
a5cc1506d5c0704805c6733a46c7f1f8f91ae724Knut Anders Hatlen tmptree = tmptree->parent->next;
9cf771c10c134cc953a502f895eaf321ec927f13Lubos Kosco }
a5cc1506d5c0704805c6733a46c7f1f8f91ae724Knut Anders Hatlen else {
a5cc1506d5c0704805c6733a46c7f1f8f91ae724Knut Anders Hatlen tmptree = NULL;
a5cc1506d5c0704805c6733a46c7f1f8f91ae724Knut Anders Hatlen }
a5cc1506d5c0704805c6733a46c7f1f8f91ae724Knut Anders Hatlen nest--;
7b046969a1b2565787df8ae3a8126359e8cd6fafTrond Norbye }
7b046969a1b2565787df8ae3a8126359e8cd6fafTrond Norbye
7b046969a1b2565787df8ae3a8126359e8cd6fafTrond Norbye }
7b046969a1b2565787df8ae3a8126359e8cd6fafTrond Norbye}
7b046969a1b2565787df8ae3a8126359e8cd6fafTrond Norbye
7b046969a1b2565787df8ae3a8126359e8cd6fafTrond Norbyetypedef struct { /*XXX: should get something from apr_hooks.h instead */
7b046969a1b2565787df8ae3a8126359e8cd6fafTrond Norbye void (*pFunc)(void); /* just to get the right size */
7b046969a1b2565787df8ae3a8126359e8cd6fafTrond Norbye const char *szName;
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvik const char * const *aszPredecessors;
b411dcdf67df825303fcb366759169c881936ac9Vladimir Kotal const char * const *aszSuccessors;
81a83bbf0a20e99b5b27be2bcc34c5dbb703c898jel+opengrok int nOrder;
81a83bbf0a20e99b5b27be2bcc34c5dbb703c898jel+opengrok} hook_struct_t;
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco/*
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen * hook_get_t is a pointer to a function that takes void as an argument and
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvik * returns a pointer to an apr_array_header_t. The nasty WIN32 ifdef
d3d2404f9a49bf70b124053feabe666f85ef5361Knut Anders Hatlen * is required to account for the fact that the ap_hook* calls all use
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * STDCALL calling convention.
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Kosco */
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Koscotypedef apr_array_header_t * (
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Kosco#ifdef WIN32
f9fd2b96d1c5ea62664f74da0e34a04b6511a8ffLubos Kosco__stdcall
f9fd2b96d1c5ea62664f74da0e34a04b6511a8ffLubos Kosco#endif
f9fd2b96d1c5ea62664f74da0e34a04b6511a8ffLubos Kosco* hook_get_t)(void);
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Kosco
64b763950bf11e9357facbd2b5666631a895c085Trond Norbyetypedef struct {
9cf297d9a579835e9336d587eaee187ca0954767Knut Anders Hatlen const char *name;
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen hook_get_t get;
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen} hook_lookup_t;
9cf297d9a579835e9336d587eaee187ca0954767Knut Anders Hatlen
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlenstatic hook_lookup_t request_hooks[] = {
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen {"Post-Read Request", ap_hook_get_post_read_request},
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye {"Header Parse", ap_hook_get_header_parser},
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen {"Translate Path", ap_hook_get_translate_name},
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen {"Check Access", ap_hook_get_access_checker},
5a0c5ad4116f5a4dd0dd5a0a4e6d02973cd5eef9Lubos Kosco {"Verify User ID", ap_hook_get_check_user_id},
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen {"Verify User Access", ap_hook_get_auth_checker},
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen {"Check Type", ap_hook_get_type_checker},
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen {"Fixups", ap_hook_get_fixups},
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen {"Logging", ap_hook_get_log_transaction},
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen {NULL},
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen};
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbyestatic int module_find_hook(module *modp,
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye hook_get_t hook_get)
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye{
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye int i;
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye apr_array_header_t *hooks = hook_get();
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye hook_struct_t *elts;
81a83bbf0a20e99b5b27be2bcc34c5dbb703c898jel+opengrok
81a83bbf0a20e99b5b27be2bcc34c5dbb703c898jel+opengrok if (!hooks) {
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen return 0;
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen }
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen elts = (hook_struct_t *)hooks->elts;
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye for (i=0; i< hooks->nelts; i++) {
752fbd3cf33aada419c8258959ff5574d2d2047dTrond Norbye if (strcmp(elts[i].szName, modp->name) == 0) {
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye return 1;
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen }
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen }
7b046969a1b2565787df8ae3a8126359e8cd6fafTrond Norbye
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen return 0;
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen}
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlenstatic void module_participate(request_rec *r,
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen module *modp,
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen hook_lookup_t *lookup,
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen int *comma)
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye{
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye if (module_find_hook(modp, lookup->get)) {
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye if (*comma) {
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye ap_rputs(", ", r);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye }
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye ap_rvputs(r, "<tt>", lookup->name, "</tt>", NULL);
9cf297d9a579835e9336d587eaee187ca0954767Knut Anders Hatlen *comma = 1;
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Kosco }
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Kosco}
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Kosco
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Koscostatic void module_request_hook_participate(request_rec *r, module *modp)
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Kosco{
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Kosco int i, comma=0;
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Kosco
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Kosco ap_rputs("<dt><strong>Request Phase Participation:</strong> \n", r);
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Kosco
f9fd2b96d1c5ea62664f74da0e34a04b6511a8ffLubos Kosco for (i=0; request_hooks[i].name; i++) {
f9fd2b96d1c5ea62664f74da0e34a04b6511a8ffLubos Kosco module_participate(r, modp, &request_hooks[i], &comma);
f9fd2b96d1c5ea62664f74da0e34a04b6511a8ffLubos Kosco }
f9fd2b96d1c5ea62664f74da0e34a04b6511a8ffLubos Kosco
f9fd2b96d1c5ea62664f74da0e34a04b6511a8ffLubos Kosco if (!comma) {
f9fd2b96d1c5ea62664f74da0e34a04b6511a8ffLubos Kosco ap_rputs("<tt> <EM>none</EM></tt>", r);
f9fd2b96d1c5ea62664f74da0e34a04b6511a8ffLubos Kosco }
f9fd2b96d1c5ea62664f74da0e34a04b6511a8ffLubos Kosco}
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Kosco
f9fd2b96d1c5ea62664f74da0e34a04b6511a8ffLubos Koscostatic const char *find_more_info(server_rec *s, const char *module_name)
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Kosco{
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Kosco int i;
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Kosco info_svr_conf *conf = (info_svr_conf *) ap_get_module_config(s->module_config,
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Kosco &info_module);
f9fd2b96d1c5ea62664f74da0e34a04b6511a8ffLubos Kosco info_entry *entry = (info_entry *) conf->more_info->elts;
f9fd2b96d1c5ea62664f74da0e34a04b6511a8ffLubos Kosco
f9fd2b96d1c5ea62664f74da0e34a04b6511a8ffLubos Kosco if (!module_name) {
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Kosco return 0;
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Kosco }
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Kosco for (i = 0; i < conf->more_info->nelts; i++) {
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Kosco if (!strcmp(module_name, entry->name)) {
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Kosco return entry->info;
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Kosco }
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Kosco entry++;
3c390a5cd6f5baf2ceb8607d33fe66f93b7826baLubos Kosco }
f9fd2b96d1c5ea62664f74da0e34a04b6511a8ffLubos Kosco return 0;
f9fd2b96d1c5ea62664f74da0e34a04b6511a8ffLubos Kosco}
f9fd2b96d1c5ea62664f74da0e34a04b6511a8ffLubos Kosco
f9fd2b96d1c5ea62664f74da0e34a04b6511a8ffLubos Koscostatic int display_info(request_rec *r)
f9fd2b96d1c5ea62664f74da0e34a04b6511a8ffLubos Kosco{
f9fd2b96d1c5ea62664f74da0e34a04b6511a8ffLubos Kosco module *modp = NULL;
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Kosco char buf[MAX_STRING_LEN];
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye const char *more_info;
9cf297d9a579835e9336d587eaee187ca0954767Knut Anders Hatlen const command_rec *cmd = NULL;
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye#ifdef NEVERMORE
2c2a50fade805afbf4a5a880a38648613d7e01aeLubos Kosco const handler_rec *hand = NULL;
c0550b01024b910b8c1468811c0ea663b10b1372Trond Norbye#endif
20a0bde399487a651cdeb66fc8b44b2212036355Trond Norbye server_rec *serv = r->server;
c0550b01024b910b8c1468811c0ea663b10b1372Trond Norbye int comma = 0;
523201f786f6b12b7cf54091c6e5be167878cbeeTrond Norbye
523201f786f6b12b7cf54091c6e5be167878cbeeTrond Norbye if (strcmp(r->handler, "server-info"))
523201f786f6b12b7cf54091c6e5be167878cbeeTrond Norbye return DECLINED;
523201f786f6b12b7cf54091c6e5be167878cbeeTrond Norbye
523201f786f6b12b7cf54091c6e5be167878cbeeTrond Norbye r->allowed |= (1 << M_GET);
523201f786f6b12b7cf54091c6e5be167878cbeeTrond Norbye if (r->method_number != M_GET)
523201f786f6b12b7cf54091c6e5be167878cbeeTrond Norbye return DECLINED;
523201f786f6b12b7cf54091c6e5be167878cbeeTrond Norbye
c0550b01024b910b8c1468811c0ea663b10b1372Trond Norbye r->content_type = "text/html";
0a0811923cbbd2976425db6f4c78eed811c2825bKnut Anders Hatlen if (r->header_only) {
0a0811923cbbd2976425db6f4c78eed811c2825bKnut Anders Hatlen return 0;
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye }
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye ap_rputs(DOCTYPE_HTML_3_2
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye "<html><head><title>Server Information</title></head>\n", r);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye ap_rputs("<body><h1 align=center>Apache Server Information</h1>\n", r);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye if (!r->args || strcasecmp(r->args, "list")) {
0a0811923cbbd2976425db6f4c78eed811c2825bKnut Anders Hatlen if (!r->args) {
a07b2874263e3c5f0cd2e83441719415d53059c2Knut Anders Hatlen ap_rputs("<tt><a href=\"#server\">Server Settings</a>, ", r);
a07b2874263e3c5f0cd2e83441719415d53059c2Knut Anders Hatlen for (modp = ap_top_module; modp; modp = modp->next) {
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye ap_rprintf(r, "<a href=\"#%s\">%s</a>", modp->name, modp->name);
a07b2874263e3c5f0cd2e83441719415d53059c2Knut Anders Hatlen if (modp->next) {
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye ap_rputs(", ", r);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye }
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye }
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye ap_rputs("</tt><hr>", r);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye }
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye if (!r->args || !strcasecmp(r->args, "server")) {
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye int max_daemons, forked, threaded;
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye ap_rprintf(r, "<a name=\"server\"><strong>Server Version:</strong> "
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye "<font size=+1><tt>%s</tt></a></font><br>\n",
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye ap_get_server_version());
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye ap_rprintf(r, "<strong>Server Built:</strong> "
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye "<font size=+1><tt>%s</tt></a></font><br>\n",
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye ap_get_server_built());
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye ap_rprintf(r, "<strong>API Version:</strong> "
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye "<tt>%d:%d</tt><br>\n",
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye MODULE_MAGIC_NUMBER_MAJOR, MODULE_MAGIC_NUMBER_MINOR);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye ap_rprintf(r, "<strong>Hostname/port:</strong> "
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye "<tt>%s:%u</tt><br>\n",
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye serv->server_hostname, serv->port);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye ap_rprintf(r, "<strong>Timeouts:</strong> "
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye "<tt>connection: %d &nbsp;&nbsp; "
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye "keep-alive: %d</tt><br>",
a07b2874263e3c5f0cd2e83441719415d53059c2Knut Anders Hatlen serv->timeout, serv->keep_alive_timeout);
a07b2874263e3c5f0cd2e83441719415d53059c2Knut Anders Hatlen ap_mpm_query(AP_MPMQ_MAX_DAEMON_USED, &max_daemons);
edcb01bf549171673fd0bb4239f2edfc7a810397Knut Anders Hatlen ap_mpm_query(AP_MPMQ_IS_THREADED, &threaded);
c6963a7ea2753672325502d342e653700be550a8Lubos Kosco ap_mpm_query(AP_MPMQ_IS_FORKED, &forked);
c6963a7ea2753672325502d342e653700be550a8Lubos Kosco ap_rprintf(r, "MPM used is %s<br>\n", ap_show_mpm());
c6963a7ea2753672325502d342e653700be550a8Lubos Kosco ap_rprintf(r, "<strong>MPM Information:</strong> "
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye "<tt>Max Daemons: %d Threaded: %s Forked: %s</tt><br>\n",
c6963a7ea2753672325502d342e653700be550a8Lubos Kosco max_daemons, threaded ? "yes" : "no",
c6963a7ea2753672325502d342e653700be550a8Lubos Kosco forked ? "yes" : "no");
c6963a7ea2753672325502d342e653700be550a8Lubos Kosco ap_rprintf(r, "<strong>Server Root:</strong> "
c6963a7ea2753672325502d342e653700be550a8Lubos Kosco "<tt>%s</tt><br>\n", ap_server_root);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye ap_rprintf(r, "<strong>Config File:</strong> "
c6963a7ea2753672325502d342e653700be550a8Lubos Kosco "<tt>%s</tt><br>\n", SERVER_CONFIG_FILE);
edcb01bf549171673fd0bb4239f2edfc7a810397Knut Anders Hatlen }
85e0595857351c6e22f75b8928967d14cb679ac5Jorgen Austvik ap_rputs("<hr><dl>", r);
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik for (modp = ap_top_module; modp; modp = modp->next) {
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik if (!r->args || !strcasecmp(modp->name, r->args)) {
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik ap_rprintf(r, "<dt><a name=\"%s\"><strong>Module Name:</strong> "
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik "<font size=+1><tt>%s</tt></a></font>\n",
c7eb123c8b2081a261deff3c401fbf92ddba1b58Jorgen Austvik modp->name, modp->name);
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik ap_rputs("<dt><strong>Content handlers:</strong>", r);
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik#ifdef NEVERMORE
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik hand = modp->handlers;
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik if (hand) {
c7eb123c8b2081a261deff3c401fbf92ddba1b58Jorgen Austvik while (hand) {
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik if (hand->content_type) {
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik ap_rprintf(r, " <tt>%s</tt>\n", hand->content_type);
52cf1d63b1f1b231ff1e86eca2058d88560579b5Lubos Kosco }
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik else {
c7eb123c8b2081a261deff3c401fbf92ddba1b58Jorgen Austvik break;
c7eb123c8b2081a261deff3c401fbf92ddba1b58Jorgen Austvik }
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik hand++;
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik if (hand && hand->content_type) {
85e0595857351c6e22f75b8928967d14cb679ac5Jorgen Austvik ap_rputs(",", r);
c7eb123c8b2081a261deff3c401fbf92ddba1b58Jorgen Austvik }
85e0595857351c6e22f75b8928967d14cb679ac5Jorgen Austvik }
85e0595857351c6e22f75b8928967d14cb679ac5Jorgen Austvik }
85e0595857351c6e22f75b8928967d14cb679ac5Jorgen Austvik else {
85e0595857351c6e22f75b8928967d14cb679ac5Jorgen Austvik ap_rputs("<tt> <EM>none</EM></tt>", r);
85e0595857351c6e22f75b8928967d14cb679ac5Jorgen Austvik }
a3a5f5c0500064f4c6ac3658b1e3e4d838912329Lubos Kosco#else
a3a5f5c0500064f4c6ac3658b1e3e4d838912329Lubos Kosco if (module_find_hook(modp, ap_hook_get_handler)) {
85e0595857351c6e22f75b8928967d14cb679ac5Jorgen Austvik ap_rputs("<tt> <EM>yes</EM></tt>", r);
85e0595857351c6e22f75b8928967d14cb679ac5Jorgen Austvik }
85e0595857351c6e22f75b8928967d14cb679ac5Jorgen Austvik else {
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvik ap_rputs("<tt> <EM>none</EM></tt>", r);
52cf1d63b1f1b231ff1e86eca2058d88560579b5Lubos Kosco }
1f17ba9e3c026d75f488227451416bd72a222afeTrond Norbye#endif
c7eb123c8b2081a261deff3c401fbf92ddba1b58Jorgen Austvik ap_rputs("<dt><strong>Configuration Phase Participation:</strong> \n",
c7eb123c8b2081a261deff3c401fbf92ddba1b58Jorgen Austvik r);
1f17ba9e3c026d75f488227451416bd72a222afeTrond Norbye if (modp->create_dir_config) {
1f17ba9e3c026d75f488227451416bd72a222afeTrond Norbye if (comma) {
1f17ba9e3c026d75f488227451416bd72a222afeTrond Norbye ap_rputs(", ", r);
c7eb123c8b2081a261deff3c401fbf92ddba1b58Jorgen Austvik }
1f17ba9e3c026d75f488227451416bd72a222afeTrond Norbye ap_rputs("<tt>Create Directory Config</tt>", r);
1f17ba9e3c026d75f488227451416bd72a222afeTrond Norbye comma = 1;
1f17ba9e3c026d75f488227451416bd72a222afeTrond Norbye }
1f17ba9e3c026d75f488227451416bd72a222afeTrond Norbye if (modp->merge_dir_config) {
1f17ba9e3c026d75f488227451416bd72a222afeTrond Norbye if (comma) {
a3a5f5c0500064f4c6ac3658b1e3e4d838912329Lubos Kosco ap_rputs(", ", r);
a3a5f5c0500064f4c6ac3658b1e3e4d838912329Lubos Kosco }
1f17ba9e3c026d75f488227451416bd72a222afeTrond Norbye ap_rputs("<tt>Merge Directory Configs</tt>", r);
1f17ba9e3c026d75f488227451416bd72a222afeTrond Norbye comma = 1;
1f17ba9e3c026d75f488227451416bd72a222afeTrond Norbye }
49f592091468eac515dde6139fbc8efa26056b0aJorgen Austvik if (modp->create_server_config) {
49f592091468eac515dde6139fbc8efa26056b0aJorgen Austvik if (comma) {
49f592091468eac515dde6139fbc8efa26056b0aJorgen Austvik ap_rputs(", ", r);
49f592091468eac515dde6139fbc8efa26056b0aJorgen Austvik }
49f592091468eac515dde6139fbc8efa26056b0aJorgen Austvik ap_rputs("<tt>Create Server Config</tt>", r);
49f592091468eac515dde6139fbc8efa26056b0aJorgen Austvik comma = 1;
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik }
49f592091468eac515dde6139fbc8efa26056b0aJorgen Austvik if (modp->merge_server_config) {
49f592091468eac515dde6139fbc8efa26056b0aJorgen Austvik if (comma) {
49f592091468eac515dde6139fbc8efa26056b0aJorgen Austvik ap_rputs(", ", r);
45cf976b01987ad147e9edb54ffab0938dd6c016Trond Norbye }
49f592091468eac515dde6139fbc8efa26056b0aJorgen Austvik ap_rputs("<tt>Merge Server Configs</tt>", r);
54ba62a2c6e74332ffc742cb23faf21615b5d39fLubos Kosco comma = 1;
49f592091468eac515dde6139fbc8efa26056b0aJorgen Austvik }
49f592091468eac515dde6139fbc8efa26056b0aJorgen Austvik if (!comma)
49f592091468eac515dde6139fbc8efa26056b0aJorgen Austvik ap_rputs("<tt> <EM>none</EM></tt>", r);
49f592091468eac515dde6139fbc8efa26056b0aJorgen Austvik comma = 0;
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik module_request_hook_participate(r, modp);
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik ap_rputs("<dt><strong>Module Directives:</strong> ", r);
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik cmd = modp->cmds;
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik if (cmd) {
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik while (cmd) {
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik if (cmd->name) {
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik ap_rprintf(r, "<dd><tt>%s - <i>",
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik mod_info_html_cmd_string(cmd->name,
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik buf, sizeof(buf), 0));
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik if (cmd->errmsg) {
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik ap_rputs(cmd->errmsg, r);
8a841dc6dc54985806558f1af0542d271d57259fLubos Kosco }
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik ap_rputs("</i></tt>\n", r);
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik }
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik else {
8a841dc6dc54985806558f1af0542d271d57259fLubos Kosco break;
a3a5f5c0500064f4c6ac3658b1e3e4d838912329Lubos Kosco }
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik cmd++;
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik }
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik ap_rputs("<dt><strong>Current Configuration:</strong>\n", r);
fcb68bae47907ba23c545e379c81c3ee6e19f778Lubos Kosco mod_info_module_cmds(r, modp->cmds, ap_conftree);
fcb68bae47907ba23c545e379c81c3ee6e19f778Lubos Kosco }
fcb68bae47907ba23c545e379c81c3ee6e19f778Lubos Kosco else {
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik ap_rputs("<tt> none</tt>\n", r);
2ef63dc9adc693ddad2206d323b0a85a1afe70ecJorgen Austvik }
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik more_info = find_more_info(serv, modp->name);
1f17ba9e3c026d75f488227451416bd72a222afeTrond Norbye if (more_info) {
30637745bf5a7db2ff9684a2536cc9f8c9df2218Lubos Kosco ap_rputs("<dt><strong>Additional Information:</strong>\n<dd>",
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye r);
30637745bf5a7db2ff9684a2536cc9f8c9df2218Lubos Kosco ap_rputs(more_info, r);
30637745bf5a7db2ff9684a2536cc9f8c9df2218Lubos Kosco }
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye ap_rputs("<dt><hr>\n", r);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye if (r->args) {
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye break;
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye }
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye }
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye }
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye if (!modp && r->args && strcasecmp(r->args, "server")) {
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye ap_rputs("<b>No such module</b>\n", r);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye }
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye }
30637745bf5a7db2ff9684a2536cc9f8c9df2218Lubos Kosco else {
30637745bf5a7db2ff9684a2536cc9f8c9df2218Lubos Kosco for (modp = ap_top_module; modp; modp = modp->next) {
30637745bf5a7db2ff9684a2536cc9f8c9df2218Lubos Kosco ap_rputs(modp->name, r);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye if (modp->next) {
30637745bf5a7db2ff9684a2536cc9f8c9df2218Lubos Kosco ap_rputs("<br>", r);
30637745bf5a7db2ff9684a2536cc9f8c9df2218Lubos Kosco }
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye }
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye }
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye ap_rputs("</dl>\n", r);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye ap_rputs(ap_psignature("",r), r);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye ap_rputs("</body></html>\n", r);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye /* Done, turn off timeout, close file and return */
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye return 0;
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye}
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbyestatic const char *add_module_info(cmd_parms *cmd, void *dummy,
30637745bf5a7db2ff9684a2536cc9f8c9df2218Lubos Kosco const char *name, const char *info)
30637745bf5a7db2ff9684a2536cc9f8c9df2218Lubos Kosco{
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik server_rec *s = cmd->server;
f09d46eefeb5e4db6dc11e02e417b448fa9362a9Jorgen Austvik info_svr_conf *conf = (info_svr_conf *) ap_get_module_config(s->module_config,
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik &info_module);
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik info_entry *new = apr_array_push(conf->more_info);
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik new->name = name;
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik new->info = info;
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik return NULL;
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik}
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvikstatic const command_rec info_cmds[] =
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik{
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik AP_INIT_TAKE2("AddModuleInfo", add_module_info, NULL, RSRC_CONF,
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvik "a module name and additional information on that module"),
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvik {NULL}
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvik};
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvik
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvikstatic void register_hooks(apr_pool_t *p)
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvik{
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvik ap_hook_handler(display_info, NULL, NULL, APR_HOOK_MIDDLE);
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvik}
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvik
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvikmodule AP_MODULE_DECLARE_DATA info_module =
63e0f31920b0818d6f471a066c12da991fb35346Trond Norbye{
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvik STANDARD20_MODULE_STUFF,
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvik NULL, /* dir config creater */
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvik NULL, /* dir merger --- default is to override */
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvik create_info_config, /* server config */
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvik merge_info_config, /* merge server config */
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvik info_cmds, /* command apr_table_t */
ede8ae04a015c7d2ae4916e5bb36813b81cb7c30Jorgen Austvik register_hooks
49180e08afc7cf03413ab108bc71c14e9de1a880Jorgen Austvik};
ede8ae04a015c7d2ae4916e5bb36813b81cb7c30Jorgen Austvik