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
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 * Info Module. Display configuration information for the server and
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen * all included modules.
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen * <Location /server-info>
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen * SetHandler server-info
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen * </Location>
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 * Original Author:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen * Rasmus Lerdorf <rasmus vex.net>, May 1996
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen * Modified By:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen * Lou Langholtz <ldl usi.utah.edu>, July 1997
9522aa5f33cc37fe8ccd0d647cc51dd3ba6a9b55Timo Sirainen * Apache 2.0 Port:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen * Ryan Morgan <rmorgan covalent.net>, August 2000
fe7f9298fb789717d26dc4cb6317a9d376acd8fcTimo Sirainentypedef struct
f64b5bc9e73bedc63ba3c072c286542c29c69e43Timo Sirainentypedef struct
468c28dfb03613ab8d487b5aebc985a969193aceTimo Sirainenstatic void *create_info_config(apr_pool_t * p, server_rec * s)
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen (info_svr_conf *) apr_pcalloc(p, sizeof(info_svr_conf));
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen conf->more_info = apr_array_make(p, 20, sizeof(info_entry));
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainenstatic void *merge_info_config(apr_pool_t * p, void *basev, void *overridesv)
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;
ee3362f3b78827a2c9a7e9ddee83f5a429c06213Timo Sirainen apr_array_append(p, overrides->more_info, base->more_info);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic void put_int_flush_right(request_rec * r, int i, int field)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic void mod_info_indent(request_rec * r, int nest,
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen const char *prevfn =
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_get_module_config(r->request_config, &info_module);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (prevfn == NULL || 0 != strcmp(prevfn, thisfn)) {
8d63b0ab4dea920a4dd6a4469289950eef50a063Timo Sirainen ap_rprintf(r, "<dd><tt><strong>In file: %s</strong></tt></dd>\n",
03fa2d644be0a9274e7e94fb4835cc374c539264Timo Sirainen ap_set_module_config(r->request_config, &info_module,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen put_int_flush_right(r, linenum > 0 ? linenum : 0, 4);
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainenstatic void mod_info_show_cmd(request_rec * r, const ap_directive_t * dir,
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen mod_info_indent(r, nest, dir->filename, dir->line_num);
4847d74a7442a3efabe76a8ad18dd464082d6581Timo Sirainenstatic void mod_info_show_open(request_rec * r, const ap_directive_t * dir,
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen mod_info_indent(r, nest, dir->filename, dir->line_num);
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainenstatic void mod_info_show_close(request_rec * r, const ap_directive_t * dir,
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_rprintf(r, "/%s</tt></dd>", ap_escape_html(r->pool, dirname));
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainenstatic int mod_info_has_cmd(const command_rec * cmds, ap_directive_t * dir)
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen if (strcasecmp(cmd->name, dir->directive) == 0)
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainenstatic void mod_info_show_parents(request_rec * r, ap_directive_t * node,
6cb8e7d726a7e9d157e87fb379982d52100b283fTimo Sirainen mod_info_show_parents(r, node->parent, from, to - 1);
6cb8e7d726a7e9d157e87fb379982d52100b283fTimo Sirainenstatic int mod_info_module_cmds(request_rec * r, const command_rec * cmds,
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_set_module_config(r->request_config, &info_module, NULL);
6cb8e7d726a7e9d157e87fb379982d52100b283fTimo Sirainen if (level < mod_info_module_cmds(r, cmds, dir->first_child,
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen mod_info_show_parents(r, dir->parent, shown, level - 1);
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 *const *aszPredecessors;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen const char *const *aszSuccessors;
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 Sirainentypedef struct
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},
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 {"Translate Name", ap_hook_get_translate_name},
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen {"Map to Storage", ap_hook_get_map_to_storage},
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen {"Verify User ID", ap_hook_get_check_user_id},
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen {"Verify User Access", ap_hook_get_auth_checker},
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen {"Insert Filters", ap_hook_get_insert_filter},
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen {"Insert Errors", ap_hook_get_insert_error_filter},
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainenstatic int module_find_hook(module * modp, hook_get_t hook_get)
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen if (strcmp(elts[i].szName, modp->name) == 0) {
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainenstatic void module_participate(request_rec * r,
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_rvputs(r, "<tt>", lookup->name, "</tt>", NULL);
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainenstatic void module_request_hook_participate(request_rec * r, module * modp)
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_rputs("<dt><strong>Request Phase Participation:</strong>\n", r);
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen module_participate(r, modp, &request_hooks[i], &comma);
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainenstatic const char *find_more_info(server_rec * s, const char *module_name)
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen (info_svr_conf *) ap_get_module_config(s->module_config,
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen info_entry *entry = (info_entry *) conf->more_info->elts;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen for (i = 0; i < conf->more_info->nelts; i++) {
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainenstatic int show_server_settings(request_rec * r)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rputs("<h2><a name=\"server\">Server Settings</a></h2>", r);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "<dl><dt><strong>Server Version:</strong> "
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "<font size=\"+1\"><tt>%s</tt></font></dt>\n",
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "<dt><strong>Server Built:</strong> "
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "<font size=\"+1\"><tt>%s</tt></font></dt>\n",
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "<dt><strong>Module Magic Number:</strong> "
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "<tt>%d:%d</tt></dt>\n", MODULE_MAGIC_NUMBER_MAJOR,
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen "<dt><strong>Hostname/port:</strong> "
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "<tt>%s:%u</tt></dt>\n", ap_get_server_name(r),
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen "<dt><strong>Timeouts:</strong> "
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen "<tt>connection: %d "
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen "keep-alive: %d</tt></dt>",
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_mpm_query(AP_MPMQ_MAX_DAEMON_USED, &max_daemons);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rprintf(r, "<dt><strong>MPM Name:</strong> <tt>%s</tt></dt>\n",
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");
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen "<dt><strong>Server Architecture:</strong> "
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen "<tt>%ld-bit</tt></dt>\n", 8 * (long) sizeof(void *));
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen "<dt><strong>Server Root:</strong> "
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "<dt><strong>Config File:</strong> "
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_rputs("<dt><strong>Server Built With:</strong>\n"
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen "<tt style=\"white-space: pre;\">\n", r);
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen /* TODO: Not all of these defines are getting set like they do in main.c.
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen * Missing some headers?
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_rputs(" -D SECURITY_HOLE_PASS_AUTHORIZATION\n", r);
ce28adabf2c47d3af9ef197787cdb5139424c69cTimo Sirainen ap_rputs(" -D APACHE_MPM_DIR=\"" APACHE_MPM_DIR "\"\n", r);
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ap_rputs(" -D APR_HAVE_IPV6 (IPv4-mapped addresses ", r);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rputs(" -D APR_USE_SYSVSEM_SERIALIZE\n", r);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rputs(" -D APR_USE_POSIXSEM_SERIALIZE\n", r);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rputs(" -D APR_USE_PROC_PTHREAD_SERIALIZE\n", r);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen ap_rputs(" -D APR_PROCESS_LOCK_IS_GLOBAL\n", r);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen ap_rputs(" -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT\n", r);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen ap_rputs(" -D AP_HAVE_RELIABLE_PIPED_LOGS\n", r);
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen ap_rputs(" -D PIPE_BUF=%ld\n", (long) PIPE_BUF, r);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen/* This list displays the compiled in default paths: */
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainen ap_rputs(" -D HTTPD_ROOT=\"" HTTPD_ROOT "\"\n", r);
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainen ap_rputs(" -D SUEXEC_BIN=\"" SUEXEC_BIN "\"\n", r);
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 ap_rputs(" -D DEFAULT_PIDLOG=\"" DEFAULT_PIDLOG "\"\n", r);
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainen ap_rputs(" -D DEFAULT_SCOREBOARD=\"" DEFAULT_SCOREBOARD "\"\n", r);
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainen ap_rputs(" -D DEFAULT_LOCKFILE=\"" DEFAULT_LOCKFILE "\"\n", r);
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainen ap_rputs(" -D DEFAULT_ERRORLOG=\"" DEFAULT_ERRORLOG "\"\n", r);
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainen ap_rputs(" -D AP_TYPES_CONFIG_FILE=\"" AP_TYPES_CONFIG_FILE "\"\n", r);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen ap_rputs(" -D SERVER_CONFIG_FILE=\"" SERVER_CONFIG_FILE "\"\n", r);
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainenstatic int dump_a_hook(request_rec * r, hook_get_t hook_get)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (r->args && strcasecmp(r->args, "hooks") == 0) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen " %02d <a href=\"%c%s\">%s</a> <br/>",
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen elts[i].nOrder, qs, elts[i].szName, elts[i].szName);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ap_rputs("<h2><a name=\"startup_hooks\">Startup Hooks</a></h2>\n<dl>", r);
cf9d67e4a9bfee31cf3be05244555d51a3d1b9feTimo Sirainen ap_rprintf(r, "<dt><strong>%s:</strong>\n <br /><tt>\n",
e34d170f8f0e084bd94bfbc1a7085ece67e508dfTimo Sirainen ("</dl>\n<hr />\n<h2><a name=\"request_hooks\">Request Hooks</a></h2>\n<dl>",
8621be3846dc097420cce325ad36d1b646f72a09Timo Sirainen ap_rprintf(r, "<dt><strong>%s:</strong>\n <br /><tt>\n",
4f2b533808371b3b8a8187819cd4c3d90e1ca8eeTimo Sirainen "<html xmlns=\"http://www.w3.org/1999/xhtml\">\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")) {
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("<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("<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,
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen if (!r->args || !strcasecmp(r->args, "server")) {
c9b08dc8d71bd655e5648daf8a09ff4b728cae81Timo Sirainen if (!r->args || !strcasecmp(r->args, "hooks")) {
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);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen for (modp = ap_top_module; modp; modp = modp->next) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (!r->args || !strcasecmp(modp->name, r->args)) {
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 ap_rputs("<dt><strong>Content handlers:</strong> ", r);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen if (module_find_hook(modp, ap_hook_get_handler)) {
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen ("<dt><strong>Configuration Phase Participation:</strong>\n",
8d63b0ab4dea920a4dd6a4469289950eef50a063Timo Sirainen ap_rputs("<tt>Create Directory Config</tt>", r);
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen ap_rputs("<tt>Merge Directory Configs</tt>", r);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen ("<dt><strong>Module Directives:</strong></dt>",
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen ap_rputs(ap_escape_html(r->pool, cmd->errmsg), r);
c1b9c4531186c6a7cd92d2c353273a834f8ee66fTimo Sirainen ("<dt><strong>Current Configuration:</strong></dt>\n",
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen mod_info_module_cmds(r, modp->cmds, ap_conftree, 0,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen ("<dt><strong>Module Directives:</strong> <tt>none</tt></dt>",
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen ("<dt><strong>Additional Information:</strong>\n</dt><dd>",
d3211a8014c08677e1c1bbd84e98ad51b5744448Timo Sirainen if (!modp && r->args && strcasecmp(r->args, "server")) {
d3211a8014c08677e1c1bbd84e98ad51b5744448Timo Sirainen ap_rputs("<p><b>No such module</b></p>\n", r);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen ap_rputs("<dl><dt>Server Module List</dt>", r);
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen for (modp = ap_top_module; modp; modp = modp->next) {
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen /* Done, turn off timeout, close file and return */
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainenstatic const char *add_module_info(cmd_parms * cmd, void *dummy,
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen (info_svr_conf *) ap_get_module_config(s->module_config,
c6a5305674d2aa59ee52dc101ef87bbcb04f04efTimo Sirainen info_entry *new = apr_array_push(conf->more_info);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen AP_INIT_TAKE2("AddModuleInfo", add_module_info, NULL, RSRC_CONF,
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen "a module name and additional information on that module"),
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen ap_hook_handler(display_info, NULL, NULL, APR_HOOK_MIDDLE);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen NULL, /* dir merger --- default is to override */