jim         98/08/10 17:09:49

  Modified:    src      CHANGES Configuration.tmpl
               src/include http_conf_globals.h scoreboard.h
               src/main http_config.c http_core.c http_main.c
                        http_request.c
               src/modules/standard mod_status.c
  Log:
  Make "extended" status information (which used to be compile-time by
  defining STATUS) now run-time using the ExtendedStatus directive. Docs
  to be changed soon.
  
  Revision  Changes    Path
  1.1017    +4 -0      apache-1.3/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/CHANGES,v
  retrieving revision 1.1016
  retrieving revision 1.1017
  diff -u -r1.1016 -r1.1017
  --- CHANGES   1998/08/10 17:11:16     1.1016
  +++ CHANGES   1998/08/11 00:09:41     1.1017
  @@ -1,5 +1,9 @@
   Changes with Apache 1.3.2
   
  +  *) STATUS is no longer available. Full status information now
  +     run-time configurable using the ExtendedStatus directive.
  +     [Jim Jagielski]
  +
     *) SECURITY: Eliminate O(n^2) space DoS attacks (and other O(n^2)
        cpu time attacks) in header parsing.  [Dean Gaudet]
   
  
  
  
  1.109     +3 -10     apache-1.3/src/Configuration.tmpl
  
  Index: Configuration.tmpl
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/Configuration.tmpl,v
  retrieving revision 1.108
  retrieving revision 1.109
  diff -u -r1.108 -r1.109
  --- Configuration.tmpl        1998/08/03 08:44:03     1.108
  +++ Configuration.tmpl        1998/08/11 00:09:42     1.109
  @@ -118,7 +118,7 @@
   # functions. The format is: Rule RULE=value
   #
   # At present, only the following RULES are known: WANTHSREGEX, SOCKS4,
  -# SOCKS5, STATUS, IRIXNIS, IRIXN32 and PARANOID.
  +# SOCKS5, IRIXNIS, IRIXN32 and PARANOID.
   #
   # For all Rules, if set to "yes", then Configure knows we want that
   # capability and does what is required to add it in. If set to "default"
  @@ -135,12 +135,6 @@
   #  location to EXTRA_LIBS, otherwise Configure will assume
   #  "-L/usr/local/lib -lsocks5"
   #
  -# STATUS:
  -#  If Configure determines that you are using the status_module,
  -#  it will automatically enable full status information if set
  -#  to 'yes'. If the status module is not included, having STATUS
  -#  set to 'yes' has no impact.
  -#
   # IRIXNIS:
   #  Only takes effect if Configure determines that you are running
   #  SGI IRIX.  If you are using a (ancient) 4.x version of IRIX, you
  @@ -161,7 +155,6 @@
   #  actually print-out the code that the modules execute
   #
   
  -Rule STATUS=yes
   Rule SOCKS4=no
   Rule SOCKS5=no
   Rule IRIXNIS=no
  @@ -249,8 +242,8 @@
   ##
   ## The status module allows the server to display current details about 
   ## how well it is performing and what it is doing.  Consider also enabling 
  -## STATUS=yes (see the Rules section near the start of this file) to allow
  -## full status information.  Check conf/access.conf on how to enable this.
  +## the 'ExtendedStatus On' directive to allow full status information.
  +## Please note that doing so can result in a palpable performance hit.
   
   # AddModule modules/standard/mod_status.o
   
  
  
  
  1.33      +1 -0      apache-1.3/src/include/http_conf_globals.h
  
  Index: http_conf_globals.h
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/include/http_conf_globals.h,v
  retrieving revision 1.32
  retrieving revision 1.33
  diff -u -r1.32 -r1.33
  --- http_conf_globals.h       1998/06/16 03:37:24     1.32
  +++ http_conf_globals.h       1998/08/11 00:09:43     1.33
  @@ -85,6 +85,7 @@
   extern MODULE_VAR_EXPORT int ap_suexec_enabled;
   extern int ap_listenbacklog;
   extern int ap_dump_settings;
  +extern int ap_extended_status;
   
   extern char *ap_pid_fname;
   extern char *ap_scoreboard_fname;
  
  
  
  1.41      +0 -2      apache-1.3/src/include/scoreboard.h
  
  Index: scoreboard.h
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/include/scoreboard.h,v
  retrieving revision 1.40
  retrieving revision 1.41
  diff -u -r1.40 -r1.41
  --- scoreboard.h      1998/05/03 17:31:10     1.40
  +++ scoreboard.h      1998/08/11 00:09:43     1.41
  @@ -109,7 +109,6 @@
       unsigned short timeout_len;      /* length of the timeout */
   #endif
       unsigned char status;
  -#if defined(STATUS)
       unsigned long access_count;
       unsigned long bytes_served;
       unsigned long my_access_count;
  @@ -132,7 +131,6 @@
       char client[32];         /* Keep 'em small... */
       char request[64];                /* We just want an idea... */
       char vhost[32];          /* What virtual host is being accessed? */
  -#endif
   } short_score;
   
   typedef struct {
  
  
  
  1.122     +1 -0      apache-1.3/src/main/http_config.c
  
  Index: http_config.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/main/http_config.c,v
  retrieving revision 1.121
  retrieving revision 1.122
  diff -u -r1.121 -r1.122
  --- http_config.c     1998/08/10 04:16:14     1.121
  +++ http_config.c     1998/08/11 00:09:44     1.122
  @@ -1390,6 +1390,7 @@
       ap_bind_address.s_addr = htonl(INADDR_ANY);
       ap_listeners = NULL;
       ap_listenbacklog = DEFAULT_LISTENBACKLOG;
  +    ap_extended_status = 0;
   
       /* Global virtual host hash bucket pointers.  Init to null. */
       ap_init_vhost_config(p);
  
  
  
  1.221     +22 -0     apache-1.3/src/main/http_core.c
  
  Index: http_core.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/main/http_core.c,v
  retrieving revision 1.220
  retrieving revision 1.221
  diff -u -r1.220 -r1.221
  --- http_core.c       1998/08/10 14:37:06     1.220
  +++ http_core.c       1998/08/11 00:09:44     1.221
  @@ -2313,6 +2313,26 @@
       return NULL;
   }
   
  +/*
  + * Here, and not in the status module, because we want this GLOBAL_ONLY.
  + * Note that if enabled, there is a nasty performance hit, even if
  + * the status module is NOT loaded.
  + */
  +static const char *set_extended_status(cmd_parms *cmd, void *dummy, char 
*arg) 
  +{
  +    const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
  +    if (err != NULL) {
  +        return err;
  +    }
  +    if (!strcasecmp(arg, "off") || !strcmp(arg, "0")) {
  +     ap_extended_status = 0;
  +    }
  +    else {
  +     ap_extended_status = 1;
  +    }
  +    return NULL;
  +}
  +
   static const char *set_limit_req_body(cmd_parms *cmd, core_dir_config *conf,
                                         char *arg) 
   {
  @@ -2531,6 +2551,8 @@
   #endif
   { "ServerTokens", set_serv_tokens, NULL, RSRC_CONF, TAKE1,
     "Determine tokens displayed in the Server: header - Min(imal), OS or Full" 
},
  +{ "ExtendedStatus", set_extended_status, NULL, RSRC_CONF, TAKE1,
  +  "\On\" to enable extended status information, \"Off\" to disable" },
   { "LimitRequestBody", set_limit_req_body,
     (void*)XtOffsetOf(core_dir_config, limit_req_body),
     RSRC_CONF|ACCESS_CONF|OR_ALL, TAKE1,
  
  
  
  1.381     +34 -40    apache-1.3/src/main/http_main.c
  
  Index: http_main.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/main/http_main.c,v
  retrieving revision 1.380
  retrieving revision 1.381
  diff -u -r1.380 -r1.381
  --- http_main.c       1998/08/07 15:35:49     1.380
  +++ http_main.c       1998/08/11 00:09:45     1.381
  @@ -247,6 +247,7 @@
   int ap_suexec_enabled = 0;
   int ap_listenbacklog;
   int ap_dump_settings;
  +int ap_extended_status = 0;
   
   /*
    * The max child slot ever assigned, preserved across restarts.  Necessary
  @@ -352,7 +353,7 @@
   /*
    * This routine is called when the pconf pool is vacuumed.  It resets the
    * server version string to a known value and [re]enables modifications
  - * (which are disabled by configuration completion).
  + * (which are disabled by configuration completion). 
    */
   static void reset_version(void *dummy)
   {
  @@ -1961,40 +1962,39 @@
       ++ss->cur_vtime;
   #endif
   
  -#if defined(STATUS)
  +    if (ap_extended_status) {
   #ifndef OPTIMIZE_TIMEOUTS
  -    ss->last_used = time(NULL);
  +     ss->last_used = time(NULL);
   #endif
  -    if (status == SERVER_READY || status == SERVER_DEAD) {
  -     /*
  -      * Reset individual counters
  -      */
  -     if (status == SERVER_DEAD) {
  -         ss->my_access_count = 0L;
  -         ss->my_bytes_served = 0L;
  +     if (status == SERVER_READY || status == SERVER_DEAD) {
  +         /*
  +          * Reset individual counters
  +          */
  +         if (status == SERVER_DEAD) {
  +             ss->my_access_count = 0L;
  +             ss->my_bytes_served = 0L;
  +         }
  +         ss->conn_count = (unsigned short) 0;
  +         ss->conn_bytes = (unsigned long) 0;
        }
  -     ss->conn_count = (unsigned short) 0;
  -     ss->conn_bytes = (unsigned long) 0;
  -    }
  -    if (r) {
  -     conn_rec *c = r->connection;
  -     ap_cpystrn(ss->client, ap_get_remote_host(c, r->per_dir_config,
  -                           REMOTE_NOLOOKUP), sizeof(ss->client));
  -    if (r->the_request == NULL) {
  -             ap_cpystrn(ss->request, "NULL", sizeof(ss->request));
  -     } else if (r->parsed_uri.password == NULL) {
  -             ap_cpystrn(ss->request, r->the_request, sizeof(ss->request));
  -     } else {
  -         /* Don't reveal the password in the server-status view */
  -             ap_cpystrn(ss->request, ap_pstrcat(r->pool, r->method, " ",
  -                                        ap_unparse_uri_components(r->pool, 
&r->parsed_uri, UNP_OMITPASSWORD),
  -                                        r->assbackwards ? NULL : " ", 
r->protocol, NULL),
  -                                sizeof(ss->request));
  +     if (r) {
  +         conn_rec *c = r->connection;
  +         ap_cpystrn(ss->client, ap_get_remote_host(c, r->per_dir_config,
  +                               REMOTE_NOLOOKUP), sizeof(ss->client));
  +     if (r->the_request == NULL) {
  +                 ap_cpystrn(ss->request, "NULL", sizeof(ss->request));
  +         } else if (r->parsed_uri.password == NULL) {
  +                 ap_cpystrn(ss->request, r->the_request, 
sizeof(ss->request));
  +         } else {
  +             /* Don't reveal the password in the server-status view */
  +                 ap_cpystrn(ss->request, ap_pstrcat(r->pool, r->method, " ",
  +                                            
ap_unparse_uri_components(r->pool, &r->parsed_uri, UNP_OMITPASSWORD),
  +                                            r->assbackwards ? NULL : " ", 
r->protocol, NULL),
  +                                    sizeof(ss->request));
  +         }
  +         ap_cpystrn(ss->vhost, r->server->server_hostname, 
sizeof(ss->vhost));
        }
  -     ap_cpystrn(ss->vhost, r->server->server_hostname, sizeof(ss->vhost));
       }
  -#endif
  -
       put_scoreboard_info(child_num, ss);
   
       return old_status;
  @@ -2010,7 +2010,6 @@
   #endif
   }
   
  -#if defined(STATUS)
   void ap_time_process_request(int child_num, int status)
   {
       short_score *ss;
  @@ -2079,9 +2078,6 @@
       put_scoreboard_info(child_num, ss);
   }
   
  -#endif
  -
  -
   static int find_child_by_pid(int pid)
   {
       int i;
  @@ -3705,9 +3701,8 @@
            if (r->status == HTTP_OK)
                ap_process_request(r);
   
  -#if defined(STATUS)
  -         increment_counts(my_child_num, r);
  -#endif
  +         if(ap_extended_status)
  +             increment_counts(my_child_num, r);
   
            if (!current_conn->keepalive || current_conn->aborted)
                break;
  @@ -4787,9 +4782,8 @@
            if (r->status == HTTP_OK)
                ap_process_request(r);
   
  -#if defined(STATUS)
  -         increment_counts(child_num, r);
  -#endif
  +         if (ap_extended_status)
  +             increment_counts(child_num, r);
   
            if (!current_conn->keepalive || current_conn->aborted)
                break;
  
  
  
  1.130     +5 -6      apache-1.3/src/main/http_request.c
  
  Index: http_request.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/main/http_request.c,v
  retrieving revision 1.129
  retrieving revision 1.130
  diff -u -r1.129 -r1.130
  --- http_request.c    1998/08/09 14:33:11     1.129
  +++ http_request.c    1998/08/11 00:09:46     1.130
  @@ -71,6 +71,7 @@
   #include "http_request.h"
   #include "http_core.h"
   #include "http_protocol.h"
  +#include "http_conf_globals.h"       /* for ap_extended_status */
   #include "http_log.h"
   #include "http_main.h"
   #include "scoreboard.h"
  @@ -1182,9 +1183,8 @@
   {
       int old_stat;
   
  -#ifdef STATUS
  -    ap_time_process_request(r->connection->child_num, START_PREQUEST);
  -#endif
  +    if (ap_extended_status)
  +     ap_time_process_request(r->connection->child_num, START_PREQUEST);
   
       process_request_internal(r);
   
  @@ -1202,9 +1202,8 @@
       ap_log_transaction(r);
   
       (void) ap_update_child_status(r->connection->child_num, old_stat, r);
  -#ifdef STATUS
  -    ap_time_process_request(r->connection->child_num, STOP_PREQUEST);
  -#endif
  +    if (ap_extended_status)
  +     ap_time_process_request(r->connection->child_num, STOP_PREQUEST);
   }
   
   static table *rename_original_env(pool *p, table *t)
  
  
  
  1.93      +232 -240  apache-1.3/src/modules/standard/mod_status.c
  
  Index: mod_status.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/modules/standard/mod_status.c,v
  retrieving revision 1.92
  retrieving revision 1.93
  diff -u -r1.92 -r1.93
  --- mod_status.c      1998/08/06 17:42:51     1.92
  +++ mod_status.c      1998/08/11 00:09:48     1.93
  @@ -91,27 +91,15 @@
    *          piece in short reports [Ben Laurie]
    * 21.5.96  Additional Status codes (DNS and LOGGING only enabled if
    *          extended STATUS is enabled) [George Burgyan/Jim J.]
  + * 10.8.98  Allow for extended status info at runtime (no more STATUS)
  + *          [Jim J.]
    */
   
  -/*
  - * Module definition information - the part between the -START and -END
  - * lines below is used by Configure. This could be stored in a separate
  - * instead.
  - *
  - * MODULE-DEFINITION-START
  - * Name: status_module
  - * ConfigStart
  - if [ "$RULE_STATUS" = "yes" ]; then
  - CFLAGS="$CFLAGS -DSTATUS"
  - fi
  - * ConfigEnd
  - * MODULE-DEFINITION-END
  - */
  -
   #include "httpd.h"
   #include "http_config.h"
   #include "http_core.h"
   #include "http_protocol.h"
  +#include "http_conf_globals.h"       /* for ap_extended_status */
   #include "http_main.h"
   #include "util_script.h"
   #include <time.h>
  @@ -142,9 +130,7 @@
   
   module MODULE_VAR_EXPORT status_module;
   
  -#ifdef STATUS
   /* Format the number of bytes nicely */
  -
   static void format_byte_out(request_rec *r, unsigned long bytes)
   {
       if (bytes < (5 * KBYTE))
  @@ -167,8 +153,6 @@
        ap_rprintf(r, "%.1f GB", (float) kbytes / MBYTE);
   }
   
  -#endif
  -
   static void show_time(request_rec *r, time_t tsecs)
   {
       long days, hrs, mins, secs;
  @@ -222,7 +206,6 @@
       int i, res;
       int ready = 0;
       int busy = 0;
  -#if defined(STATUS)
       unsigned long count = 0;
       unsigned long lres, bytes;
       unsigned long my_lres, my_bytes, conn_bytes;
  @@ -235,7 +218,6 @@
   #elif !defined(NO_TIMES)
       float tick = sysconf(_SC_CLK_TCK);
   #endif
  -#endif /* STATUS */
       int short_report = 0;
       int no_table_report = 0;
       short_score score_record;
  @@ -268,10 +250,12 @@
                switch (status_options[i].id) {
                case STAT_OPT_REFRESH:
                    if (*(loc + strlen(status_options[i].form_data_str)) == '=')
  -                     ap_table_set(r->headers_out, 
status_options[i].hdr_out_str,
  -                               loc + strlen(status_options[i].hdr_out_str) + 
1);
  +                     ap_table_set(r->headers_out,
  +                           status_options[i].hdr_out_str,
  +                           loc + strlen(status_options[i].hdr_out_str) + 1);
                    else
  -                     ap_table_set(r->headers_out, 
status_options[i].hdr_out_str, "1");
  +                     ap_table_set(r->headers_out,
  +                           status_options[i].hdr_out_str, "1");
                    break;
                case STAT_OPT_NOTABLE:
                    no_table_report = 1;
  @@ -302,24 +286,24 @@
            ready++;
        else if (res != SERVER_DEAD)
            busy++;
  -#if defined(STATUS)
  -     lres = score_record.access_count;
  -     bytes = score_record.bytes_served;
  -     if (lres != 0 || (res != SERVER_READY && res != SERVER_DEAD)) {
  +     if (ap_extended_status) {
  +         lres = score_record.access_count;
  +         bytes = score_record.bytes_served;
  +         if (lres != 0 || (res != SERVER_READY && res != SERVER_DEAD)) {
   #ifndef NO_TIMES
  -         tu += score_record.times.tms_utime;
  -         ts += score_record.times.tms_stime;
  -         tcu += score_record.times.tms_cutime;
  -         tcs += score_record.times.tms_cstime;
  +             tu += score_record.times.tms_utime;
  +             ts += score_record.times.tms_stime;
  +             tcu += score_record.times.tms_cutime;
  +             tcs += score_record.times.tms_cstime;
   #endif /* NO_TIMES */
  -         count += lres;
  -         bcount += bytes;
  -         if (bcount >= KBYTE) {
  -             kbcount += (bcount >> 10);
  -             bcount = bcount & 0x3ff;
  +             count += lres;
  +             bcount += bytes;
  +             if (bcount >= KBYTE) {
  +                 kbcount += (bcount >> 10);
  +                 bcount = bcount & 0x3ff;
  +             }
            }
        }
  -#endif /* STATUS */
       }
   
       up_time = nowtime - ap_restart_time;
  @@ -330,72 +314,79 @@
        ap_rputs("<HTML><HEAD>\n<TITLE>Apache Status</TITLE>\n</HEAD><BODY>\n", 
r);
        ap_rputs("<H1>Apache Server Status for ", r);
        ap_rvputs(r, ap_get_server_name(r), "</H1>\n\n", NULL);
  -     ap_rvputs(r, "Server Version: ", ap_get_server_version(), "<br>\n",
  -            NULL);
  -     ap_rvputs(r, "Server Built: ", ap_get_server_built(), "<br>\n<hr>\n",
  -            NULL);
  -     ap_rvputs(r, "Current Time: ", ap_ht_time(r->pool, nowtime, 
DEFAULT_TIME_FORMAT, 0), 
  -               "<br>\n", NULL);
  -     ap_rvputs(r, "Restart Time: ", ap_ht_time(r->pool, ap_restart_time, 
DEFAULT_TIME_FORMAT, 0), 
  -            "<br>\n", NULL);
  +     ap_rvputs(r, "Server Version: ",
  +       ap_get_server_version(), "<br>\n", NULL);
  +     ap_rvputs(r, "Server Built: ",
  +       ap_get_server_built(), "<br>\n<hr>\n", NULL);
  +     ap_rvputs(r, "Current Time: ",
  +       ap_ht_time(r->pool, nowtime, DEFAULT_TIME_FORMAT, 0), "<br>\n", NULL);
  +     ap_rvputs(r, "Restart Time: ",
  +       ap_ht_time(r->pool, ap_restart_time, DEFAULT_TIME_FORMAT, 0), 
  +       "<br>\n", NULL);
        ap_rputs("Server uptime: ", r);
        show_time(r, up_time);
        ap_rputs("<br>\n", r);
       }
   
  -#if defined(STATUS)
  -    if (short_report) {
  -     ap_rprintf(r, "Total Accesses: %lu\nTotal kBytes: %lu\n", count, 
kbcount);
  +    if (ap_extended_status) {
  +     if (short_report) {
  +         ap_rprintf(r, "Total Accesses: %lu\nTotal kBytes: %lu\n",
  +             count, kbcount);
   
   #ifndef NO_TIMES
  -     /* Allow for OS/2 not having CPU stats */
  -     if (ts || tu || tcu || tcs)
  -         ap_rprintf(r, "CPULoad: %g\n", (tu + ts + tcu + tcs) / tick / 
up_time * 100.);
  +         /* Allow for OS/2 not having CPU stats */
  +         if (ts || tu || tcu || tcs)
  +             ap_rprintf(r, "CPULoad: %g\n",
  +                 (tu + ts + tcu + tcs) / tick / up_time * 100.);
   #endif
  -
  -     ap_rprintf(r, "Uptime: %ld\n", (long) (up_time));
  -     if (up_time > 0)
  -         ap_rprintf(r, "ReqPerSec: %g\n", (float) count / (float) up_time);
   
  -     if (up_time > 0)
  -         ap_rprintf(r, "BytesPerSec: %g\n", KBYTE * (float) kbcount / 
(float) up_time);
  +         ap_rprintf(r, "Uptime: %ld\n", (long) (up_time));
  +         if (up_time > 0)
  +             ap_rprintf(r, "ReqPerSec: %g\n",
  +                 (float) count / (float) up_time);
   
  -     if (count > 0)
  -         ap_rprintf(r, "BytesPerReq: %g\n", KBYTE * (float) kbcount / 
(float) count);
  -    }
  -    else {                   /* !short_report */
  -     ap_rprintf(r, "Total accesses: %lu - Total Traffic: ", count);
  -     format_kbyte_out(r, kbcount);
  +         if (up_time > 0)
  +             ap_rprintf(r, "BytesPerSec: %g\n",
  +                 KBYTE * (float) kbcount / (float) up_time);
  +
  +         if (count > 0)
  +             ap_rprintf(r, "BytesPerReq: %g\n",
  +                 KBYTE * (float) kbcount / (float) count);
  +     }
  +     else {                  /* !short_report */
  +         ap_rprintf(r, "Total accesses: %lu - Total Traffic: ", count);
  +         format_kbyte_out(r, kbcount);
   
   #ifndef NO_TIMES
  -     /* Allow for OS/2 not having CPU stats */
  -     ap_rputs("<br>\n", r);
  -     ap_rprintf(r, "CPU Usage: u%g s%g cu%g cs%g",
  -             tu / tick, ts / tick, tcu / tick, tcs / tick);
  +         /* Allow for OS/2 not having CPU stats */
  +         ap_rputs("<br>\n", r);
  +         ap_rprintf(r, "CPU Usage: u%g s%g cu%g cs%g",
  +                 tu / tick, ts / tick, tcu / tick, tcs / tick);
   
  -     if (ts || tu || tcu || tcs)
  -         ap_rprintf(r, " - %.3g%% CPU load", (tu + ts + tcu + tcs) / tick / 
up_time * 100.);
  +         if (ts || tu || tcu || tcs)
  +             ap_rprintf(r, " - %.3g%% CPU load",
  +                 (tu + ts + tcu + tcs) / tick / up_time * 100.);
   #endif
   
  -     ap_rputs("<br>\n", r);
  +         ap_rputs("<br>\n", r);
   
  -     if (up_time > 0)
  -         ap_rprintf(r, "%.3g requests/sec - ",
  -                 (float) count / (float) up_time);
  +         if (up_time > 0)
  +             ap_rprintf(r, "%.3g requests/sec - ",
  +                     (float) count / (float) up_time);
   
  -     if (up_time > 0) {
  -         format_byte_out(r, KBYTE * (float) kbcount / (float) up_time);
  -         ap_rputs("/second - ", r);
  -     }
  +         if (up_time > 0) {
  +             format_byte_out(r, KBYTE * (float) kbcount / (float) up_time);
  +             ap_rputs("/second - ", r);
  +         }
   
  -     if (count > 0) {
  -         format_byte_out(r, KBYTE * (float) kbcount / (float) count);
  -         ap_rputs("/request", r);
  -     }
  +         if (count > 0) {
  +             format_byte_out(r, KBYTE * (float) kbcount / (float) count);
  +             ap_rputs("/request", r);
  +         }
   
  -     ap_rputs("<br>\n", r);
  -    }                                /* short_report */
  -#endif /* STATUS */
  +         ap_rputs("<br>\n", r);
  +     }                               /* short_report */
  +    }                                        /* ap_extended_status */
   
       if (!short_report)
        ap_rprintf(r, "\n%d requests currently being processed, %d idle 
servers\n"
  @@ -431,111 +422,113 @@
        ap_rputs("\"<B><code>G</code></B>\" Gracefully finishing, \n", r);
        ap_rputs("\"<B><code>.</code></B>\" Open slot with no current 
process<P>\n", r);
        ap_rputs("<P>\n", r);
  -     ap_rputs("PID Key: <br>\n", r);
  -     ap_rputs("<UL>\n", r);
  -     for (i = 0; i < HARD_SERVER_LIMIT; ++i) {
  -         if (stat_buffer[i] != '.')
  -             ap_rprintf(r, "<LI>%d in state: %c <BR>\n", pid_buffer[i],
  -              stat_buffer[i]);
  +     if (!ap_extended_status) {
  +         ap_rputs("PID Key: <br>\n", r);
  +         ap_rputs("<UL>\n", r);
  +         for (i = 0; i < HARD_SERVER_LIMIT; ++i) {
  +             if (stat_buffer[i] != '.')
  +                 ap_rprintf(r, "<LI>%d in state: %c <BR>\n", pid_buffer[i],
  +                  stat_buffer[i]);
  +         }
  +         ap_rputs("</UL>\n", r);
        }
  -     ap_rputs("</UL>\n", r);
       }
   
  -#if defined(STATUS)
  -    if (!short_report) {
  -     if (no_table_report)
  -         ap_rputs("<p><hr><h2>Server Details</h2>\n\n", r);
  -     else
  +    if (ap_extended_status) {
  +     if (!short_report) {
  +         if (no_table_report)
  +             ap_rputs("<p><hr><h2>Server Details</h2>\n\n", r);
  +         else
   #ifdef NO_TIMES
  -         /* Allow for OS/2 not having CPU stats */
  -         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>Host<th>VHost<th>Request</tr>\n\n",
 r);
  +             /* Allow for OS/2 not having CPU stats */
  +             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>Host<th>VHost<th>Request</tr>\n\n",
 r);
   #else
  -         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>Host<th>VHost<th>Request</tr>\n\n",
 r);
  +             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>Host<th>VHost<th>Request</tr>\n\n",
 r);
   #endif
  -    }
  +     }
   
  -    for (i = 0; i < HARD_SERVER_LIMIT; ++i) {
  -     score_record = ap_scoreboard_image->servers[i];
  -     ps_record = ap_scoreboard_image->parent[i];
  +     for (i = 0; i < HARD_SERVER_LIMIT; ++i) {
  +         score_record = ap_scoreboard_image->servers[i];
  +         ps_record = ap_scoreboard_image->parent[i];
   
   #if defined(NO_GETTIMEOFDAY)
   #ifndef NO_TIMES
  -     if (score_record.start_time == (clock_t) 0)
  +         if (score_record.start_time == (clock_t) 0)
   #endif /* NO_TIMES */
  -         req_time = 0L;
  +             req_time = 0L;
   #ifndef NO_TIMES
  -     else {
  -         req_time = score_record.stop_time - score_record.start_time;
  -         req_time = (req_time * 1000) / (int) tick;
  -     }
  +         else {
  +             req_time = score_record.stop_time - score_record.start_time;
  +             req_time = (req_time * 1000) / (int) tick;
  +         }
   #endif /* NO_TIMES */
   #else
  -     if (score_record.start_time.tv_sec == 0L &&
  -         score_record.start_time.tv_usec == 0L)
  -         req_time = 0L;
  -     else
  -         req_time =
  -             ((score_record.stop_time.tv_sec - 
score_record.start_time.tv_sec) * 1000) +
  -             ((score_record.stop_time.tv_usec - 
score_record.start_time.tv_usec) / 1000);
  -#endif
  -     if (req_time < 0L)
  -         req_time = 0L;
  -
  -     lres = score_record.access_count;
  -     my_lres = score_record.my_access_count;
  -     conn_lres = score_record.conn_count;
  -     bytes = score_record.bytes_served;
  -     my_bytes = score_record.my_bytes_served;
  -     conn_bytes = score_record.conn_bytes;
  -     if (lres != 0 || (score_record.status != SERVER_READY
  -                       && score_record.status != SERVER_DEAD)) {
  -         if (!short_report) {
  -             if (no_table_report) {
  -                 if (score_record.status == SERVER_DEAD)
  -                     ap_rprintf(r, "<b>Server %d</b> (-): %d|%lu|%lu [",
  -                             i, (int) conn_lres, my_lres, lres);
  -                 else
  -                     ap_rprintf(r, "<b>Server %d</b> (%d): %d|%lu|%lu [",
  -                             i, (int) ps_record.pid, (int) conn_lres, 
my_lres, lres);
  -
  -                 switch (score_record.status) {
  -                 case SERVER_READY:
  -                     ap_rputs("Ready", r);
  -                     break;
  -                 case SERVER_STARTING:
  -                     ap_rputs("Starting", r);
  -                     break;
  -                 case SERVER_BUSY_READ:
  -                     ap_rputs("<b>Read</b>", r);
  -                     break;
  -                 case SERVER_BUSY_WRITE:
  -                     ap_rputs("<b>Write</b>", r);
  -                     break;
  -                 case SERVER_BUSY_KEEPALIVE:
  -                     ap_rputs("<b>Keepalive</b>", r);
  -                     break;
  -                 case SERVER_BUSY_LOG:
  -                     ap_rputs("<b>Logging</b>", r);
  -                     break;
  -                 case SERVER_BUSY_DNS:
  -                     ap_rputs("<b>DNS lookup</b>", r);
  -                     break;
  -                 case SERVER_DEAD:
  -                     ap_rputs("Dead", r);
  -                     break;
  -                 case SERVER_GRACEFUL:
  -                     ap_rputs("Graceful", r);
  -                     break;
  -                 default:
  -                     ap_rputs("?STATE?", r);
  -                     break;
  -                 }
  +         if (score_record.start_time.tv_sec == 0L &&
  +             score_record.start_time.tv_usec == 0L)
  +             req_time = 0L;
  +         else
  +             req_time =
  +                 ((score_record.stop_time.tv_sec - 
score_record.start_time.tv_sec) * 1000) +
  +                 ((score_record.stop_time.tv_usec - 
score_record.start_time.tv_usec) / 1000);
  +#endif
  +         if (req_time < 0L)
  +             req_time = 0L;
  +
  +         lres = score_record.access_count;
  +         my_lres = score_record.my_access_count;
  +         conn_lres = score_record.conn_count;
  +         bytes = score_record.bytes_served;
  +         my_bytes = score_record.my_bytes_served;
  +         conn_bytes = score_record.conn_bytes;
  +         if (lres != 0 || (score_record.status != SERVER_READY
  +                           && score_record.status != SERVER_DEAD)) {
  +             if (!short_report) {
  +                 if (no_table_report) {
  +                     if (score_record.status == SERVER_DEAD)
  +                         ap_rprintf(r, "<b>Server %d</b> (-): %d|%lu|%lu [",
  +                                 i, (int) conn_lres, my_lres, lres);
  +                     else
  +                         ap_rprintf(r, "<b>Server %d</b> (%d): %d|%lu|%lu [",
  +                                 i, (int) ps_record.pid, (int) conn_lres, 
my_lres, lres);
  +
  +                     switch (score_record.status) {
  +                     case SERVER_READY:
  +                         ap_rputs("Ready", r);
  +                         break;
  +                     case SERVER_STARTING:
  +                         ap_rputs("Starting", r);
  +                         break;
  +                     case SERVER_BUSY_READ:
  +                         ap_rputs("<b>Read</b>", r);
  +                         break;
  +                     case SERVER_BUSY_WRITE:
  +                         ap_rputs("<b>Write</b>", r);
  +                         break;
  +                     case SERVER_BUSY_KEEPALIVE:
  +                         ap_rputs("<b>Keepalive</b>", r);
  +                         break;
  +                     case SERVER_BUSY_LOG:
  +                         ap_rputs("<b>Logging</b>", r);
  +                         break;
  +                     case SERVER_BUSY_DNS:
  +                         ap_rputs("<b>DNS lookup</b>", r);
  +                         break;
  +                     case SERVER_DEAD:
  +                         ap_rputs("Dead", r);
  +                         break;
  +                     case SERVER_GRACEFUL:
  +                         ap_rputs("Graceful", r);
  +                         break;
  +                     default:
  +                         ap_rputs("?STATE?", r);
  +                         break;
  +                     }
   #ifdef NO_TIMES
  -                 /* Allow for OS/2 not having CPU stats */
  -                 ap_rprintf(r, "]\n %.0f %ld (",
  +                     /* Allow for OS/2 not having CPU stats */
  +                     ap_rprintf(r, "]\n %.0f %ld (",
   #else
   
  -                 ap_rprintf(r, "] u%g s%g cu%g cs%g\n %.0f %ld (",
  +                     ap_rprintf(r, "] u%g s%g cu%g cs%g\n %.0f %ld (",
                            score_record.times.tms_utime / tick,
                            score_record.times.tms_stime / tick,
                            score_record.times.tms_cutime / tick,
  @@ -547,61 +540,61 @@
                            difftime(nowtime, score_record.last_used),
   #endif
                            (long) req_time);
  -                 format_byte_out(r, conn_bytes);
  -                 ap_rputs("|", r);
  -                 format_byte_out(r, my_bytes);
  -                 ap_rputs("|", r);
  -                 format_byte_out(r, bytes);
  -                 ap_rputs(")\n", r);
  -                 ap_rprintf(r, " <i>%s {%s}</i><br>\n\n",
  -                         score_record.client,
  -                         ap_escape_html(r->pool, score_record.request));
  -             }
  -             else {          /* !no_table_report */
  -                 if (score_record.status == SERVER_DEAD)
  -                     ap_rprintf(r, "<tr><td><b>%d</b><td>-<td>%d/%lu/%lu",
  -                             i, (int) conn_lres, my_lres, lres);
  -                 else
  -                     ap_rprintf(r, "<tr><td><b>%d</b><td>%d<td>%d/%lu/%lu",
  -                             i, (int) ps_record.pid, (int) conn_lres, 
my_lres, lres);
  -
  -                 switch (score_record.status) {
  -                 case SERVER_READY:
  -                     ap_rputs("<td>_", r);
  -                     break;
  -                 case SERVER_STARTING:
  -                     ap_rputs("<td><b>S</b>", r);
  -                     break;
  -                 case SERVER_BUSY_READ:
  -                     ap_rputs("<td><b>R</b>", r);
  -                     break;
  -                 case SERVER_BUSY_WRITE:
  -                     ap_rputs("<td><b>W</b>", r);
  -                     break;
  -                 case SERVER_BUSY_KEEPALIVE:
  -                     ap_rputs("<td><b>K</b>", r);
  -                     break;
  -                 case SERVER_BUSY_LOG:
  -                     ap_rputs("<td><b>L</b>", r);
  -                     break;
  -                 case SERVER_BUSY_DNS:
  -                     ap_rputs("<td><b>D</b>", r);
  -                     break;
  -                 case SERVER_DEAD:
  -                     ap_rputs("<td>.", r);
  -                     break;
  -                 case SERVER_GRACEFUL:
  -                     ap_rputs("<td>G", r);
  -                     break;
  -                 default:
  -                     ap_rputs("<td>?", r);
  -                     break;
  +                     format_byte_out(r, conn_bytes);
  +                     ap_rputs("|", r);
  +                     format_byte_out(r, my_bytes);
  +                     ap_rputs("|", r);
  +                     format_byte_out(r, bytes);
  +                     ap_rputs(")\n", r);
  +                     ap_rprintf(r, " <i>%s {%s}</i><br>\n\n",
  +                             score_record.client,
  +                             ap_escape_html(r->pool, score_record.request));
                    }
  +                 else {              /* !no_table_report */
  +                     if (score_record.status == SERVER_DEAD)
  +                         ap_rprintf(r, 
"<tr><td><b>%d</b><td>-<td>%d/%lu/%lu",
  +                                 i, (int) conn_lres, my_lres, lres);
  +                     else
  +                         ap_rprintf(r, 
"<tr><td><b>%d</b><td>%d<td>%d/%lu/%lu",
  +                                 i, (int) ps_record.pid, (int) conn_lres, 
my_lres, lres);
  +
  +                     switch (score_record.status) {
  +                     case SERVER_READY:
  +                         ap_rputs("<td>_", r);
  +                         break;
  +                     case SERVER_STARTING:
  +                         ap_rputs("<td><b>S</b>", r);
  +                         break;
  +                     case SERVER_BUSY_READ:
  +                         ap_rputs("<td><b>R</b>", r);
  +                         break;
  +                     case SERVER_BUSY_WRITE:
  +                         ap_rputs("<td><b>W</b>", r);
  +                         break;
  +                     case SERVER_BUSY_KEEPALIVE:
  +                         ap_rputs("<td><b>K</b>", r);
  +                         break;
  +                     case SERVER_BUSY_LOG:
  +                         ap_rputs("<td><b>L</b>", r);
  +                         break;
  +                     case SERVER_BUSY_DNS:
  +                         ap_rputs("<td><b>D</b>", r);
  +                         break;
  +                     case SERVER_DEAD:
  +                         ap_rputs("<td>.", r);
  +                         break;
  +                     case SERVER_GRACEFUL:
  +                         ap_rputs("<td>G", r);
  +                         break;
  +                     default:
  +                         ap_rputs("<td>?", r);
  +                         break;
  +                     }
   #ifdef NO_TIMES
  -                 /* Allow for OS/2 not having CPU stats */
  -                 ap_rprintf(r, "\n<td>%.0f<td>%ld",
  +                     /* Allow for OS/2 not having CPU stats */
  +                     ap_rprintf(r, "\n<td>%.0f<td>%ld",
   #else
  -                 ap_rprintf(r, "\n<td>%.2f<td>%.0f<td>%ld",
  +                     ap_rprintf(r, "\n<td>%.2f<td>%.0f<td>%ld",
                            (score_record.times.tms_utime +
                             score_record.times.tms_stime +
                             score_record.times.tms_cutime +
  @@ -613,20 +606,20 @@
                            difftime(nowtime, score_record.last_used),
   #endif
                            (long) req_time);
  -                 ap_rprintf(r, "<td>%-1.1f<td>%-2.2f<td>%-2.2f\n",
  -                    (float) conn_bytes / KBYTE, (float) my_bytes / MBYTE,
  +                     ap_rprintf(r, "<td>%-1.1f<td>%-2.2f<td>%-2.2f\n",
  +                        (float) conn_bytes / KBYTE, (float) my_bytes / MBYTE,
                            (float) bytes / MBYTE);
  -                 ap_rprintf(r, "<td>%s<td nowrap>%s<td nowrap>%s</tr>\n\n",
  +                     ap_rprintf(r, "<td>%s<td nowrap>%s<td 
nowrap>%s</tr>\n\n",
                            score_record.client, score_record.vhost,
                            ap_escape_html(r->pool, score_record.request));
  -             }               /* no_table_report */
  -         }                   /* !short_report */
  -     }                       /* if (<active child>) */
  -    }                                /* for () */
  +                 }           /* no_table_report */
  +             }                       /* !short_report */
  +         }                   /* if (<active child>) */
  +     }                               /* for () */
   
  -    if (!(short_report || no_table_report)) {
  +     if (!(short_report || no_table_report)) {
   #ifdef OS2
  -     ap_rputs("</table>\n \
  +         ap_rputs("</table>\n \
   <hr> \
   <table>\n \
   <tr><th>Srv<td>Server number\n \
  @@ -640,7 +633,7 @@
   <tr><th>Slot<td>Total megabytes transferred this slot\n \
   </table>\n", r);
   #else
  -     ap_rputs("</table>\n \
  +         ap_rputs("</table>\n \
   <hr> \
   <table>\n \
   <tr><th>Srv<td>Server number\n \
  @@ -655,16 +648,15 @@
   <tr><th>Slot<td>Total megabytes transferred this slot\n \
   </table>\n", r);
   #endif
  -    }
  +     }
   
  -#else /* !defined(STATUS) */
  +    } else {
   
       ap_rputs("<hr>To obtain a full report with current status information 
and", r);
       ap_rputs(" DNS and LOGGING status codes \n", r);
  -    ap_rputs("you need to recompile Apache after adding the line <pre>", r);
  -    ap_rputs("Rule STATUS=yes</pre>into the file 
<code>Configuration</code>\n", r);
  +    ap_rputs("you need to use the <code>ExtendedStatus On</code>directive. 
\n", r);
   
  -#endif /* STATUS */
  +    }
   
       if (!short_report) {
        ap_rputs(ap_psignature("<HR>\n",r), r);
  
  
  

Reply via email to