jim 96/05/07 11:29:38
Modified: src http_main.c mod_status.c scoreboard.h
Log:
status module improvements + tables
Revision Changes Path
1.25 +11 -3 apache/src/http_main.c
Index: http_main.c
===================================================================
RCS file: /export/home/cvs/apache/src/http_main.c,v
retrieving revision 1.24
retrieving revision 1.25
diff -C3 -r1.24 -r1.25
*** http_main.c 1996/04/18 11:16:36 1.24
--- http_main.c 1996/05/07 18:29:34 1.25
***************
*** 672,677 ****
--- 672,679 ----
*/
new_score_rec.my_access_count = 0L;
new_score_rec.my_bytes_served = 0L;
+ new_score_rec.conn_count = (unsigned short)0;
+ new_score_rec.conn_bytes = (unsigned short)0;
}
if (r) {
int slot_size;
***************
*** 713,719 ****
}
#if defined(STATUS)
! void increment_counts (int child_num, request_rec *r)
{
long int bs=0;
short_score new_score_rec=scoreboard_image[child_num];
--- 715,721 ----
}
#if defined(STATUS)
! void increment_counts (int child_num, request_rec *r, int flag)
{
long int bs=0;
short_score new_score_rec=scoreboard_image[child_num];
***************
*** 721,730 ****
--- 723,738 ----
if (r->sent_bodyct)
bgetopt(r->connection->client, BO_BYTECT, &bs);
+ if (flag) {
+ new_score_rec.conn_count = (unsigned short)0;
+ new_score_rec.conn_bytes = (unsigned short)0;
+ }
new_score_rec.access_count ++;
new_score_rec.my_access_count ++;
+ new_score_rec.conn_count ++;
new_score_rec.bytes_served += (unsigned long)bs;
new_score_rec.my_bytes_served += (unsigned long)bs;
+ new_score_rec.conn_bytes += (unsigned short)bs;
times(&new_score_rec.times);
***************
*** 1176,1182 ****
if (r) process_request (r); /* else premature EOF --- ignore */
#if defined(STATUS)
! if (r) increment_counts(child_num,r);
#endif
while (r && current_conn->keepalive) {
bflush(conn_io);
--- 1184,1190 ----
if (r) process_request (r); /* else premature EOF --- ignore */
#if defined(STATUS)
! if (r) increment_counts(child_num,r,1);
#endif
while (r && current_conn->keepalive) {
bflush(conn_io);
***************
*** 1187,1193 ****
if (r) process_request (r);
#if defined(STATUS)
! if (r) increment_counts(child_num,r);
#endif
}
#if 0
--- 1195,1201 ----
if (r) process_request (r);
#if defined(STATUS)
! if (r) increment_counts(child_num,r,0);
#endif
}
#if 0
1.15 +336 -143 apache/src/mod_status.c
Index: mod_status.c
===================================================================
RCS file: /export/home/cvs/apache/src/mod_status.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -C3 -r1.14 -r1.15
*** mod_status.c 1996/04/17 00:30:58 1.14
--- mod_status.c 1996/05/07 18:29:35 1.15
***************
*** 61,66 ****
--- 61,67 ----
* GET /.status?refresh - Returns page with 1 second refresh
* GET /.status?refresh=6 - Returns page with refresh every 6 seconds
* GET /.status?auto - Returns page with data for automatic parsing
+ * GET /.status?notable - Returns page with no table niceties
*
* Mark Cox, [EMAIL PROTECTED], November 1995
*
***************
*** 72,77 ****
--- 73,80 ----
* 25.3.96 Show uptime better [Mark/Ben Laurie]
* 29.3.96 Better HTML and explanation [Mark/Rob Hartill suggested]
* 09.4.96 Added message for non-STATUS compiled version
+ * 18.4.96 Added per child and per slot counters [Jim Jagielski]
+ * 01.5.96 Table format, cleanup, even more spiffy data [Chuck Murcko/Jim
J.]
*/
#include "httpd.h"
***************
*** 83,103 ****
#include <time.h>
#include "scoreboard.h"
module status_module;
/* Format the number of bytes nicely */
! void format_byte_out(request_rec *r,unsigned long bytes) {
char ss[20];
! if (bytes<5196)
sprintf(ss,"%dB",(int)bytes);
! else if (bytes<524288)
! sprintf(ss,"%.1fkB",(float)bytes/1024);
! else if (bytes<536870912)
! sprintf(ss,"%.1fMB",(float)bytes/1048576);
else
! sprintf(ss,"%.1fGB",(float)bytes/1073741824);
rputs(ss,r);
}
--- 86,113 ----
#include <time.h>
#include "scoreboard.h"
+ #define STATUS_MAXLINE 50
+
+ #define KBYTE 1024
+ #define MBYTE 1048576L
+ #define GBYTE 1073741824L
+
module status_module;
/* Format the number of bytes nicely */
! void format_byte_out(request_rec *r,unsigned long bytes)
! {
char ss[20];
! if (bytes < (5 * KBYTE))
sprintf(ss,"%dB",(int)bytes);
! else if (bytes < (MBYTE / 2))
! sprintf(ss,"%.1fkB",(float)bytes/KBYTE);
! else if (bytes < (GBYTE / 2))
! sprintf(ss,"%.1fMB",(float)bytes/MBYTE);
else
! sprintf(ss,"%.1fGB",(float)bytes/GBYTE);
rputs(ss,r);
}
***************
*** 116,135 ****
s=buf;
*s='\0';
if(days)
! s+=sprintf(s," %ld day%s",days,days==1?"":"s");
if(hrs)
! s+=sprintf(s," %ld hour%s",hrs,hrs==1?"":"s");
if(mins)
! s+=sprintf(s," %ld minute%s",mins,mins==1?"":"s");
if(secs)
! s+=sprintf(s," %ld second%s",secs,secs==1?"":"s");
rputs(buf,r);
}
/* Main handler for x-httpd-status requests */
int status_handler (request_rec *r)
{
time_t nowtime=time(NULL);
time_t up_time;
int i,res;
--- 126,179 ----
s=buf;
*s='\0';
if(days)
! {
! sprintf(s," %ld day%s",days,days==1?"":"s");
! s+=strlen(s);
! }
if(hrs)
! {
! sprintf(s," %ld hour%s",hrs,hrs==1?"":"s");
! s+=strlen(s);
! }
if(mins)
! {
! sprintf(s," %ld minute%s",mins,mins==1?"":"s");
! s+=strlen(s);
! }
if(secs)
! {
! sprintf(s," %ld second%s",secs,secs==1?"":"s");
! s+=strlen(s);
! }
rputs(buf,r);
}
/* Main handler for x-httpd-status requests */
+ /* ID values for command table */
+
+ #define STAT_OPT_END -1
+ #define STAT_OPT_REFRESH 0
+ #define STAT_OPT_NOTABLE 1
+ #define STAT_OPT_AUTO 2
+
+ struct stat_opt
+ {
+ int id;
+ char *form_data_str;
+ char *hdr_out_str;
+ };
+
int status_handler (request_rec *r)
{
+ struct stat_opt options[] = /* see #defines above */
+ {
+ STAT_OPT_REFRESH, "refresh", "Refresh",
+ STAT_OPT_NOTABLE, "notable", NULL,
+ STAT_OPT_AUTO, "auto", NULL,
+ STAT_OPT_END, NULL, NULL
+ };
+ char *loc;
time_t nowtime=time(NULL);
time_t up_time;
int i,res;
***************
*** 139,152 ****
unsigned long count=0;
unsigned long lres,bytes;
unsigned long my_lres,my_bytes;
unsigned long bcount=0;
float tick=sysconf(_SC_CLK_TCK);
! #endif
int short_report=0;
server_rec *server = r->server;
short_score score_record;
char status[]="???????";
char buffer[200];
clock_t tu,ts,tcu,tcs;
tu=ts=tcu=tcs=0;
--- 183,199 ----
unsigned long count=0;
unsigned long lres,bytes;
unsigned long my_lres,my_bytes;
+ unsigned short conn_lres,conn_bytes;
unsigned long bcount=0;
float tick=sysconf(_SC_CLK_TCK);
! #endif /* STATUS */
int short_report=0;
+ int no_table_report=0;
server_rec *server = r->server;
short_score score_record;
char status[]="???????";
char buffer[200];
+ char stat_buffer[HARD_SERVER_MAX];
clock_t tu,ts,tcu,tcs;
tu=ts=tcu=tcs=0;
***************
*** 160,273 ****
if (r->method_number != M_GET) return NOT_IMPLEMENTED;
r->content_type = "text/html";
! if (r->args) {
! if (!strncmp(r->args,"refresh",7))
! if(r->args[7] == '=')
! table_set(r->headers_out,"Refresh",r->args+8);
! else
! table_set(r->headers_out,"Refresh","1");
! else if (!strncmp(r->args,"auto",4)) {
! r->content_type = "text/plain";
! short_report=1;
! }
}
soft_timeout ("send status info", r);
send_http_header(r);
if (r->header_only)
return 0;
- up_time=nowtime-restart_time;
-
- if (!short_report) {
- rputs("<html><head><title>Apache Status</title></head><body>",r);
- rputs("<h1>Apache Server Status</h1>\n\n",r);
- rvputs(r,"Hostname: ",server->server_hostname,"<br>",NULL);
- rvputs(r,"Current Time: ",asctime(localtime(&nowtime)),"<br>",NULL);
- rvputs(r,"Restart Time: ",asctime(localtime(&restart_time)),"<br>",
- NULL);
- rputs("Server up for: ",r);
- show_time(r,up_time);
- rputs("<p>",r);
- }
-
sync_scoreboard_image();
! rputs("Scoreboard: ",r);
! if(!short_report)
! rputs("<PRE>",r);
! for (i = 0; i<HARD_SERVER_MAX; ++i) {
score_record = get_scoreboard_info(i);
res = score_record.status;
! rputc(status[res],r);
if (res == SERVER_READY)
ready++;
else if (res == SERVER_BUSY_READ || res==SERVER_BUSY_WRITE ||
res == SERVER_STARTING)
busy++;
- if(!short_report && i%25 == 24)
- rputs("\r\n",r);
- }
- if(!short_report) {
- rputs("</PRE>",r);
- rputs("Key: ",r);
- rputs("\"<code>_</code>\" Waiting for Connection, ",r);
- rputs("\"<code>S</code>\" Starting up, ",r);
- rputs("\"<code>R</code>\" Reading Request, ",r);
- rputs("\"<code>W</code>\" Sending Reply<p>",r);
- }
- if (short_report)
- sprintf(buffer,"\nBusyServers: %d\nIdleServers: %d\n",busy,ready);
- else
- sprintf(buffer,"\n%d requests currently being processed,\n %d idle
servers\n",busy,ready);
- rputs(buffer,r);
-
#if defined(STATUS)
- if (!short_report)
- rputs("<hr><h2>Server Details</h2>",r);
- for (i = 0; i<HARD_SERVER_MAX; ++i) {
- score_record=get_scoreboard_info(i);
lres = score_record.access_count;
- my_lres = score_record.my_access_count;
bytes= score_record.bytes_served;
! my_bytes= score_record.my_bytes_served;
! if (lres!=0 || (score_record.status != SERVER_READY &&
score_record.status != SERVER_DEAD)) {
! if (!short_report) {
! sprintf(buffer,"<b>Server %d</b> (%d): %lu|%lu [",
! i,(int)score_record.pid,my_lres,lres);
! rputs(buffer,r);
!
! switch (score_record.status) {
! case SERVER_READY:
! rputs("Ready",r);
! break;
! case SERVER_STARTING:
! rputs("Starting",r);
! break;
! case SERVER_BUSY_READ:
! rputs("<b>Read</b>",r);
! break;
! case SERVER_BUSY_WRITE:
! rputs("<b>Write</b>",r);
! break;
! case SERVER_DEAD:
! rputs("Dead",r);
! break;
! }
! sprintf(buffer,"] u%g s%g cu%g cs%g %s (",
! score_record.times.tms_utime/tick,
! score_record.times.tms_stime/tick,
! score_record.times.tms_cutime/tick,
! score_record.times.tms_cstime/tick,
! asctime(localtime(&score_record.last_used)));
! rputs(buffer,r);
! format_byte_out(r,my_bytes);
! rputs("|",r);
! format_byte_out(r,bytes);
! rputs(")",r);
! sprintf(buffer," <i>%s {%s}</i><br>", score_record.client,
! score_record.request);
! rputs(buffer,r);
! }
tu+=score_record.times.tms_utime;
ts+=score_record.times.tms_stime;
tcu+=score_record.times.tms_cutime;
--- 207,268 ----
if (r->method_number != M_GET) return NOT_IMPLEMENTED;
r->content_type = "text/html";
! /*
! * Simple table-driven form data set parser that lets you alter the
header
! */
!
! if (r->args)
! {
! i = 0;
! while (options[i].id != STAT_OPT_END)
! {
! if ((loc = strstr(r->args,options[i].form_data_str)) != NULL)
! {
! switch (options[i].id)
! {
! case STAT_OPT_REFRESH:
! if(*(loc + strlen(options[i].form_data_str)) == '=')
! table_set(r->headers_out,options[i].hdr_out_str,
! loc+strlen(options[i].hdr_out_str)+1);
! else
!
table_set(r->headers_out,options[i].hdr_out_str,"1");
! break;
! case STAT_OPT_NOTABLE:
! no_table_report = 1;
! break;
! case STAT_OPT_AUTO:
! r->content_type = "text/plain";
! short_report = 1;
! break;
! }
! }
! i++;
! }
}
+
soft_timeout ("send status info", r);
send_http_header(r);
if (r->header_only)
return 0;
sync_scoreboard_image();
! for (i = 0; i<HARD_SERVER_MAX; ++i)
! {
score_record = get_scoreboard_info(i);
res = score_record.status;
! stat_buffer[i] = status[res];
if (res == SERVER_READY)
ready++;
else if (res == SERVER_BUSY_READ || res==SERVER_BUSY_WRITE ||
res == SERVER_STARTING)
busy++;
#if defined(STATUS)
lres = score_record.access_count;
bytes= score_record.bytes_served;
! if (lres!=0 || (score_record.status != SERVER_READY
! && score_record.status != SERVER_DEAD))
! {
tu+=score_record.times.tms_utime;
ts+=score_record.times.tms_stime;
tcu+=score_record.times.tms_cutime;
***************
*** 275,353 ****
count+=lres;
bcount+=bytes;
}
}
! if (short_report) {
sprintf(buffer,"Total Accesses: %lu\nTotal Bytes:
%lu\n",count,bcount);
rputs(buffer,r);
! } else {
! sprintf(buffer,"<p>Total accesses: %lu u%g s%g cu%g cs%g (",
! count,tu/tick,ts/tick,tcu/tick,tcs/tick);
! rputs(buffer,r);
! format_byte_out(r,bcount);
! rputs(")",r);
! }
! if (!short_report) {
! rputs("<hr><h2>Averages</h2>",r);
! if (up_time>0) {
! sprintf(buffer,"%.3g request per second<br>\n",
! (float)count/(float)up_time);
! rputs(buffer,r);
! }
! if (up_time>0) {
! format_byte_out(r,(float)bcount/(float)up_time);
! rputs(" per second<br>\n",r);
! }
! if (count>0) {
! format_byte_out(r,(float)bcount/(float)count);
! rputs(" per request<br>\n",r);
! }
if(ts || tu || tcu || tcs)
! {
! sprintf(buffer,"%.3g%% CPU
load<br>\n",(tu+ts+tcu+tcs)/tick/up_time*100.);
rputs(buffer,r);
! }
! } else {
sprintf(buffer,"Uptime: %ld\n",(long)(up_time));
rputs(buffer,r);
! if (up_time>0) {
sprintf(buffer,"ReqPerSec: %g\n",
(float)count/(float)up_time);
rputs(buffer,r);
}
! if (up_time>0) {
sprintf(buffer,"BytesPerSec: %g\n",
(float)bcount/(float)up_time);
rputs(buffer,r);
}
! if (count>0) {
sprintf(buffer,"BytesPerReq: %g\n",
(float)bcount/(float)count);
rputs(buffer,r);
}
if(ts || tu || tcu || tcs)
! {
! sprintf(buffer,"CPULoad: %g\n",(tu+ts+tcu+tcs)/tick/up_time*100.);
rputs(buffer,r);
! }
}
! #else
! rputs("<hr>To obtain a full report with current status information ",r);
! rputs("you need to recompile Apache adding the <code>-DSTATUS</code>
",r);
! rputs("directive on the <code>CFLAGS</code> line in the ",r);
! rputs("<code>Configuration</code> file.",r);
! #endif
if (!short_report)
rputs("</body></html>",r);
return 0;
}
! handler_rec status_handlers[] = {
{ STATUS_MAGIC_TYPE, status_handler },
{ "server-status", status_handler },
{ NULL }
};
! module status_module = {
STANDARD_MODULE_STUFF,
NULL, /* initializer */
NULL, /* dir config creater */
--- 270,546 ----
count+=lres;
bcount+=bytes;
}
+ #endif /* STATUS */
}
!
! up_time=nowtime-restart_time;
!
! if (!short_report)
! {
! rputs("<html><head><title>Apache Status</title></head><body>\n",r);
! rputs("<h1>Apache Server Status for ",r);
! rvputs(r,server->server_hostname,"</h1>\n\n",NULL);
! rvputs(r,"Current Time: ",asctime(localtime(&nowtime)),"<br>\n",NULL);
! rvputs(r,"Restart Time: ",asctime(localtime(&restart_time)),"<br>\n",
! NULL);
! rputs("Server uptime: ",r);
! show_time(r,up_time);
! rputs("<br>\n",r);
! }
!
! #if defined(STATUS)
! if (short_report)
! {
sprintf(buffer,"Total Accesses: %lu\nTotal Bytes:
%lu\n",count,bcount);
rputs(buffer,r);
!
if(ts || tu || tcu || tcs)
! {
! sprintf(buffer,"CPULoad: %g\n",(tu+ts+tcu+tcs)/tick/up_time*100.);
rputs(buffer,r);
! }
!
sprintf(buffer,"Uptime: %ld\n",(long)(up_time));
rputs(buffer,r);
! if (up_time>0)
! {
sprintf(buffer,"ReqPerSec: %g\n",
(float)count/(float)up_time);
rputs(buffer,r);
}
!
! if (up_time>0)
! {
sprintf(buffer,"BytesPerSec: %g\n",
(float)bcount/(float)up_time);
rputs(buffer,r);
}
!
! if (count>0)
! {
sprintf(buffer,"BytesPerReq: %g\n",
(float)bcount/(float)count);
rputs(buffer,r);
}
+ } else /* !short_report */
+ {
+ sprintf(buffer,"Total accesses: %lu - Total Traffic: ", count);
+ rputs(buffer,r);
+ format_byte_out(r,bcount);
+ rputs("<br>\n",r);
+ sprintf(buffer,"CPU Usage: u%g s%g cu%g cs%g",
+ tu/tick,ts/tick,tcu/tick,tcs/tick);
+ rputs(buffer,r);
+
if(ts || tu || tcu || tcs)
! {
! sprintf(buffer," - %.3g%% CPU load",
! (tu+ts+tcu+tcs)/tick/up_time*100.);
rputs(buffer,r);
! }
!
! rputs("<br>\n",r);
!
! if (up_time>0)
! {
! sprintf(buffer,"%.3g requests/sec - ",
! (float)count/(float)up_time);
! rputs(buffer,r);
! }
!
! if (up_time>0)
! {
! format_byte_out(r,(float)bcount/(float)up_time);
! rputs("/second - ",r);
! }
!
! if (count>0)
! {
! format_byte_out(r,(float)bcount/(float)count);
! rputs("/request",r);
! }
!
! rputs("<p>\n",r);
! } /* short_report */
! #endif /* STATUS */
!
! /* send the scoreboard 'table' out */
!
! rputs("Scoreboard: \n",r);
!
! if(!short_report)
! rputs("<PRE>",r);
!
! rputs("\n",r);
!
! for (i = 0; i<HARD_SERVER_MAX; ++i)
! {
! rputc(stat_buffer[i], r);
! if(i%STATUS_MAXLINE == (STATUS_MAXLINE - 1))
! rputs("\n",r);
! }
!
! if (short_report)
! {
! sprintf(buffer,"\nBusyServers: %d\nIdleServers: %d\n",busy,ready);
! }
! else
! {
! rputs("</PRE>\n",r);
! rputs("Key: \n",r);
! rputs("\"<code>_</code>\" Waiting for Connection, \n",r);
! rputs("\"<code>S</code>\" Starting up, \n",r);
! rputs("\"<code>R</code>\" Reading Request, \n",r);
! rputs("\"<code>W</code>\" Sending Reply<p>\n",r);
! sprintf(buffer,"\n%d requests currently being processed, %d idle
servers\n",busy,ready);
! rputs(buffer,r);
! }
!
! #if defined(STATUS)
! if (!short_report)
! if(no_table_report)
! rputs("<p><hr><h2>Server Details</h2>\n\n",r);
! else
! rputs("<p>\n\n<table
border=0><tr><th>Srv<th>PID<th>Acc<th>M<th>CPU\n<th>SS<th>B0<th>B1<th>B2<th>Host<th>Request</tr>\n\n",r);
!
!
! for (i = 0; i<HARD_SERVER_MAX; ++i)
! {
! score_record=get_scoreboard_info(i);
! 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)
! {
! sprintf(buffer,"<b>Server %d</b> (%d): %d|%lu|%lu [",
! i,(int)score_record.pid,(int)conn_lres,my_lres,lres);
! rputs(buffer,r);
!
! switch (score_record.status)
! {
! case SERVER_READY:
! rputs("Ready",r);
! break;
! case SERVER_STARTING:
! rputs("Starting",r);
! break;
! case SERVER_BUSY_READ:
! rputs("<b>Read</b>",r);
! break;
! case SERVER_BUSY_WRITE:
! rputs("<b>Write</b>",r);
! break;
! case SERVER_DEAD:
! rputs("Dead",r);
! break;
! }
! sprintf(buffer,"] u%g s%g cu%g cs%g\n %s (",
! score_record.times.tms_utime/tick,
! score_record.times.tms_stime/tick,
! score_record.times.tms_cutime/tick,
! score_record.times.tms_cstime/tick,
! asctime(localtime(&score_record.last_used)));
! rputs(buffer,r);
! format_byte_out(r,(unsigned long)conn_bytes);
! rputs("|",r);
! format_byte_out(r,my_bytes);
! rputs("|",r);
! format_byte_out(r,bytes);
! rputs(")\n",r);
! sprintf(buffer," <i>%s {%s}</i><br>\n\n",
! score_record.client, score_record.request);
! rputs(buffer,r);
! }
! else /* !no_table_report */
! {
! sprintf(buffer,"<tr><td><b>%d</b><td>%d<td>%d/%lu/%lu",
! i,(int)score_record.pid,(int)conn_lres,my_lres,lres);
! rputs(buffer,r);
!
! switch (score_record.status)
! {
! case SERVER_READY:
! rputs("<td>_",r);
! break;
! case SERVER_STARTING:
! rputs("<td><b>S</b>",r);
! break;
! case SERVER_BUSY_READ:
! rputs("<td><b>R</b>",r);
! break;
! case SERVER_BUSY_WRITE:
! rputs("<td><b>W</b>",r);
! break;
! case SERVER_DEAD:
! rputs("<td>.",r);
! break;
! }
! sprintf(buffer,"\n<td>%.2f<td>%.0f",
! (score_record.times.tms_utime +
! score_record.times.tms_stime +
! score_record.times.tms_cutime +
! score_record.times.tms_cstime)/tick,
! difftime(nowtime, score_record.last_used));
! rputs(buffer,r);
! sprintf(buffer,"<td>%-1.1f<td>%-2.2f<td>%-2.2f\n",
! (float)conn_bytes/KBYTE, (float)my_bytes/MBYTE,
! (float)bytes/MBYTE);
! rputs(buffer,r);
! sprintf(buffer,"<td>%s<td>%s</tr>\n\n",
! score_record.client, score_record.request);
! rputs(buffer,r);
! } /* no_table_report */
! } /* !short_report */
! } /* if (<active child>) */
! } /* for () */
!
! if (!(short_report || no_table_report))
! {
! rputs("</table>\n \
! <ul>\n \
! <li>SRV = \"Server number\"\n \
! <li>PID = \"OS process ID\"\n \
! <li>Acc = \"Number of accesses this connection / this child / this
slot\"\n \
! <li>M = \"Mode of operation\"\n \
! <li>CPU = \"CPU usage, number of seconds\"\n \
! <li>SS = \"Seconds since beginning of most recent request\"\n \
! <li>B0 = \"Kilobytes transferred this connection\"\n \
! <li>B1 = \"Megabytes transferred this child\"\n \
! <li>B2 = \"Total megabytes transferred this slot\"\n \
! </ul>\n",r);
}
!
! #else /* !defined(STATUS) */
!
! rputs("<hr>To obtain a full report with current status information
\n",r);
! rputs("you need to recompile Apache adding the <code>-DSTATUS</code>
\n",r);
! rputs("directive on the <code>CFLAGS</code> line in the \n",r);
! rputs("<code>Configuration</code> file.\n",r);
!
! #endif /* STATUS */
!
if (!short_report)
rputs("</body></html>",r);
return 0;
}
! handler_rec status_handlers[] =
! {
{ STATUS_MAGIC_TYPE, status_handler },
{ "server-status", status_handler },
{ NULL }
};
! module status_module =
! {
STANDARD_MODULE_STUFF,
NULL, /* initializer */
NULL, /* dir config creater */
1.9 +2 -0 apache/src/scoreboard.h
Index: scoreboard.h
===================================================================
RCS file: /export/home/cvs/apache/src/scoreboard.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -C3 -r1.8 -r1.9
*** scoreboard.h 1996/04/09 08:18:37 1.8
--- scoreboard.h 1996/05/07 18:29:35 1.9
***************
*** 77,82 ****
--- 77,84 ----
unsigned long bytes_served;
unsigned long my_access_count;
unsigned long my_bytes_served;
+ unsigned short conn_count;
+ unsigned short conn_bytes;
struct tms times;
time_t last_used;
char client[32]; /* Keep 'em small... */