mod_info.c revision 5fc20796e4b0474cf8b2383945687783de1d3632
5a580c3a38ced62d4bcc95b8ac7c4f2935b5d294Timo Sirainen/* Licensed to the Apache Software Foundation (ASF) under one or more
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen * contributor license agreements. See the NOTICE file distributed with
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen * this work for additional information regarding copyright ownership.
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen * The ASF licenses this file to You under the Apache License, Version 2.0
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen * (the "License"); you may not use this file except in compliance with
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen * the License. You may obtain a copy of the License at
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen *
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen * http://www.apache.org/licenses/LICENSE-2.0
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen *
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen * Unless required by applicable law or agreed to in writing, software
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen * distributed under the License is distributed on an "AS IS" BASIS,
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen * See the License for the specific language governing permissions and
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen * limitations under the License.
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen */
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen/*
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen * Info Module. Display configuration information for the server and
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen * all included modules.
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen *
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen * <Location /server-info>
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen * SetHandler server-info
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen * </Location>
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen *
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen * GET /server-info - Returns full configuration page for server and all modules
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen * GET /server-info?server - Returns server configuration only
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen * GET /server-info?module_name - Returns configuration for a single module
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen * GET /server-info?list - Returns quick list of included modules
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen * GET /server-info?config - Returns full configuration
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen * GET /server-info?hooks - Returns a listing of the modules active for each hook
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen *
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen * Original Author:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen * Rasmus Lerdorf <rasmus vex.net>, May 1996
bdd36cfdba3ff66d25570a9ff568d69e1eb543cfTimo Sirainen *
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen * Modified By:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen * Lou Langholtz <ldl usi.utah.edu>, July 1997
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen *
9522aa5f33cc37fe8ccd0d647cc51dd3ba6a9b55Timo Sirainen * Apache 2.0 Port:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen * Ryan Morgan <rmorgan covalent.net>, August 2000
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen *
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#include "apr.h"
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#include "apr_strings.h"
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#include "apr_lib.h"
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#define APR_WANT_STRFUNC
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#include "apr_want.h"
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#define CORE_PRIVATE
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen#include "httpd.h"
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen#include "http_config.h"
fe7f9298fb789717d26dc4cb6317a9d376acd8fcTimo Sirainen#include "http_core.h"
3574bab52a67dfe1291f6306e707c6199e777043Timo Sirainen#include "http_log.h"
3574bab52a67dfe1291f6306e707c6199e777043Timo Sirainen#include "http_main.h"
3574bab52a67dfe1291f6306e707c6199e777043Timo Sirainen#include "http_protocol.h"
5a5b39ce7c6ba6d6ff2218ae1679e0485bf43b47Timo Sirainen#include "http_connection.h"
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen#include "http_request.h"
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen#include "util_script.h"
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen#include "ap_mpm.h"
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
fe7f9298fb789717d26dc4cb6317a9d376acd8fcTimo Sirainentypedef struct
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen{
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen const char *name; /* matching module name */
03fa2d644be0a9274e7e94fb4835cc374c539264Timo Sirainen const char *info; /* additional info */
03fa2d644be0a9274e7e94fb4835cc374c539264Timo Sirainen} info_entry;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
f64b5bc9e73bedc63ba3c072c286542c29c69e43Timo Sirainentypedef struct
4bc4042782c465636eff2c713bc85f5a1d773d91Timo Sirainen{
4bc4042782c465636eff2c713bc85f5a1d773d91Timo Sirainen apr_array_header_t *more_info;
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen} info_svr_conf;
9a656df90290a5fef45b3a1191ae75864f17602dTimo Sirainen
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainenmodule AP_MODULE_DECLARE_DATA info_module;
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen
468c28dfb03613ab8d487b5aebc985a969193aceTimo Sirainenstatic void *create_info_config(apr_pool_t * p, server_rec * s)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen{
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen info_svr_conf *conf =
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen (info_svr_conf *) apr_pcalloc(p, sizeof(info_svr_conf));
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen conf->more_info = apr_array_make(p, 20, sizeof(info_entry));
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen return conf;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen}
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainenstatic void *merge_info_config(apr_pool_t * p, void *basev, void *overridesv)
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen{
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen info_svr_conf *new =
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen (info_svr_conf *) apr_pcalloc(p, sizeof(info_svr_conf));
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen info_svr_conf *base = (info_svr_conf *) basev;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen info_svr_conf *overrides = (info_svr_conf *) overridesv;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
4bc4042782c465636eff2c713bc85f5a1d773d91Timo Sirainen new->more_info =
ee3362f3b78827a2c9a7e9ddee83f5a429c06213Timo Sirainen apr_array_append(p, overrides->more_info, base->more_info);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen return new;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen}
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic void put_int_flush_right(request_rec * r, int i, int field)
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen{
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen if (field > 1 || i > 9)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen put_int_flush_right(r, i / 10, field - 1);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (i)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rputc('0' + i % 10, r);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen else
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rputs("&nbsp;", r);
6cb8e7d726a7e9d157e87fb379982d52100b283fTimo Sirainen}
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic void mod_info_indent(request_rec * r, int nest,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen const char *thisfn, int linenum)
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen{
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen int i;
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen const char *prevfn =
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_get_module_config(r->request_config, &info_module);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (thisfn == NULL)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen thisfn = "*UNKNOWN*";
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (prevfn == NULL || 0 != strcmp(prevfn, thisfn)) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen thisfn = ap_escape_html(r->pool, thisfn);
8d63b0ab4dea920a4dd6a4469289950eef50a063Timo Sirainen ap_rprintf(r, "<dd><tt><strong>In file: %s</strong></tt></dd>\n",
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainen thisfn);
03fa2d644be0a9274e7e94fb4835cc374c539264Timo Sirainen ap_set_module_config(r->request_config, &info_module,
f64b5bc9e73bedc63ba3c072c286542c29c69e43Timo Sirainen (void *) thisfn);
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen }
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
8621be3846dc097420cce325ad36d1b646f72a09Timo Sirainen ap_rputs("<dd><tt>", r);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen put_int_flush_right(r, linenum > 0 ? linenum : 0, 4);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rputs(":&nbsp;", r);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen for (i = 1; i <= nest; ++i) {
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen ap_rputs("&nbsp;&nbsp;", r);
06fc82430569125dccb8cd20e122e77b44698c7eTimo Sirainen }
06fc82430569125dccb8cd20e122e77b44698c7eTimo Sirainen}
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainenstatic void mod_info_show_cmd(request_rec * r, const ap_directive_t * dir,
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen int nest)
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen{
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen mod_info_indent(r, nest, dir->filename, dir->line_num);
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen ap_rprintf(r, "%s <i>%s</i></tt></dd>\n",
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen ap_escape_html(r->pool, dir->directive),
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen ap_escape_html(r->pool, dir->args));
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen}
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen
4847d74a7442a3efabe76a8ad18dd464082d6581Timo Sirainenstatic void mod_info_show_open(request_rec * r, const ap_directive_t * dir,
4847d74a7442a3efabe76a8ad18dd464082d6581Timo Sirainen int nest)
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen{
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen mod_info_indent(r, nest, dir->filename, dir->line_num);
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_rprintf(r, "%s %s</tt></dd>\n",
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_escape_html(r->pool, dir->directive),
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_escape_html(r->pool, dir->args));
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen}
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainenstatic void mod_info_show_close(request_rec * r, const ap_directive_t * dir,
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen int nest)
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen{
cc22ca265b5b355c4a029155e074f36b5baf2e60Timo Sirainen const char *dirname = dir->directive;
cc22ca265b5b355c4a029155e074f36b5baf2e60Timo Sirainen mod_info_indent(r, nest, dir->filename, 0);
cc22ca265b5b355c4a029155e074f36b5baf2e60Timo Sirainen if (*dirname == '<') {
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_rprintf(r, "&lt;/%s&gt;</tt></dd>",
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_escape_html(r->pool, dirname + 1));
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen }
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen else {
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_rprintf(r, "/%s</tt></dd>", ap_escape_html(r->pool, dirname));
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen }
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen}
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainenstatic int mod_info_has_cmd(const command_rec * cmds, ap_directive_t * dir)
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen{
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen const command_rec *cmd;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen if (cmds == NULL)
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen return 1;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen for (cmd = cmds; cmd->name; ++cmd) {
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen if (strcasecmp(cmd->name, dir->directive) == 0)
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen return 1;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen }
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen return 0;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen}
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainenstatic void mod_info_show_parents(request_rec * r, ap_directive_t * node,
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen int from, int to)
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen{
6cb8e7d726a7e9d157e87fb379982d52100b283fTimo Sirainen if (from < to)
6cb8e7d726a7e9d157e87fb379982d52100b283fTimo Sirainen mod_info_show_parents(r, node->parent, from, to - 1);
06fc82430569125dccb8cd20e122e77b44698c7eTimo Sirainen mod_info_show_open(r, node, to);
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen}
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen
6cb8e7d726a7e9d157e87fb379982d52100b283fTimo Sirainenstatic int mod_info_module_cmds(request_rec * r, const command_rec * cmds,
6cb8e7d726a7e9d157e87fb379982d52100b283fTimo Sirainen ap_directive_t * node, int from, int level)
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen{
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen int shown = from;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_directive_t *dir;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen if (level == 0)
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_set_module_config(r->request_config, &info_module, NULL);
6cb8e7d726a7e9d157e87fb379982d52100b283fTimo Sirainen for (dir = node; dir; dir = dir->next) {
6cb8e7d726a7e9d157e87fb379982d52100b283fTimo Sirainen if (dir->first_child != NULL) {
6cb8e7d726a7e9d157e87fb379982d52100b283fTimo Sirainen if (level < mod_info_module_cmds(r, cmds, dir->first_child,
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen shown, level + 1)) {
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen shown = level;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen mod_info_show_close(r, dir, level);
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen }
6cb8e7d726a7e9d157e87fb379982d52100b283fTimo Sirainen }
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen else if (mod_info_has_cmd(cmds, dir)) {
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen if (shown < level) {
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen mod_info_show_parents(r, dir->parent, shown, level - 1);
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen shown = level;
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen }
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen mod_info_show_cmd(r, dir, level);
6cb8e7d726a7e9d157e87fb379982d52100b283fTimo Sirainen }
9a656df90290a5fef45b3a1191ae75864f17602dTimo Sirainen }
6cb8e7d726a7e9d157e87fb379982d52100b283fTimo Sirainen return shown;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen}
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainentypedef struct
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen{ /*XXX: should get something from apr_hooks.h instead */
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen void (*pFunc) (void); /* just to get the right size */
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen const char *szName;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen const char *const *aszPredecessors;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen const char *const *aszSuccessors;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen int nOrder;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen} hook_struct_t;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen/*
468c28dfb03613ab8d487b5aebc985a969193aceTimo Sirainen * hook_get_t is a pointer to a function that takes void as an argument and
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen * returns a pointer to an apr_array_header_t. The nasty WIN32 ifdef
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen * is required to account for the fact that the ap_hook* calls all use
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen * STDCALL calling convention.
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen */
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainentypedef apr_array_header_t *(
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen#ifdef WIN32
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen __stdcall
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen#endif
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen * hook_get_t) (void);
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainentypedef struct
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen{
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen const char *name;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen hook_get_t get;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen} hook_lookup_t;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainenstatic hook_lookup_t startup_hooks[] = {
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen {"Pre-Config", ap_hook_get_pre_config},
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen {"Check Configuration", ap_hook_get_check_config},
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen {"Test Configuration", ap_hook_get_test_config},
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen {"Post Configuration", ap_hook_get_post_config},
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen {"Open Logs", ap_hook_get_open_logs},
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen {"Child Init", ap_hook_get_child_init},
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen {NULL},
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen};
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainenstatic hook_lookup_t request_hooks[] = {
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen {"Pre-Connection", ap_hook_get_pre_connection},
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen {"Create Connection", ap_hook_get_create_connection},
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen {"Process Connection", ap_hook_get_process_connection},
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen {"Create Request", ap_hook_get_create_request},
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen {"Post-Read Request", ap_hook_get_post_read_request},
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen {"Header Parse", ap_hook_get_header_parser},
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen {"HTTP Scheme", ap_hook_get_http_scheme},
6cb8e7d726a7e9d157e87fb379982d52100b283fTimo Sirainen {"Default Port", ap_hook_get_default_port},
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen {"Quick Handler", ap_hook_get_quick_handler},
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen {"Translate Name", ap_hook_get_translate_name},
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen {"Map to Storage", ap_hook_get_map_to_storage},
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen {"Check Access", ap_hook_get_access_checker},
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen {"Verify User ID", ap_hook_get_check_user_id},
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen {"Verify User Access", ap_hook_get_auth_checker},
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen {"Check Type", ap_hook_get_type_checker},
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen {"Fixups", ap_hook_get_fixups},
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen {"Insert Filters", ap_hook_get_insert_filter},
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen {"Content Handlers", ap_hook_get_handler},
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen {"Logging", ap_hook_get_log_transaction},
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen {"Insert Errors", ap_hook_get_insert_error_filter},
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen {NULL},
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen};
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainenstatic int module_find_hook(module * modp, hook_get_t hook_get)
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen{
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen int i;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen apr_array_header_t *hooks = hook_get();
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen hook_struct_t *elts;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen if (!hooks) {
6cb8e7d726a7e9d157e87fb379982d52100b283fTimo Sirainen return 0;
6cb8e7d726a7e9d157e87fb379982d52100b283fTimo Sirainen }
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen elts = (hook_struct_t *) hooks->elts;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen for (i = 0; i < hooks->nelts; i++) {
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen if (strcmp(elts[i].szName, modp->name) == 0) {
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen return 1;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen }
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen }
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen return 0;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen}
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainenstatic void module_participate(request_rec * r,
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen module * modp,
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen hook_lookup_t * lookup, int *comma)
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen{
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen if (module_find_hook(modp, lookup->get)) {
6cb8e7d726a7e9d157e87fb379982d52100b283fTimo Sirainen if (*comma) {
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_rputs(", ", r);
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen }
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_rvputs(r, "<tt>", lookup->name, "</tt>", NULL);
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen *comma = 1;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen }
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen}
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainenstatic void module_request_hook_participate(request_rec * r, module * modp)
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen{
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen int i, comma = 0;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_rputs("<dt><strong>Request Phase Participation:</strong>\n", r);
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen for (i = 0; request_hooks[i].name; i++) {
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen module_participate(r, modp, &request_hooks[i], &comma);
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen }
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen if (!comma) {
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_rputs("<tt> <em>none</em></tt>", r);
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen }
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_rputs("</dt>\n", r);
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen}
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainenstatic const char *find_more_info(server_rec * s, const char *module_name)
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen{
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen int i;
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen info_svr_conf *conf =
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen (info_svr_conf *) ap_get_module_config(s->module_config,
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen &info_module);
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen info_entry *entry = (info_entry *) conf->more_info->elts;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen if (!module_name) {
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen return 0;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen }
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen for (i = 0; i < conf->more_info->nelts; i++) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (!strcmp(module_name, entry->name)) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen return entry->info;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen }
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen entry++;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen }
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen return 0;
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen}
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainenstatic int show_server_settings(request_rec * r)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen{
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen server_rec *serv = r->server;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen int max_daemons, forked, threaded;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rputs("<h2><a name=\"server\">Server Settings</a></h2>", r);
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen ap_rprintf(r,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "<dl><dt><strong>Server Version:</strong> "
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "<font size=\"+1\"><tt>%s</tt></font></dt>\n",
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_get_server_description());
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rprintf(r,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "<dt><strong>Server Built:</strong> "
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "<font size=\"+1\"><tt>%s</tt></font></dt>\n",
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_get_server_built());
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rprintf(r,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "<dt><strong>Module Magic Number:</strong> "
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "<tt>%d:%d</tt></dt>\n", MODULE_MAGIC_NUMBER_MAJOR,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen MODULE_MAGIC_NUMBER_MINOR);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rprintf(r,
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen "<dt><strong>Hostname/port:</strong> "
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "<tt>%s:%u</tt></dt>\n", ap_get_server_name(r),
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_get_server_port(r));
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rprintf(r,
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen "<dt><strong>Timeouts:</strong> "
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen "<tt>connection: %d &nbsp;&nbsp; "
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen "keep-alive: %d</tt></dt>",
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen (int) (apr_time_sec(serv->timeout)),
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen (int) (apr_time_sec(serv->timeout)));
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_mpm_query(AP_MPMQ_MAX_DAEMON_USED, &max_daemons);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_mpm_query(AP_MPMQ_IS_THREADED, &threaded);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_mpm_query(AP_MPMQ_IS_FORKED, &forked);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rprintf(r, "<dt><strong>MPM Name:</strong> <tt>%s</tt></dt>\n",
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_show_mpm());
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rprintf(r,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "<dt><strong>MPM Information:</strong> "
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "<tt>Max Daemons: %d Threaded: %s Forked: %s</tt></dt>\n",
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen max_daemons, threaded ? "yes" : "no", forked ? "yes" : "no");
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rprintf(r,
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen "<dt><strong>Server Architecture:</strong> "
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen "<tt>%ld-bit</tt></dt>\n", 8 * (long) sizeof(void *));
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_rprintf(r,
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen "<dt><strong>Server Root:</strong> "
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "<tt>%s</tt></dt>\n", ap_server_root);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rprintf(r,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "<dt><strong>Config File:</strong> "
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen "<tt>%s</tt></dt>\n", ap_conftree->filename);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_rputs("<dt><strong>Server Built With:</strong>\n"
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen "<tt style=\"white-space: pre;\">\n", r);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen /* TODO: Not all of these defines are getting set like they do in main.c.
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen * Missing some headers?
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen */
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen#ifdef BIG_SECURITY_HOLE
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_rputs(" -D BIG_SECURITY_HOLE\n", r);
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen#endif
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen#ifdef SECURITY_HOLE_PASS_AUTHORIZATION
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_rputs(" -D SECURITY_HOLE_PASS_AUTHORIZATION\n", r);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen#endif
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen#ifdef OS
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen ap_rputs(" -D OS=\"" OS "\"\n", r);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen#endif
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen#ifdef APACHE_MPM_DIR
ce28adabf2c47d3af9ef197787cdb5139424c69cTimo Sirainen ap_rputs(" -D APACHE_MPM_DIR=\"" APACHE_MPM_DIR "\"\n", r);
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen#endif
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen#ifdef HAVE_SHMGET
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen ap_rputs(" -D HAVE_SHMGET\n", r);
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen#endif
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen#if APR_FILE_BASED_SHM
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen ap_rputs(" -D APR_FILE_BASED_SHM\n", r);
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen#endif
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen#if APR_HAS_SENDFILE
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_rputs(" -D APR_HAS_SENDFILE\n", r);
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen#endif
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen#if APR_HAS_MMAP
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_rputs(" -D APR_HAS_MMAP\n", r);
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen#endif
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen#ifdef NO_WRITEV
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen ap_rputs(" -D NO_WRITEV\n", r);
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen#endif
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen#ifdef NO_LINGCLOSE
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_rputs(" -D NO_LINGCLOSE\n", r);
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen#endif
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen#if APR_HAVE_IPV6
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_rputs(" -D APR_HAVE_IPV6 (IPv4-mapped addresses ", r);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#ifdef AP_ENABLE_V4_MAPPED
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_rputs("enabled)\n", r);
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen#else
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_rputs("disabled)\n", r);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#endif
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#endif
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#if APR_USE_FLOCK_SERIALIZE
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rputs(" -D APR_USE_FLOCK_SERIALIZE\n", r);
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainen#endif
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainen
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen#if APR_USE_SYSVSEM_SERIALIZE
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rputs(" -D APR_USE_SYSVSEM_SERIALIZE\n", r);
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainen#endif
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen#if APR_USE_POSIXSEM_SERIALIZE
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rputs(" -D APR_USE_POSIXSEM_SERIALIZE\n", r);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#endif
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#if APR_USE_FCNTL_SERIALIZE
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rputs(" -D APR_USE_FCNTL_SERIALIZE\n", r);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen#endif
1df39b899804fd1dbc560f75382364822935c857Timo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#if APR_USE_PROC_PTHREAD_SERIALIZE
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rputs(" -D APR_USE_PROC_PTHREAD_SERIALIZE\n", r);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#endif
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen#if APR_PROCESS_LOCK_IS_GLOBAL
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen ap_rputs(" -D APR_PROCESS_LOCK_IS_GLOBAL\n", r);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen#endif
1df39b899804fd1dbc560f75382364822935c857Timo Sirainen
1df39b899804fd1dbc560f75382364822935c857Timo Sirainen#ifdef SINGLE_LISTEN_UNSERIALIZED_ACCEPT
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen ap_rputs(" -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT\n", r);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen#endif
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen#if APR_HAS_OTHER_CHILD
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen ap_rputs(" -D APR_HAS_OTHER_CHILD\n", r);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen#endif
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen#ifdef AP_HAVE_RELIABLE_PIPED_LOGS
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen ap_rputs(" -D AP_HAVE_RELIABLE_PIPED_LOGS\n", r);
1df39b899804fd1dbc560f75382364822935c857Timo Sirainen#endif
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen#ifdef BUFFERED_LOGS
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen ap_rputs(" -D BUFFERED_LOGS\n", r);
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen#ifdef PIPE_BUF
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen ap_rputs(" -D PIPE_BUF=%ld\n", (long) PIPE_BUF, r);
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen#endif
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen#endif
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen#if APR_CHARSET_EBCDIC
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen ap_rputs(" -D APR_CHARSET_EBCDIC\n", r);
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen#endif
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen#ifdef NEED_HASHBANG_EMUL
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen ap_rputs(" -D NEED_HASHBANG_EMUL\n", r);
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen#endif
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen#ifdef SHARED_CORE
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen ap_rputs(" -D SHARED_CORE\n", r);
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen#endif
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen/* This list displays the compiled in default paths: */
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen#ifdef HTTPD_ROOT
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainen ap_rputs(" -D HTTPD_ROOT=\"" HTTPD_ROOT "\"\n", r);
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainen#endif
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainen
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainen#ifdef SUEXEC_BIN
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainen ap_rputs(" -D SUEXEC_BIN=\"" SUEXEC_BIN "\"\n", r);
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainen#endif
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainen
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainen#if defined(SHARED_CORE) && defined(SHARED_CORE_DIR)
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainen ap_rputs(" -D SHARED_CORE_DIR=\"" SHARED_CORE_DIR "\"\n", r);
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainen#endif
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainen
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainen#ifdef DEFAULT_PIDLOG
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainen ap_rputs(" -D DEFAULT_PIDLOG=\"" DEFAULT_PIDLOG "\"\n", r);
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainen#endif
b37fabed279030d2989e8dcb25acdad3ad406433Timo Sirainen
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainen#ifdef DEFAULT_SCOREBOARD
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainen ap_rputs(" -D DEFAULT_SCOREBOARD=\"" DEFAULT_SCOREBOARD "\"\n", r);
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainen#endif
36a687c1ed3ce55520bdf28cd2fa1f653360068dTimo Sirainen
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainen#ifdef DEFAULT_LOCKFILE
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainen ap_rputs(" -D DEFAULT_LOCKFILE=\"" DEFAULT_LOCKFILE "\"\n", r);
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainen#endif
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainen
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainen#ifdef DEFAULT_ERRORLOG
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainen ap_rputs(" -D DEFAULT_ERRORLOG=\"" DEFAULT_ERRORLOG "\"\n", r);
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainen#endif
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen#ifdef AP_TYPES_CONFIG_FILE
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainen ap_rputs(" -D AP_TYPES_CONFIG_FILE=\"" AP_TYPES_CONFIG_FILE "\"\n", r);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#endif
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen#ifdef SERVER_CONFIG_FILE
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen ap_rputs(" -D SERVER_CONFIG_FILE=\"" SERVER_CONFIG_FILE "\"\n", r);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen#endif
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen ap_rputs("</tt></dt>\n", r);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen ap_rputs("</dl><hr />", r);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen return 0;
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainen}
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainen
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainenstatic int dump_a_hook(request_rec * r, hook_get_t hook_get)
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainen{
1df39b899804fd1dbc560f75382364822935c857Timo Sirainen int i;
1df39b899804fd1dbc560f75382364822935c857Timo Sirainen char qs;
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen hook_struct_t *elts;
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen apr_array_header_t *hooks = hook_get();
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen if (!hooks) {
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen return 0;
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen }
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (r->args && strcasecmp(r->args, "hooks") == 0) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen qs = '?';
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen }
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen else {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen qs = '#';
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen }
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen elts = (hook_struct_t *) hooks->elts;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen for (i = 0; i < hooks->nelts; i++) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rprintf(r,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "&nbsp;&nbsp; %02d <a href=\"%c%s\">%s</a> <br/>",
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen elts[i].nOrder, qs, elts[i].szName, elts[i].szName);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen }
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen return 0;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen}
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic int show_active_hooks(request_rec * r)
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen{
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen int i;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rputs("<h2><a name=\"startup_hooks\">Startup Hooks</a></h2>\n<dl>", r);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen for (i = 0; startup_hooks[i].name; i++) {
cf9d67e4a9bfee31cf3be05244555d51a3d1b9feTimo Sirainen ap_rprintf(r, "<dt><strong>%s:</strong>\n <br /><tt>\n",
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen startup_hooks[i].name);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen dump_a_hook(r, startup_hooks[i].get);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rputs("\n </tt>\n</dt>\n", r);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen }
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rputs
e34d170f8f0e084bd94bfbc1a7085ece67e508dfTimo Sirainen ("</dl>\n<hr />\n<h2><a name=\"request_hooks\">Request Hooks</a></h2>\n<dl>",
e34d170f8f0e084bd94bfbc1a7085ece67e508dfTimo Sirainen r);
8621be3846dc097420cce325ad36d1b646f72a09Timo Sirainen
8621be3846dc097420cce325ad36d1b646f72a09Timo Sirainen for (i = 0; request_hooks[i].name; i++) {
8621be3846dc097420cce325ad36d1b646f72a09Timo Sirainen ap_rprintf(r, "<dt><strong>%s:</strong>\n <br /><tt>\n",
8621be3846dc097420cce325ad36d1b646f72a09Timo Sirainen request_hooks[i].name);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen dump_a_hook(r, request_hooks[i].get);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rputs("\n </tt>\n</dt>\n", r);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen }
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen ap_rputs("</dl>\n<hr />\n", r);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen return 0;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen}
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenstatic int display_info(request_rec * r)
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen{
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen module *modp = NULL;
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen server_rec *serv = r->server;
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen const char *more_info;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen const command_rec *cmd = NULL;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen int comma = 0;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen if (strcmp(r->handler, "server-info"))
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen return DECLINED;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen r->allowed |= (AP_METHOD_BIT << M_GET);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen if (r->method_number != M_GET)
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen return DECLINED;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen ap_set_content_type(r, "text/html");
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen ap_rputs(DOCTYPE_XHTML_1_0T
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainen "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n"
32a93320fd2b6ada5ac8027166819463c1a007b6Timo Sirainen "<head>\n"
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen " <title>Server Information</title>\n" "</head>\n", r);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen ap_rputs("<body><h1 style=\"text-align: center\">"
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen "Apache Server Information</h1>\n", r);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen if (!r->args || strcasecmp(r->args, "list")) {
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen if (!r->args) {
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen ap_rputs("<dl><dt><tt>Subpages:<br />", r);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rputs("<a href=\"?config\">Configuration Files</a>, "
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "<a href=\"?server\">Server Settings</a>, "
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "<a href=\"?list\">Module List</a>, "
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "<a href=\"?hooks\">Active Hooks</a>", r);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rputs("</tt></dt></dl><hr />", r);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
c9b08dc8d71bd655e5648daf8a09ff4b728cae81Timo Sirainen ap_rputs("<dl><dt><tt>Sections:<br />", r);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rputs("<a href=\"#server\">Server Settings</a>, "
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "<a href=\"#startup_hooks\">Startup Hooks</a>, "
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "<a href=\"#request_hooks\">Request Hooks</a>", r);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rputs("</tt></dt></dl><hr />", r);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rputs("<dl><dt><tt>Loaded Modules: <br />", r);
c9b08dc8d71bd655e5648daf8a09ff4b728cae81Timo Sirainen /* TODO: Sort by Alpha */
c9b08dc8d71bd655e5648daf8a09ff4b728cae81Timo Sirainen for (modp = ap_top_module; modp; modp = modp->next) {
c9b08dc8d71bd655e5648daf8a09ff4b728cae81Timo Sirainen ap_rprintf(r, "<a href=\"#%s\">%s</a>", modp->name,
c9b08dc8d71bd655e5648daf8a09ff4b728cae81Timo Sirainen modp->name);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen if (modp->next) {
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen ap_rputs(", ", r);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen }
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen }
c9b08dc8d71bd655e5648daf8a09ff4b728cae81Timo Sirainen ap_rputs("</tt></dt></dl><hr />", r);
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen }
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen if (!r->args || !strcasecmp(r->args, "server")) {
c9b08dc8d71bd655e5648daf8a09ff4b728cae81Timo Sirainen show_server_settings(r);
c9b08dc8d71bd655e5648daf8a09ff4b728cae81Timo Sirainen }
ce28adabf2c47d3af9ef197787cdb5139424c69cTimo Sirainen
c9b08dc8d71bd655e5648daf8a09ff4b728cae81Timo Sirainen if (!r->args || !strcasecmp(r->args, "hooks")) {
c9b08dc8d71bd655e5648daf8a09ff4b728cae81Timo Sirainen show_active_hooks(r);
c9b08dc8d71bd655e5648daf8a09ff4b728cae81Timo Sirainen }
c9b08dc8d71bd655e5648daf8a09ff4b728cae81Timo Sirainen
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen if (r->args && 0 == strcasecmp(r->args, "config")) {
c9b08dc8d71bd655e5648daf8a09ff4b728cae81Timo Sirainen ap_rputs("<dl><dt><strong>Configuration:</strong>\n", r);
c9b08dc8d71bd655e5648daf8a09ff4b728cae81Timo Sirainen mod_info_module_cmds(r, NULL, ap_conftree, 0, 0);
c9b08dc8d71bd655e5648daf8a09ff4b728cae81Timo Sirainen ap_rputs("</dl><hr />", r);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen }
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen else {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen for (modp = ap_top_module; modp; modp = modp->next) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (!r->args || !strcasecmp(modp->name, r->args)) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rprintf(r,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "<dl><dt><a name=\"%s\"><strong>Module Name:</strong></a> "
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen "<font size=\"+1\"><tt><a href=\"?%s\">%s</a></tt></font></dt>\n",
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen modp->name, modp->name, modp->name);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen ap_rputs("<dt><strong>Content handlers:</strong> ", r);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen if (module_find_hook(modp, ap_hook_get_handler)) {
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen ap_rputs("<tt> <em>yes</em></tt>", r);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen }
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen else {
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen ap_rputs("<tt> <em>none</em></tt>", r);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen }
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen ap_rputs("</dt>", r);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen ap_rputs
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen ("<dt><strong>Configuration Phase Participation:</strong>\n",
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen r);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen if (modp->create_dir_config) {
8d63b0ab4dea920a4dd6a4469289950eef50a063Timo Sirainen if (comma) {
8d63b0ab4dea920a4dd6a4469289950eef50a063Timo Sirainen ap_rputs(", ", r);
8d63b0ab4dea920a4dd6a4469289950eef50a063Timo Sirainen }
8d63b0ab4dea920a4dd6a4469289950eef50a063Timo Sirainen ap_rputs("<tt>Create Directory Config</tt>", r);
8d63b0ab4dea920a4dd6a4469289950eef50a063Timo Sirainen comma = 1;
8d63b0ab4dea920a4dd6a4469289950eef50a063Timo Sirainen }
8d63b0ab4dea920a4dd6a4469289950eef50a063Timo Sirainen if (modp->merge_dir_config) {
8d63b0ab4dea920a4dd6a4469289950eef50a063Timo Sirainen if (comma) {
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen ap_rputs(", ", r);
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen }
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen ap_rputs("<tt>Merge Directory Configs</tt>", r);
8d63b0ab4dea920a4dd6a4469289950eef50a063Timo Sirainen comma = 1;
8d63b0ab4dea920a4dd6a4469289950eef50a063Timo Sirainen }
8d63b0ab4dea920a4dd6a4469289950eef50a063Timo Sirainen if (modp->create_server_config) {
8d63b0ab4dea920a4dd6a4469289950eef50a063Timo Sirainen if (comma) {
8d63b0ab4dea920a4dd6a4469289950eef50a063Timo Sirainen ap_rputs(", ", r);
cf9d67e4a9bfee31cf3be05244555d51a3d1b9feTimo Sirainen }
8d63b0ab4dea920a4dd6a4469289950eef50a063Timo Sirainen ap_rputs("<tt>Create Server Config</tt>", r);
8d63b0ab4dea920a4dd6a4469289950eef50a063Timo Sirainen comma = 1;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen }
8d63b0ab4dea920a4dd6a4469289950eef50a063Timo Sirainen if (modp->merge_server_config) {
8d63b0ab4dea920a4dd6a4469289950eef50a063Timo Sirainen if (comma) {
8d63b0ab4dea920a4dd6a4469289950eef50a063Timo Sirainen ap_rputs(", ", r);
8d63b0ab4dea920a4dd6a4469289950eef50a063Timo Sirainen }
8d63b0ab4dea920a4dd6a4469289950eef50a063Timo Sirainen ap_rputs("<tt>Merge Server Configs</tt>", r);
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainen comma = 1;
8d63b0ab4dea920a4dd6a4469289950eef50a063Timo Sirainen }
8d63b0ab4dea920a4dd6a4469289950eef50a063Timo Sirainen if (!comma)
8d63b0ab4dea920a4dd6a4469289950eef50a063Timo Sirainen ap_rputs("<tt> <em>none</em></tt>", r);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen comma = 0;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen ap_rputs("</dt>", r);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen module_request_hook_participate(r, modp);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen cmd = modp->cmds;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen if (cmd) {
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen ap_rputs
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen ("<dt><strong>Module Directives:</strong></dt>",
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen r);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen while (cmd) {
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen if (cmd->name) {
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen ap_rprintf(r, "<dd><tt>%s%s - <i>",
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen ap_escape_html(r->pool, cmd->name),
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen cmd->name[0] == '<' ? "&gt;" : "");
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen if (cmd->errmsg) {
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen ap_rputs(ap_escape_html(r->pool, cmd->errmsg), r);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen }
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen ap_rputs("</i></tt></dd>\n", r);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen }
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen else {
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen break;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen }
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen cmd++;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen }
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen ap_rputs
c1b9c4531186c6a7cd92d2c353273a834f8ee66fTimo Sirainen ("<dt><strong>Current Configuration:</strong></dt>\n",
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen r);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen mod_info_module_cmds(r, modp->cmds, ap_conftree, 0,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen 0);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen }
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen else {
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen ap_rputs
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen ("<dt><strong>Module Directives:</strong> <tt>none</tt></dt>",
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen r);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen }
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen more_info = find_more_info(serv, modp->name);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen if (more_info) {
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen ap_rputs
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen ("<dt><strong>Additional Information:</strong>\n</dt><dd>",
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen r);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen ap_rputs(more_info, r);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen ap_rputs("</dd>", r);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen }
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen ap_rputs("</dl><hr />\n", r);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen if (r->args) {
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen break;
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen }
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen }
d3211a8014c08677e1c1bbd84e98ad51b5744448Timo Sirainen }
d3211a8014c08677e1c1bbd84e98ad51b5744448Timo Sirainen if (!modp && r->args && strcasecmp(r->args, "server")) {
d3211a8014c08677e1c1bbd84e98ad51b5744448Timo Sirainen ap_rputs("<p><b>No such module</b></p>\n", r);
38eee54ced2034a4772958f96a737bd368d5e5e0Timo Sirainen }
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen }
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen }
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen else {
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen ap_rputs("<dl><dt>Server Module List</dt>", r);
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen for (modp = ap_top_module; modp; modp = modp->next) {
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen ap_rputs("<dd>", r);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen ap_rputs(modp->name, r);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen ap_rputs("</dd>", r);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen }
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen ap_rputs("</dl><hr />", r);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen }
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen ap_rputs(ap_psignature("", r), r);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen ap_rputs("</body></html>\n", r);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen /* Done, turn off timeout, close file and return */
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen return 0;
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen}
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainenstatic const char *add_module_info(cmd_parms * cmd, void *dummy,
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen const char *name, const char *info)
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen{
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen server_rec *s = cmd->server;
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen info_svr_conf *conf =
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen (info_svr_conf *) ap_get_module_config(s->module_config,
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen &info_module);
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen info_entry *new = apr_array_push(conf->more_info);
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen new->name = name;
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen new->info = info;
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen return NULL;
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen}
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainenstatic const command_rec info_cmds[] = {
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen AP_INIT_TAKE2("AddModuleInfo", add_module_info, NULL, RSRC_CONF,
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen "a module name and additional information on that module"),
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen {NULL}
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen};
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainenstatic void register_hooks(apr_pool_t * p)
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen{
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen ap_hook_handler(display_info, NULL, NULL, APR_HOOK_MIDDLE);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen}
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainenmodule AP_MODULE_DECLARE_DATA info_module = {
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen STANDARD20_MODULE_STUFF,
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen NULL, /* dir config creater */
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen NULL, /* dir merger --- default is to override */
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen create_info_config, /* server config */
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen merge_info_config, /* merge server config */
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen info_cmds, /* command apr_table_t */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen register_hooks
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen};
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen