mod_status.c revision 0f113d7123e8bd3e3e2e9b6373461a1a773bfcca
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding/* ====================================================================
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * The Apache Software License, Version 1.1
b99dbaab171d91e1b664397cc40e039d0c087c65fielding * Copyright (c) 2000-2001 The Apache Software Foundation. All rights
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * reserved.
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * Redistribution and use in source and binary forms, with or without
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * modification, are permitted provided that the following conditions
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * 1. Redistributions of source code must retain the above copyright
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * notice, this list of conditions and the following disclaimer.
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * 2. Redistributions in binary form must reproduce the above copyright
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * notice, this list of conditions and the following disclaimer in
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * the documentation and/or other materials provided with the
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * distribution.
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * 3. The end-user documentation included with the redistribution,
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * if any, must include the following acknowledgment:
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * "This product includes software developed by the
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * Apache Software Foundation (http://www.apache.org/)."
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * Alternately, this acknowledgment may appear in the software itself,
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * if and wherever such third-party acknowledgments normally appear.
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * 4. The names "Apache" and "Apache Software Foundation" must
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * not be used to endorse or promote products derived from this
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * software without prior written permission. For written
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * permission, please contact apache@apache.org.
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * 5. Products derived from this software may not be called "Apache",
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * nor may "Apache" appear in their name, without prior written
64185f9824e42f21ca7b9ae6c004484215c031a7rbb * permission of the Apache Software Foundation.
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * SUCH DAMAGE.
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * ====================================================================
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * This software consists of voluntary contributions made by many
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * individuals on behalf of the Apache Software Foundation. For more
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * information on the Apache Software Foundation, please see
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * Portions of this software are based upon public domain software
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * originally written at the National Center for Supercomputing Applications,
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * University of Illinois, Urbana-Champaign.
3568de757bac0b47256647504c186d17ca272f85rbb/* Status Module. Display lots of internal data about how Apache is
3568de757bac0b47256647504c186d17ca272f85rbb * performing and the state of all children processes.
3568de757bac0b47256647504c186d17ca272f85rbb * To enable this, add the following lines into any config file:
3568de757bac0b47256647504c186d17ca272f85rbb * <Location /server-status>
3568de757bac0b47256647504c186d17ca272f85rbb * SetHandler server-status
3568de757bac0b47256647504c186d17ca272f85rbb * </Location>
3568de757bac0b47256647504c186d17ca272f85rbb * You may want to protect this location by password or domain so no one
3568de757bac0b47256647504c186d17ca272f85rbb * else can look at it. Then you can access the statistics with a URL like:
3568de757bac0b47256647504c186d17ca272f85rbb * /server-status - Returns page using tables
3568de757bac0b47256647504c186d17ca272f85rbb * /server-status?notable - Returns page for browsers without table support
3568de757bac0b47256647504c186d17ca272f85rbb * /server-status?refresh - Returns page with 1 second refresh
3568de757bac0b47256647504c186d17ca272f85rbb * /server-status?refresh=6 - Returns page with refresh every 6 seconds
3568de757bac0b47256647504c186d17ca272f85rbb * /server-status?auto - Returns page with data for automatic parsing
3568de757bac0b47256647504c186d17ca272f85rbb * Mark Cox, mark@ukweb.com, November 1995
3568de757bac0b47256647504c186d17ca272f85rbb * 12.11.95 Initial version for www.telescope.org
3568de757bac0b47256647504c186d17ca272f85rbb * 13.3.96 Updated to remove rprintf's [Mark]
3568de757bac0b47256647504c186d17ca272f85rbb * 18.3.96 Added CPU usage, process information, and tidied [Ben Laurie]
3568de757bac0b47256647504c186d17ca272f85rbb * 18.3.96 Make extra Scoreboard variables #definable
3568de757bac0b47256647504c186d17ca272f85rbb * 25.3.96 Make short report have full precision [Ben Laurie suggested]
3568de757bac0b47256647504c186d17ca272f85rbb * 25.3.96 Show uptime better [Mark/Ben Laurie]
3568de757bac0b47256647504c186d17ca272f85rbb * 29.3.96 Better HTML and explanation [Mark/Rob Hartill suggested]
3568de757bac0b47256647504c186d17ca272f85rbb * 09.4.96 Added message for non-STATUS compiled version
3568de757bac0b47256647504c186d17ca272f85rbb * 18.4.96 Added per child and per slot counters [Jim Jagielski]
3568de757bac0b47256647504c186d17ca272f85rbb * 01.5.96 Table format, cleanup, even more spiffy data [Chuck Murcko/Jim J.]
3568de757bac0b47256647504c186d17ca272f85rbb * 18.5.96 Adapted to use new rprintf() routine, incidentally fixing a missing
3568de757bac0b47256647504c186d17ca272f85rbb * piece in short reports [Ben Laurie]
3568de757bac0b47256647504c186d17ca272f85rbb * 21.5.96 Additional Status codes (DNS and LOGGING only enabled if
3568de757bac0b47256647504c186d17ca272f85rbb * extended STATUS is enabled) [George Burgyan/Jim J.]
3568de757bac0b47256647504c186d17ca272f85rbb * 10.8.98 Allow for extended status info at runtime (no more STATUS)
3568de757bac0b47256647504c186d17ca272f85rbb * [Jim J.]
3568de757bac0b47256647504c186d17ca272f85rbb#endif /* NEXT */
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define DEFAULT_TIME_FORMAT "%A, %d-%b-%Y %H:%M:%S %Z"
3568de757bac0b47256647504c186d17ca272f85rbb *command-related code. This is here to prevent use of ExtendedStatus
3568de757bac0b47256647504c186d17ca272f85rbb * without status_module included.
3568de757bac0b47256647504c186d17ca272f85rbbstatic const char *set_extended_status(cmd_parms *cmd, void *dummy, int arg)
3568de757bac0b47256647504c186d17ca272f85rbb const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
3568de757bac0b47256647504c186d17ca272f85rbb AP_INIT_FLAG("ExtendedStatus", set_extended_status, NULL, RSRC_CONF,
3568de757bac0b47256647504c186d17ca272f85rbb "\"On\" to enable extended status information, \"Off\" to disable"),
3568de757bac0b47256647504c186d17ca272f85rbb/* Format the number of bytes nicely */
3568de757bac0b47256647504c186d17ca272f85rbbstatic void format_byte_out(request_rec *r, unsigned long bytes)
3568de757bac0b47256647504c186d17ca272f85rbbstatic void format_kbyte_out(request_rec *r, unsigned long kbytes)
78ae889ffe0fdfab72f56c6993b0f302cb48da55rbbstatic void show_time(request_rec *r, apr_interval_time_t tsecs)
fc1efab92032301e317f07e1b3a00082d9d71f3frbb ap_rprintf(r, " %d minute%s", mins, mins == 1 ? "" : "s");
fc1efab92032301e317f07e1b3a00082d9d71f3frbb ap_rprintf(r, " %d second%s", secs, secs == 1 ? "" : "s");
3568de757bac0b47256647504c186d17ca272f85rbb/* Main handler for x-httpd-status requests */
3568de757bac0b47256647504c186d17ca272f85rbb/* ID values for command table */
3568de757bac0b47256647504c186d17ca272f85rbb const char *form_data_str;
3568de757bac0b47256647504c186d17ca272f85rbb const char *hdr_out_str;
3568de757bac0b47256647504c186d17ca272f85rbbstatic const struct stat_opt status_options[] = /* see #defines above */
3568de757bac0b47256647504c186d17ca272f85rbb const char *loc;
3568de757bac0b47256647504c186d17ca272f85rbb int j, i, res;
3568de757bac0b47256647504c186d17ca272f85rbb unsigned long count = 0;
3568de757bac0b47256647504c186d17ca272f85rbb unsigned short conn_lres;
3568de757bac0b47256647504c186d17ca272f85rbb unsigned long bcount = 0;
3568de757bac0b47256647504c186d17ca272f85rbb unsigned long kbcount = 0;
3568de757bac0b47256647504c186d17ca272f85rbb char stat_buffer[HARD_SERVER_LIMIT * HARD_THREAD_LIMIT];
0f113d7123e8bd3e3e2e9b6373461a1a773bfccatrawick pid_t pid_buffer[HARD_SERVER_LIMIT * HARD_THREAD_LIMIT];
ca53a74f4012a45cbad48e940eddf27d866981f9dougm if (strcmp(r->handler, STATUS_MAGIC_TYPE) && strcmp(r->handler, "server-status")) {
3568de757bac0b47256647504c186d17ca272f85rbb ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, r,
3568de757bac0b47256647504c186d17ca272f85rbb "Server status unavailable in inetd mode");
3568de757bac0b47256647504c186d17ca272f85rbb * Simple table-driven form data set parser that lets you alter the header
3568de757bac0b47256647504c186d17ca272f85rbb if ((loc = ap_strstr_c(r->args, status_options[i].form_data_str)) != NULL) {
3568de757bac0b47256647504c186d17ca272f85rbb if (*(loc + strlen(status_options[i].form_data_str)) == '='
5a58a10705b7b154b53294e0c0283d64eabdcb7fstoddard/* ap_sync_scoreboard_image(); */
3568de757bac0b47256647504c186d17ca272f85rbb for (i = 0; i < HARD_SERVER_LIMIT; ++i) {
3568de757bac0b47256647504c186d17ca272f85rbb for (j = 0; j < HARD_THREAD_LIMIT; ++j) {
3568de757bac0b47256647504c186d17ca272f85rbb if (lres != 0 || (res != SERVER_READY && res != SERVER_DEAD)) {
ad83978f20c7d1a4323059d9af122e56fcd353bdstoddard#endif /* HAVE_TIMES */
74fd6d9aeadb9022086259c5c1ae00bc0dda9c9astoddard /* up_time in seconds */
0f113d7123e8bd3e3e2e9b6373461a1a773bfccatrawick up_time = (apr_uint32_t) ((nowtime - ap_restart_time)/APR_USEC_PER_SEC);
3568de757bac0b47256647504c186d17ca272f85rbb "<HTML><HEAD>\n<TITLE>Apache Status</TITLE>\n</HEAD><BODY>\n",
3568de757bac0b47256647504c186d17ca272f85rbb ap_ht_time(r->pool, nowtime, DEFAULT_TIME_FORMAT, 0), "<br>\n", NULL);
3568de757bac0b47256647504c186d17ca272f85rbb ap_ht_time(r->pool, ap_restart_time, DEFAULT_TIME_FORMAT, 0),
3568de757bac0b47256647504c186d17ca272f85rbb ap_rprintf(r, "Parent Server Generation: %d <br>\n", (int) ap_my_generation);
3568de757bac0b47256647504c186d17ca272f85rbb ap_rprintf(r, "Total Accesses: %lu\nTotal kBytes: %lu\n",
3568de757bac0b47256647504c186d17ca272f85rbb /* Allow for OS/2 not having CPU stats */
3568de757bac0b47256647504c186d17ca272f85rbb else { /* !short_report */
3568de757bac0b47256647504c186d17ca272f85rbb ap_rprintf(r, "Total accesses: %lu - Total Traffic: ", count);
3568de757bac0b47256647504c186d17ca272f85rbb /* Allow for OS/2 not having CPU stats */
3568de757bac0b47256647504c186d17ca272f85rbb format_byte_out(r, KBYTE * (float) kbcount / (float) up_time);
3568de757bac0b47256647504c186d17ca272f85rbb if (count > 0) {
3568de757bac0b47256647504c186d17ca272f85rbb format_byte_out(r, KBYTE * (float) kbcount / (float) count);
3568de757bac0b47256647504c186d17ca272f85rbb } /* short_report */
3568de757bac0b47256647504c186d17ca272f85rbb } /* ap_extended_status */
3568de757bac0b47256647504c186d17ca272f85rbb ap_rprintf(r, "\n%d requests currently being processed, %d idle servers\n"
3568de757bac0b47256647504c186d17ca272f85rbb ap_rprintf(r, "BusyServers: %d\nIdleServers: %d\n", busy, ready);
3568de757bac0b47256647504c186d17ca272f85rbb /* send the scoreboard 'table' out */
3568de757bac0b47256647504c186d17ca272f85rbb for (i = 0; i < HARD_SERVER_LIMIT; ++i) {
3568de757bac0b47256647504c186d17ca272f85rbb for (j = 0; j < HARD_THREAD_LIMIT; ++j) {
3568de757bac0b47256647504c186d17ca272f85rbb if ((indx % STATUS_MAXLINE == (STATUS_MAXLINE - 1)) && !short_report)
3568de757bac0b47256647504c186d17ca272f85rbb ap_rputs("\"<B><code>_</code></B>\" Waiting for Connection, \n", r);
3568de757bac0b47256647504c186d17ca272f85rbb ap_rputs("\"<B><code>S</code></B>\" Starting up, \n", r);
3568de757bac0b47256647504c186d17ca272f85rbb ap_rputs("\"<B><code>R</code></B>\" Reading Request,<BR>\n", r);
3568de757bac0b47256647504c186d17ca272f85rbb ap_rputs("\"<B><code>W</code></B>\" Sending Reply, \n", r);
3568de757bac0b47256647504c186d17ca272f85rbb ap_rputs("\"<B><code>K</code></B>\" Keepalive (read), \n", r);
3568de757bac0b47256647504c186d17ca272f85rbb ap_rputs("\"<B><code>D</code></B>\" DNS Lookup,<BR>\n", r);
3568de757bac0b47256647504c186d17ca272f85rbb ap_rputs("\"<B><code>G</code></B>\" Gracefully finishing, \n", r);
ce03576b2434cec77f2921db9d5b6a0510581c23rederpj ap_rputs("\"<B><code>I</code></B>\" Idle cleanup of worker, \n", r);
3568de757bac0b47256647504c186d17ca272f85rbb ap_rputs("\"<B><code>.</code></B>\" Open slot with no current process<P>\n", r);
3568de757bac0b47256647504c186d17ca272f85rbb for (i = 0; i < HARD_SERVER_LIMIT; ++i) {
8e9734d1a4af74c141e2a0f880bb51bb061fa03atrawick for (j = 0; j < HARD_THREAD_LIMIT; ++j) {
8e9734d1a4af74c141e2a0f880bb51bb061fa03atrawick if (++k >= 3) {
3568de757bac0b47256647504c186d17ca272f85rbb /* Allow for OS/2 not having CPU stats */
3568de757bac0b47256647504c186d17ca272f85rbb ap_rputs("<p>\n\n<table border=0><tr><th>Srv<th>PID<th>Acc<th>M\n<th>SS<th>Req<th>Conn<th>Child<th>Slot<th>Client<th>VHost<th>Request</tr>\n\n", r);
3568de757bac0b47256647504c186d17ca272f85rbb ap_rputs("<p>\n\n<table border=0><tr><th>Srv<th>PID<th>Acc<th>M<th>CPU\n<th>SS<th>Req<th>Conn<th>Child<th>Slot<th>Client<th>VHost<th>Request</tr>\n\n", r);
3568de757bac0b47256647504c186d17ca272f85rbb for (i = 0; i < HARD_SERVER_LIMIT; ++i) {
3568de757bac0b47256647504c186d17ca272f85rbb for (j = 0; j < HARD_THREAD_LIMIT; ++j) {
ad83978f20c7d1a4323059d9af122e56fcd353bdstoddard#endif /* HAVE_TIMES */
3568de757bac0b47256647504c186d17ca272f85rbb req_time = score_record.stop_time - score_record.start_time;
ad83978f20c7d1a4323059d9af122e56fcd353bdstoddard#endif /* HAVE_TIMES */
3568de757bac0b47256647504c186d17ca272f85rbb ((score_record.stop_time - score_record.start_time) * 1000) +
3568de757bac0b47256647504c186d17ca272f85rbb ((score_record.stop_time - score_record.start_time) / 1000);
3568de757bac0b47256647504c186d17ca272f85rbb "<b>Server %d-%d</b> (-): %d|%lu|%lu [",
0f113d7123e8bd3e3e2e9b6373461a1a773bfccatrawick "): %d|%lu|%lu [",
3568de757bac0b47256647504c186d17ca272f85rbb /* Allow for OS/2 not having CPU stats */
0f113d7123e8bd3e3e2e9b6373461a1a773bfccatrawick (long)((nowtime - score_record.last_used) / APR_USEC_PER_SEC),
3568de757bac0b47256647504c186d17ca272f85rbb else { /* !no_table_report */
3568de757bac0b47256647504c186d17ca272f85rbb "<tr><td><b>%d-%d</b><td>-<td>%d/%lu/%lu",
0f113d7123e8bd3e3e2e9b6373461a1a773bfccatrawick "<td>%d/%lu/%lu",
3568de757bac0b47256647504c186d17ca272f85rbb /* Allow for OS/2 not having CPU stats */
0f113d7123e8bd3e3e2e9b6373461a1a773bfccatrawick (long)((nowtime - score_record.last_used) / APR_USEC_PER_SEC),
3568de757bac0b47256647504c186d17ca272f85rbb "<td>?<td nowrap>?<td nowrap>..reading.. </tr>\n\n");
3568de757bac0b47256647504c186d17ca272f85rbb "<td>%s<td nowrap>%s<td nowrap>%s</tr>\n\n",
3568de757bac0b47256647504c186d17ca272f85rbb } /* no_table_report */
3568de757bac0b47256647504c186d17ca272f85rbb } /* !short_report */
3568de757bac0b47256647504c186d17ca272f85rbb } /* if (<active child>) */
3568de757bac0b47256647504c186d17ca272f85rbb } /* for () */
3568de757bac0b47256647504c186d17ca272f85rbb<table>\n \
3568de757bac0b47256647504c186d17ca272f85rbb<tr><th>Srv<td>Child Server number - generation\n \
3568de757bac0b47256647504c186d17ca272f85rbb<tr><th>PID<td>OS process ID\n \
3568de757bac0b47256647504c186d17ca272f85rbb<tr><th>Acc<td>Number of accesses this connection / this child / this slot\n \
3568de757bac0b47256647504c186d17ca272f85rbb<tr><th>M<td>Mode of operation\n \
3568de757bac0b47256647504c186d17ca272f85rbb<tr><th>SS<td>Seconds since beginning of most recent request\n \
3568de757bac0b47256647504c186d17ca272f85rbb<tr><th>Req<td>Milliseconds required to process most recent request\n \
3568de757bac0b47256647504c186d17ca272f85rbb<tr><th>Conn<td>Kilobytes transferred this connection\n \
3568de757bac0b47256647504c186d17ca272f85rbb<tr><th>Child<td>Megabytes transferred this child\n \
3568de757bac0b47256647504c186d17ca272f85rbb<tr><th>Slot<td>Total megabytes transferred this slot\n \
3568de757bac0b47256647504c186d17ca272f85rbb</table>\n", r);
3568de757bac0b47256647504c186d17ca272f85rbb<table>\n \
3568de757bac0b47256647504c186d17ca272f85rbb<tr><th>Srv<td>Child Server number - generation\n \
3568de757bac0b47256647504c186d17ca272f85rbb<tr><th>PID<td>OS process ID\n \
3568de757bac0b47256647504c186d17ca272f85rbb<tr><th>Acc<td>Number of accesses this connection / this child / this slot\n \
3568de757bac0b47256647504c186d17ca272f85rbb<tr><th>M<td>Mode of operation\n \
3568de757bac0b47256647504c186d17ca272f85rbb<tr><th>CPU<td>CPU usage, number of seconds\n \
3568de757bac0b47256647504c186d17ca272f85rbb<tr><th>SS<td>Seconds since beginning of most recent request\n \
3568de757bac0b47256647504c186d17ca272f85rbb<tr><th>Req<td>Milliseconds required to process most recent request\n \
3568de757bac0b47256647504c186d17ca272f85rbb<tr><th>Conn<td>Kilobytes transferred this connection\n \
3568de757bac0b47256647504c186d17ca272f85rbb<tr><th>Child<td>Megabytes transferred this child\n \
3568de757bac0b47256647504c186d17ca272f85rbb<tr><th>Slot<td>Total megabytes transferred this slot\n \
3568de757bac0b47256647504c186d17ca272f85rbb</table>\n", r);
3568de757bac0b47256647504c186d17ca272f85rbb ap_rputs("<hr>To obtain a full report with current status information ", r);
3568de757bac0b47256647504c186d17ca272f85rbb ap_rputs("you need to use the <code>ExtendedStatus On</code> directive. \n", r);
3568de757bac0b47256647504c186d17ca272f85rbbstatic void status_init(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s)
3568de757bac0b47256647504c186d17ca272f85rbb status_flags[SERVER_DEAD] = '.'; /* We don't want to assume these are in */
3568de757bac0b47256647504c186d17ca272f85rbb status_flags[SERVER_READY] = '_'; /* any particular order in scoreboard.h */
b980ad7fdc218b4855cde9f75a747527f50c554dwrowe ap_hook_handler(status_handler, NULL, NULL, APR_HOOK_MIDDLE);