You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by cl...@apache.org on 2004/05/18 21:21:35 UTC

cvs commit: httpd-2.0/support ab.c

clar        2004/05/18 12:21:35

  Modified:    support  ab.c
  Log:
  replaced tabs with spaces and aligned indentation within brackets
  
  Revision  Changes    Path
  1.144     +908 -907  httpd-2.0/support/ab.c
  
  Index: ab.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/support/ab.c,v
  retrieving revision 1.143
  retrieving revision 1.144
  diff -u -r1.143 -r1.144
  --- ab.c	25 Mar 2004 00:05:00 -0000	1.143
  +++ ab.c	18 May 2004 19:21:35 -0000	1.144
  @@ -67,7 +67,7 @@
      **      Contributed by Aaron Bannert, April 24, 2002
      **
      ** Version 2.0.36-2
  -   **	  Internalized the version string - this string is part
  +   **     Internalized the version string - this string is part
      **     of the Agent: header and the result output.
      **
      ** Version 2.0.37-dev
  @@ -208,21 +208,21 @@
       apr_pool_t *ctx;
       apr_socket_t *aprsock;
       int state;
  -    apr_size_t read;		/* amount of bytes read */
  -    apr_size_t bread;		/* amount of body read */
  -    apr_size_t rwrite, rwrote;	/* keep pointers in what we write - across
  -				 * EAGAINs */
  -    apr_size_t length;	        /* Content-Length value used for keep-alive */
  -    char cbuff[CBUFFSIZE];	/* a buffer to store server response header */
  -    int cbx;			/* offset in cbuffer */
  -    int keepalive;		/* non-zero if a keep-alive request */
  -    int gotheader;		/* non-zero if we have the entire header in
  -				 * cbuff */
  -    apr_time_t start,		/* Start of connection */
  -               connect,		/* Connected, start writing */
  -               endwrite,	/* Request written */
  -               beginread,	/* First byte of input */
  -               done;		/* Connection closed */
  +    apr_size_t read;            /* amount of bytes read */
  +    apr_size_t bread;           /* amount of body read */
  +    apr_size_t rwrite, rwrote;  /* keep pointers in what we write - across
  +                                 * EAGAINs */
  +    apr_size_t length;          /* Content-Length value used for keep-alive */
  +    char cbuff[CBUFFSIZE];      /* a buffer to store server response header */
  +    int cbx;                    /* offset in cbuffer */
  +    int keepalive;              /* non-zero if a keep-alive request */
  +    int gotheader;              /* non-zero if we have the entire header in
  +                                 * cbuff */
  +    apr_time_t start,           /* Start of connection */
  +               connect,         /* Connected, start writing */
  +               endwrite,        /* Request written */
  +               beginread,       /* First byte of input */
  +               done;            /* Connection closed */
   
       int socknum;
   #ifdef USE_SSL
  @@ -249,55 +249,55 @@
   
   /* --------------------- GLOBALS ---------------------------- */
   
  -int verbosity = 0;		/* no verbosity by default */
  -int posting = 0;		/* GET by default */
  -int requests = 1;		/* Number of requests to make */
  -int heartbeatres = 100;		/* How often do we say we're alive */
  -int concurrency = 1;		/* Number of multiple requests to make */
  -int percentile = 1;		/* Show percentile served */
  -int confidence = 1;		/* Show confidence estimator and warnings */
  -int tlimit = 0;			/* time limit in secs */
  -int keepalive = 0;		/* try and do keepalive connections */
  -char servername[1024];		/* name that server reports */
  -char *hostname;			/* host name from URL */
  -char *host_field;		/* value of "Host:" header field */
  -char *path;                     /* path name */
  -char postfile[1024];		/* name of file containing post data */
  -char *postdata;			/* *buffer containing data from postfile */
  -apr_size_t postlen = 0;		/* length of data to be POSTed */
  -char content_type[1024];	/* content type to put in POST header */
  -char *cookie,                   /* optional cookie line */
  -     *auth,                     /* optional (basic/uuencoded) auhentication */
  -     *hdrs;                     /* optional arbitrary headers */
  -apr_port_t port;		/* port number */
  -char proxyhost[1024];		/* proxy host name */
  -int proxyport = 0;		/* proxy port */
  +int verbosity = 0;      /* no verbosity by default */
  +int posting = 0;        /* GET by default */
  +int requests = 1;       /* Number of requests to make */
  +int heartbeatres = 100; /* How often do we say we're alive */
  +int concurrency = 1;    /* Number of multiple requests to make */
  +int percentile = 1;     /* Show percentile served */
  +int confidence = 1;     /* Show confidence estimator and warnings */
  +int tlimit = 0;         /* time limit in secs */
  +int keepalive = 0;      /* try and do keepalive connections */
  +char servername[1024];  /* name that server reports */
  +char *hostname;         /* host name from URL */
  +char *host_field;       /* value of "Host:" header field */
  +char *path;             /* path name */
  +char postfile[1024];    /* name of file containing post data */
  +char *postdata;         /* *buffer containing data from postfile */
  +apr_size_t postlen = 0; /* length of data to be POSTed */
  +char content_type[1024];/* content type to put in POST header */
  +char *cookie,           /* optional cookie line */
  +     *auth,             /* optional (basic/uuencoded) auhentication */
  +     *hdrs;             /* optional arbitrary headers */
  +apr_port_t port;        /* port number */
  +char proxyhost[1024];   /* proxy host name */
  +int proxyport = 0;      /* proxy port */
   char *connecthost;
   apr_port_t connectport;
  -char *gnuplot;			/* GNUplot file */
  -char *csvperc;			/* CSV Percentile file */
  +char *gnuplot;          /* GNUplot file */
  +char *csvperc;          /* CSV Percentile file */
   char url[1024];
   char * fullurl, * colonhost;
   int isproxy = 0;
  -apr_interval_time_t aprtimeout = apr_time_from_sec(30);	/* timeout value */
  +apr_interval_time_t aprtimeout = apr_time_from_sec(30); /* timeout value */
    /*
     * XXX - this is now a per read/write transact type of value
     */
   
  -int use_html = 0;		/* use html in the report */
  +int use_html = 0;       /* use html in the report */
   const char *tablestring;
   const char *trstring;
   const char *tdstring;
   
  -apr_size_t doclen = 0;		/* the length the document should be */
  -long started = 0;		/* number of requests started, so no excess */
  -long totalread = 0;		/* total number of bytes read */
  -long totalbread = 0;		/* totoal amount of entity body read */
  -long totalposted = 0;		/* total number of bytes posted, inc. headers */
  -long done = 0;			/* number of requests we have done */
  -long doneka = 0;		/* number of keep alive connections done */
  -long good = 0, bad = 0;		/* number of good and bad requests */
  -long epipe = 0;			/* number of broken pipe writes */
  +apr_size_t doclen = 0;      /* the length the document should be */
  +long started = 0;           /* number of requests started, so no excess */
  +long totalread = 0;         /* total number of bytes read */
  +long totalbread = 0;        /* totoal amount of entity body read */
  +long totalposted = 0;       /* total number of bytes posted, inc. headers */
  +long done = 0;              /* number of requests we have done */
  +long doneka = 0;            /* number of keep alive connections done */
  +long good = 0, bad = 0;     /* number of good and bad requests */
  +long epipe = 0;             /* number of broken pipe writes */
   
   #ifdef USE_SSL
   int ssl = 0;
  @@ -323,8 +323,8 @@
   /* interesting percentiles */
   int percs[] = {50, 66, 75, 80, 90, 95, 98, 99, 100};
   
  -struct connection *con;		/* connection array */
  -struct data *stats;		/* date for each request */
  +struct connection *con;     /* connection array */
  +struct data *stats;         /* date for each request */
   apr_pool_t *cntxt;
   
   apr_pollset_t *readbits;
  @@ -355,8 +355,8 @@
       char buf[120];
   
       fprintf(stderr,
  -	    "%s: %s (%d)\n",
  -	    s, apr_strerror(rv, buf, sizeof buf), rv);
  +        "%s: %s (%d)\n",
  +        s, apr_strerror(rv, buf, sizeof buf), rv);
       if (done)
           printf("Total of %ld requests completed\n" , done);
       exit(rv);
  @@ -512,49 +512,49 @@
   
   static int ssl_print_connection_info(BIO *bio, SSL *ssl)
   {
  -        SSL_CIPHER *c;
  -        int alg_bits,bits;
  -
  -        c=SSL_get_current_cipher(ssl);
  -        BIO_printf(bio,"Cipher Suite Protocol   :%s\n", SSL_CIPHER_get_version(c));
  -        BIO_printf(bio,"Cipher Suite Name       :%s\n",SSL_CIPHER_get_name(c));
  -
  -        bits=SSL_CIPHER_get_bits(c,&alg_bits);
  -        BIO_printf(bio,"Cipher Suite Cipher Bits:%d (%d)\n",bits,alg_bits);
  -
  -        return(1);
  +    SSL_CIPHER *c;
  +    int alg_bits,bits;
  +    
  +    c=SSL_get_current_cipher(ssl);
  +    BIO_printf(bio,"Cipher Suite Protocol   :%s\n", SSL_CIPHER_get_version(c));
  +    BIO_printf(bio,"Cipher Suite Name       :%s\n",SSL_CIPHER_get_name(c));
  +    
  +    bits=SSL_CIPHER_get_bits(c,&alg_bits);
  +    BIO_printf(bio,"Cipher Suite Cipher Bits:%d (%d)\n",bits,alg_bits);
  +    
  +    return(1);
   }
   
   static int ssl_print_cert_info(BIO *bio, X509 *x509cert)
   {
  -        X509_NAME *dn;
  -        char buf[64];
  +    X509_NAME *dn;
  +    char buf[64];
   
  -        BIO_printf(bio,"Certificate version: %d\n",X509_get_version(x509cert)+1);
  +    BIO_printf(bio,"Certificate version: %d\n",X509_get_version(x509cert)+1);
   
  -        BIO_printf(bio,"Valid from: ");
  -        ASN1_UTCTIME_print(bio, X509_get_notBefore(x509cert));
  -        BIO_printf(bio,"\n");
  +    BIO_printf(bio,"Valid from: ");
  +    ASN1_UTCTIME_print(bio, X509_get_notBefore(x509cert));
  +    BIO_printf(bio,"\n");
   
  -        BIO_printf(bio,"Valid to  : ");
  -        ASN1_UTCTIME_print(bio, X509_get_notAfter(x509cert));
  -        BIO_printf(bio,"\n");
  +    BIO_printf(bio,"Valid to  : ");
  +    ASN1_UTCTIME_print(bio, X509_get_notAfter(x509cert));
  +    BIO_printf(bio,"\n");
   
  -        BIO_printf(bio,"Public key is %d bits\n",
  -            EVP_PKEY_bits(X509_get_pubkey(x509cert)));
  +    BIO_printf(bio,"Public key is %d bits\n",
  +        EVP_PKEY_bits(X509_get_pubkey(x509cert)));
   
  -        dn=X509_get_issuer_name(x509cert);
  -        X509_NAME_oneline(dn, buf, BUFSIZ);
  -        BIO_printf(bio,"The issuer name is %s\n", buf);
  +    dn=X509_get_issuer_name(x509cert);
  +    X509_NAME_oneline(dn, buf, BUFSIZ);
  +    BIO_printf(bio,"The issuer name is %s\n", buf);
   
  -        dn=X509_get_subject_name(x509cert);
  -        X509_NAME_oneline(dn, buf, BUFSIZ);
  -        BIO_printf(bio,"The subject name is %s\n", buf);
  +    dn=X509_get_subject_name(x509cert);
  +    X509_NAME_oneline(dn, buf, BUFSIZ);
  +    BIO_printf(bio,"The subject name is %s\n", buf);
   
  -        /* dump the extension list too */
  -        BIO_printf(bio,"Extension Count: %d\n",X509_get_ext_count(x509cert));
  +    /* dump the extension list too */
  +    BIO_printf(bio,"Extension Count: %d\n",X509_get_ext_count(x509cert));
   
  -        return(1);
  +    return(1);
   }
   
   static void ssl_start_connect(struct connection * c)
  @@ -691,30 +691,30 @@
   static void write_request(struct connection * c)
   {
       do {
  -	apr_time_t tnow = apr_time_now();
  -	apr_size_t l = c->rwrite;
  -	apr_status_t e = APR_SUCCESS; /* prevent gcc warning */
  -
  -	/*
  -	 * First time round ?
  -	 */
  -	if (c->rwrite == 0) {
  +        apr_time_t tnow = apr_time_now();
  +        apr_size_t l = c->rwrite;
  +        apr_status_t e = APR_SUCCESS; /* prevent gcc warning */
  +    
  +        /*
  +         * First time round ?
  +         */
  +        if (c->rwrite == 0) {
   #ifdef USE_SSL
               if (ssl != 1)
   #endif
  -	    apr_socket_timeout_set(c->aprsock, 0);
  -	    c->connect = tnow;
  -	    c->rwrite = reqlen;
  -	    c->rwrote = 0;
  -	    if (posting)
  -		c->rwrite += postlen;
  -	}
  -	else if (tnow > c->connect + aprtimeout) {
  -	    printf("Send request timed out!\n");
  -	    close_connection(c);
  -	    return;
  -	}
  -
  +            apr_socket_timeout_set(c->aprsock, 0);
  +            c->connect = tnow;
  +            c->rwrite = reqlen;
  +            c->rwrote = 0;
  +            if (posting)
  +                c->rwrite += postlen;
  +        }
  +        else if (tnow > c->connect + aprtimeout) {
  +            printf("Send request timed out!\n");
  +            close_connection(c);
  +            return;
  +        }
  +    
   #ifdef USE_SSL
           if (ssl == 1) {
               apr_size_t e_ssl;
  @@ -729,30 +729,30 @@
           }
           else
   #endif
  -	e = apr_socket_send(c->aprsock, request + c->rwrote, &l);
  -
  -	/*
  -	 * Bail early on the most common case
  -	 */
  -	if (l == c->rwrite)
  -	    break;
  +            e = apr_socket_send(c->aprsock, request + c->rwrote, &l);
   
  +        /*
  +         * Bail early on the most common case
  +         */
  +        if (l == c->rwrite)
  +            break;
  +    
   #ifdef USE_SSL
           if (ssl != 1)
   #endif
  -	if (e != APR_SUCCESS) {
  -	    /*
  -	     * Let's hope this traps EWOULDBLOCK too !
  -	     */
  -	    if (!APR_STATUS_IS_EAGAIN(e)) {
  -		epipe++;
  -		printf("Send request failed!\n");
  -		close_connection(c);
  -	    }
  -	    return;
  -	}
  -	c->rwrote += l;
  -	c->rwrite -= l;
  +        if (e != APR_SUCCESS) {
  +            /*
  +             * Let's hope this traps EWOULDBLOCK too !
  +             */
  +            if (!APR_STATUS_IS_EAGAIN(e)) {
  +                epipe++;
  +                printf("Send request failed!\n");
  +                close_connection(c);
  +            }
  +            return;
  +        }
  +        c->rwrote += l;
  +        c->rwrite -= l;
       } while (1);
   
       totalposted += c->rwrite;
  @@ -778,18 +778,18 @@
   static int compradre(struct data * a, struct data * b)
   {
       if ((a->ctime) < (b->ctime))
  -	return -1;
  +        return -1;
       if ((a->ctime) > (b->ctime))
  -	return +1;
  +        return +1;
       return 0;
   }
   
   static int comprando(struct data * a, struct data * b)
   {
       if ((a->time) < (b->time))
  -	return -1;
  +        return -1;
       if ((a->time) > (b->time))
  -	return +1;
  +        return +1;
       return 0;
   }
   
  @@ -798,18 +798,18 @@
       apr_interval_time_t p = a->time - a->ctime;
       apr_interval_time_t q = b->time - b->ctime;
       if (p < q)
  -	return -1;
  +        return -1;
       if (p > q)
  -	return +1;
  +        return +1;
       return 0;
   }
   
   static int compwait(struct data * a, struct data * b)
   {
       if ((a->waittime) < (b->waittime))
  -	return -1;
  +        return -1;
       if ((a->waittime) > (b->waittime))
  -	return 1;
  +        return 1;
       return 0;
   }
   
  @@ -838,40 +838,40 @@
       printf("Complete requests:      %ld\n", done);
       printf("Failed requests:        %ld\n", bad);
       if (bad)
  -	printf("   (Connect: %d, Length: %d, Exceptions: %d)\n",
  -	       err_conn, err_length, err_except);
  +        printf("   (Connect: %d, Length: %d, Exceptions: %d)\n",
  +            err_conn, err_length, err_except);
       printf("Write errors:           %ld\n", epipe);
       if (err_response)
  -	printf("Non-2xx responses:      %d\n", err_response);
  +        printf("Non-2xx responses:      %d\n", err_response);
       if (keepalive)
  -	printf("Keep-Alive requests:    %ld\n", doneka);
  +        printf("Keep-Alive requests:    %ld\n", doneka);
       printf("Total transferred:      %ld bytes\n", totalread);
       if (posting > 0)
  -	printf("Total POSTed:           %ld\n", totalposted);
  +        printf("Total POSTed:           %ld\n", totalposted);
       printf("HTML transferred:       %ld bytes\n", totalbread);
   
       /* avoid divide by zero */
       if (timetaken) {
  -	printf("Requests per second:    %.2f [#/sec] (mean)\n", 
  +        printf("Requests per second:    %.2f [#/sec] (mean)\n", 
                  (float) (done / timetaken));
  -	printf("Time per request:       %.3f [ms] (mean)\n", 
  +        printf("Time per request:       %.3f [ms] (mean)\n", 
                  (float) (1000 * concurrency * timetaken / done));
  -	printf("Time per request:       %.3f [ms] (mean, across all concurrent requests)\n",
  -	       (float) (1000 * timetaken / done));
  -	printf("Transfer rate:          %.2f [Kbytes/sec] received\n",
  -	       (float) (totalread / 1024 / timetaken));
  -	if (posting > 0) {
  -	    printf("                        %.2f kb/s sent\n",
  -		   (float) (totalposted / timetaken / 1024));
  -	    printf("                        %.2f kb/s total\n",
  -		   (float) ((totalread + totalposted) / timetaken / 1024));
  -	}
  +        printf("Time per request:       %.3f [ms] (mean, across all concurrent requests)\n",
  +           (float) (1000 * timetaken / done));
  +        printf("Transfer rate:          %.2f [Kbytes/sec] received\n",
  +           (float) (totalread / 1024 / timetaken));
  +        if (posting > 0) {
  +            printf("                        %.2f kb/s sent\n",
  +               (float) (totalposted / timetaken / 1024));
  +            printf("                        %.2f kb/s total\n",
  +               (float) ((totalread + totalposted) / timetaken / 1024));
  +        }
       }
   
       if (requests) {
  -	/* work out connection times */
  -	long i;
  -	apr_time_t totalcon = 0, total = 0, totald = 0, totalwait = 0;
  +        /* work out connection times */
  +        long i;
  +        apr_time_t totalcon = 0, total = 0, totald = 0, totalwait = 0;
           apr_time_t meancon, meantot, meand, meanwait;
           apr_interval_time_t mincon = AB_MAX, mintot = AB_MAX, mind = AB_MAX, 
                               minwait = AB_MAX;
  @@ -879,119 +879,119 @@
           apr_interval_time_t mediancon = 0, mediantot = 0, mediand = 0, medianwait = 0;
           double sdtot = 0, sdcon = 0, sdd = 0, sdwait = 0;
   
  -	for (i = 0; i < requests; i++) {
  -	    struct data s = stats[i];
  -	    mincon = ap_min(mincon, s.ctime);
  -	    mintot = ap_min(mintot, s.time);
  -	    mind = ap_min(mind, s.time - s.ctime);
  -	    minwait = ap_min(minwait, s.waittime);
  -
  -	    maxcon = ap_max(maxcon, s.ctime);
  -	    maxtot = ap_max(maxtot, s.time);
  -	    maxd = ap_max(maxd, s.time - s.ctime);
  -	    maxwait = ap_max(maxwait, s.waittime);
  -
  -	    totalcon += s.ctime;
  -	    total += s.time;
  -	    totald += s.time - s.ctime;
  -	    totalwait += s.waittime;
  -	}
  -    meancon = totalcon / requests;
  -    meantot = total / requests;
  -    meand = totald / requests;
  -    meanwait = totalwait / requests;
  -
  -    /* calculating the sample variance: the sum of the squared deviations, divided by n-1 */
  -	for (i = 0; i < requests; i++) {
  -	    struct data s = stats[i];
  -        double a;
  -        a = ((double)s.time - meantot);
  +        for (i = 0; i < requests; i++) {
  +            struct data s = stats[i];
  +            mincon = ap_min(mincon, s.ctime);
  +            mintot = ap_min(mintot, s.time);
  +            mind = ap_min(mind, s.time - s.ctime);
  +            minwait = ap_min(minwait, s.waittime);
  +    
  +            maxcon = ap_max(maxcon, s.ctime);
  +            maxtot = ap_max(maxtot, s.time);
  +            maxd = ap_max(maxd, s.time - s.ctime);
  +            maxwait = ap_max(maxwait, s.waittime);
  +    
  +            totalcon += s.ctime;
  +            total += s.time;
  +            totald += s.time - s.ctime;
  +            totalwait += s.waittime;
  +        }
  +        meancon = totalcon / requests;
  +        meantot = total / requests;
  +        meand = totald / requests;
  +        meanwait = totalwait / requests;
  +
  +        /* calculating the sample variance: the sum of the squared deviations, divided by n-1 */
  +        for (i = 0; i < requests; i++) {
  +            struct data s = stats[i];
  +            double a;
  +            a = ((double)s.time - meantot);
               sdtot += a * a;
  -	    a = ((double)s.ctime - meancon);
  -	    sdcon += a * a;
  -	    a = ((double)s.time - (double)s.ctime - meand);
  -	    sdd += a * a;
  -	    a = ((double)s.waittime - meanwait);
  -	    sdwait += a * a;
  -	}
  -
  -	sdtot = (requests > 1) ? sqrt(sdtot / (requests - 1)) : 0;
  -	sdcon = (requests > 1) ? sqrt(sdcon / (requests - 1)) : 0;
  -	sdd = (requests > 1) ? sqrt(sdd / (requests - 1)) : 0;
  -	sdwait = (requests > 1) ? sqrt(sdwait / (requests - 1)) : 0;
  -
  -	if (gnuplot) {
  -	    FILE *out = fopen(gnuplot, "w");
  -	    long i;
  -	    apr_time_t sttime;
  -	    char tmstring[1024];/* XXXX */
  -	    if (!out) {
  -		perror("Cannot open gnuplot output file");
  -		exit(1);
  -	    }
  -	    fprintf(out, "starttime\tseconds\tctime\tdtime\tttime\twait\n");
  -	    for (i = 0; i < requests; i++) {
  -                apr_time_t diff = stats[i].time - stats[i].ctime;
  +            a = ((double)s.ctime - meancon);
  +            sdcon += a * a;
  +            a = ((double)s.time - (double)s.ctime - meand);
  +            sdd += a * a;
  +            a = ((double)s.waittime - meanwait);
  +            sdwait += a * a;
  +        }
   
  -		sttime = stats[i].starttime;
  -		(void) apr_ctime(tmstring, sttime);
  -		fprintf(out, "%s\t%" APR_TIME_T_FMT "\t%" APR_TIME_T_FMT "\t%" APR_TIME_T_FMT "\t%" APR_TIME_T_FMT "\t%" APR_TIME_T_FMT "\n",
  -			tmstring,
  -			sttime,
  -			stats[i].ctime,
  -			diff,
  -			stats[i].time,
  -			stats[i].waittime);
  -	    }
  -	    fclose(out);
  -	}
  -    /*
  -     * XXX: what is better; this hideous cast of the compradre function; or
  -     * the four warnings during compile ? dirkx just does not know and
  -     * hates both/
  -     */
  -	qsort(stats, requests, sizeof(struct data),
  -	      (int (*) (const void *, const void *)) compradre);
  -	if ((requests > 1) && (requests % 2))
  -	    mediancon = (stats[requests / 2].ctime + stats[requests / 2 + 1].ctime) / 2;
  -	else
  -	    mediancon = stats[requests / 2].ctime;
  -
  -	qsort(stats, requests, sizeof(struct data),
  -	      (int (*) (const void *, const void *)) compri);
  -	if ((requests > 1) && (requests % 2))
  -	    mediand = (stats[requests / 2].time + stats[requests / 2 + 1].time \
  -	    -stats[requests / 2].ctime - stats[requests / 2 + 1].ctime) / 2;
  -	else
  -	    mediand = stats[requests / 2].time - stats[requests / 2].ctime;
  -
  -	qsort(stats, requests, sizeof(struct data),
  -	      (int (*) (const void *, const void *)) compwait);
  -	if ((requests > 1) && (requests % 2))
  -	    medianwait = (stats[requests / 2].waittime + stats[requests / 2 + 1].waittime) / 2;
  -	else
  -	    medianwait = stats[requests / 2].waittime;
  -
  -	qsort(stats, requests, sizeof(struct data),
  -	      (int (*) (const void *, const void *)) comprando);
  -	if ((requests > 1) && (requests % 2))
  -	    mediantot = (stats[requests / 2].time + stats[requests / 2 + 1].time) / 2;
  -	else
  -	    mediantot = stats[requests / 2].time;
  +        sdtot = (requests > 1) ? sqrt(sdtot / (requests - 1)) : 0;
  +        sdcon = (requests > 1) ? sqrt(sdcon / (requests - 1)) : 0;
  +        sdd = (requests > 1) ? sqrt(sdd / (requests - 1)) : 0;
  +        sdwait = (requests > 1) ? sqrt(sdwait / (requests - 1)) : 0;
  +    
  +        if (gnuplot) {
  +            FILE *out = fopen(gnuplot, "w");
  +            long i;
  +            apr_time_t sttime;
  +            char tmstring[1024];/* XXXX */
  +            if (!out) {
  +                perror("Cannot open gnuplot output file");
  +                exit(1);
  +            }
  +            fprintf(out, "starttime\tseconds\tctime\tdtime\tttime\twait\n");
  +            for (i = 0; i < requests; i++) {
  +                apr_time_t diff = stats[i].time - stats[i].ctime;
   
  -	printf("\nConnection Times (ms)\n");
  +                sttime = stats[i].starttime;
  +                (void) apr_ctime(tmstring, sttime);
  +                fprintf(out, "%s\t%" APR_TIME_T_FMT "\t%" APR_TIME_T_FMT "\t%" APR_TIME_T_FMT "\t%" APR_TIME_T_FMT "\t%" APR_TIME_T_FMT "\n",
  +                tmstring,
  +                sttime,
  +                stats[i].ctime,
  +                diff,
  +                stats[i].time,
  +                stats[i].waittime);
  +            }
  +            fclose(out);
  +        }
  +        /*
  +         * XXX: what is better; this hideous cast of the compradre function; or
  +         * the four warnings during compile ? dirkx just does not know and
  +         * hates both/
  +         */
  +        qsort(stats, requests, sizeof(struct data),
  +              (int (*) (const void *, const void *)) compradre);
  +        if ((requests > 1) && (requests % 2))
  +            mediancon = (stats[requests / 2].ctime + stats[requests / 2 + 1].ctime) / 2;
  +        else
  +            mediancon = stats[requests / 2].ctime;
  +    
  +        qsort(stats, requests, sizeof(struct data),
  +              (int (*) (const void *, const void *)) compri);
  +        if ((requests > 1) && (requests % 2))
  +            mediand = (stats[requests / 2].time + stats[requests / 2 + 1].time \
  +            -stats[requests / 2].ctime - stats[requests / 2 + 1].ctime) / 2;
  +        else
  +            mediand = stats[requests / 2].time - stats[requests / 2].ctime;
  +    
  +        qsort(stats, requests, sizeof(struct data),
  +              (int (*) (const void *, const void *)) compwait);
  +        if ((requests > 1) && (requests % 2))
  +            medianwait = (stats[requests / 2].waittime + stats[requests / 2 + 1].waittime) / 2;
  +        else
  +            medianwait = stats[requests / 2].waittime;
  +    
  +        qsort(stats, requests, sizeof(struct data),
  +              (int (*) (const void *, const void *)) comprando);
  +        if ((requests > 1) && (requests % 2))
  +            mediantot = (stats[requests / 2].time + stats[requests / 2 + 1].time) / 2;
  +        else
  +            mediantot = stats[requests / 2].time;
  +    
  +        printf("\nConnection Times (ms)\n");
   
  -	if (confidence) {
  +        if (confidence) {
   #define CONF_FMT_STRING "%5" APR_TIME_T_FMT " %4d %5.1f %6" APR_TIME_T_FMT " %7" APR_TIME_T_FMT "\n"
  -	    printf("              min  mean[+/-sd] median   max\n");
  -	    printf("Connect:    " CONF_FMT_STRING, 
  -                   mincon, (int) (meancon + 0.5), sdcon, mediancon, maxcon);
  -	    printf("Processing: " CONF_FMT_STRING,
  -		   mind, (int) (meand + 0.5), sdd, mediand, maxd);
  -	    printf("Waiting:    " CONF_FMT_STRING,
  -	           minwait, (int) (meanwait + 0.5), sdwait, medianwait, maxwait);
  -	    printf("Total:      " CONF_FMT_STRING,
  -		   mintot, (int) (meantot + 0.5), sdtot, mediantot, maxtot);
  +            printf("              min  mean[+/-sd] median   max\n");
  +            printf("Connect:    " CONF_FMT_STRING, 
  +                       mincon, (int) (meancon + 0.5), sdcon, mediancon, maxcon);
  +            printf("Processing: " CONF_FMT_STRING,
  +               mind, (int) (meand + 0.5), sdd, mediand, maxd);
  +            printf("Waiting:    " CONF_FMT_STRING,
  +                   minwait, (int) (meanwait + 0.5), sdwait, medianwait, maxwait);
  +            printf("Total:      " CONF_FMT_STRING,
  +               mintot, (int) (meantot + 0.5), sdtot, mediantot, maxtot);
   #undef CONF_FMT_STRING
   
   #define     SANE(what,mean,median,sd) \
  @@ -1005,56 +1005,57 @@
                       printf("WARNING: The median and mean for " what " are not within a normal deviation\n" \
                              "        These results are probably not that reliable.\n"); \
               }
  -	    SANE("the initial connection time", meancon, mediancon, sdcon);
  -	    SANE("the processing time", meand, mediand, sdd);
  -	    SANE("the waiting time", meanwait, medianwait, sdwait);
  -	    SANE("the total time", meantot, mediantot, sdtot);
  -	}
  -	else {
  -	    printf("              min   avg   max\n");
  +            SANE("the initial connection time", meancon, mediancon, sdcon);
  +            SANE("the processing time", meand, mediand, sdd);
  +            SANE("the waiting time", meanwait, medianwait, sdwait);
  +            SANE("the total time", meantot, mediantot, sdtot);
  +        }
  +        else {
  +            printf("              min   avg   max\n");
   #define CONF_FMT_STRING "%5" APR_TIME_T_FMT " %5" APR_TIME_T_FMT "%5" APR_TIME_T_FMT "\n"
  -	    printf("Connect:    " CONF_FMT_STRING, 
  +            printf("Connect:    " CONF_FMT_STRING, 
                   mincon, meancon, maxcon);
  -	    printf("Processing: " CONF_FMT_STRING, 
  +            printf("Processing: " CONF_FMT_STRING, 
                   mintot - mincon, meantot - meancon,  maxtot - maxcon);
  -	    printf("Total:      " CONF_FMT_STRING, 
  +            printf("Total:      " CONF_FMT_STRING, 
                   mintot, meantot, maxtot);
   #undef CONF_FMT_STRING
  -	}
  +        }
   
   
  -	/* Sorted on total connect times */
  -	if (percentile && (requests > 1)) {
  -	    printf("\nPercentage of the requests served within a certain time (ms)\n");
  -	    for (i = 0; i < sizeof(percs) / sizeof(int); i++)
  -		if (percs[i] <= 0)
  -		    printf(" 0%%  <0> (never)\n");
  +        /* Sorted on total connect times */
  +        if (percentile && (requests > 1)) {
  +            printf("\nPercentage of the requests served within a certain time (ms)\n");
  +            for (i = 0; i < sizeof(percs) / sizeof(int); i++) {
  +                if (percs[i] <= 0)
  +                    printf(" 0%%  <0> (never)\n");
                   else if (percs[i] >= 100)
  -		    printf(" 100%%  %5" APR_TIME_T_FMT " (longest request)\n",
  +                    printf(" 100%%  %5" APR_TIME_T_FMT " (longest request)\n",
                              stats[requests - 1].time);
                   else
  -		    printf("  %d%%  %5" APR_TIME_T_FMT "\n", percs[i], 
  +                    printf("  %d%%  %5" APR_TIME_T_FMT "\n", percs[i], 
                              stats[(int) (requests * percs[i] / 100)].time);
  -	}
  -	if (csvperc) {
  -	    FILE *out = fopen(csvperc, "w");
  -	    int i;
  -	    if (!out) {
  -		perror("Cannot open CSV output file");
  -		exit(1);
  -	    }
  -	    fprintf(out, "" "Percentage served" "," "Time in ms" "\n");
  -	    for (i = 0; i < 100; i++) {
  -		apr_time_t t;
  -		if (i == 0)
  -		    t = stats[0].time;
  -		else if (i == 100)
  -		    t = stats[requests - 1].time;
  -		else
  -		    t = stats[(int) (0.5 + requests * i / 100.0)].time;
  -		fprintf(out, "%d,%e\n", i, (double)t);
  -	    }
  -	    fclose(out);
  +            }
  +        }
  +        if (csvperc) {
  +            FILE *out = fopen(csvperc, "w");
  +            int i;
  +            if (!out) {
  +                perror("Cannot open CSV output file");
  +                exit(1);
  +            }
  +            fprintf(out, "" "Percentage served" "," "Time in ms" "\n");
  +            for (i = 0; i < 100; i++) {
  +                apr_time_t t;
  +                if (i == 0)
  +                    t = stats[0].time;
  +                else if (i == 100)
  +                    t = stats[requests - 1].time;
  +                else
  +                    t = stats[(int) (0.5 + requests * i / 100.0)].time;
  +                fprintf(out, "%d,%e\n", i, (double)t);
  +            }
  +            fclose(out);
           }
   
       }
  @@ -1073,113 +1074,114 @@
   
       printf("\n\n<table %s>\n", tablestring);
       printf("<tr %s><th colspan=2 %s>Server Software:</th>"
  -	   "<td colspan=2 %s>%s</td></tr>\n",
  -	   trstring, tdstring, tdstring, servername);
  +       "<td colspan=2 %s>%s</td></tr>\n",
  +       trstring, tdstring, tdstring, servername);
       printf("<tr %s><th colspan=2 %s>Server Hostname:</th>"
  -	   "<td colspan=2 %s>%s</td></tr>\n",
  -	   trstring, tdstring, tdstring, hostname);
  +       "<td colspan=2 %s>%s</td></tr>\n",
  +       trstring, tdstring, tdstring, hostname);
       printf("<tr %s><th colspan=2 %s>Server Port:</th>"
  -	   "<td colspan=2 %s>%hd</td></tr>\n",
  -	   trstring, tdstring, tdstring, port);
  +       "<td colspan=2 %s>%hd</td></tr>\n",
  +       trstring, tdstring, tdstring, port);
       printf("<tr %s><th colspan=2 %s>Document Path:</th>"
  -	   "<td colspan=2 %s>%s</td></tr>\n",
  -	   trstring, tdstring, tdstring, path);
  +       "<td colspan=2 %s>%s</td></tr>\n",
  +       trstring, tdstring, tdstring, path);
       printf("<tr %s><th colspan=2 %s>Document Length:</th>"
  -	   "<td colspan=2 %s>%" APR_SIZE_T_FMT " bytes</td></tr>\n",
  -	   trstring, tdstring, tdstring, doclen);
  +       "<td colspan=2 %s>%" APR_SIZE_T_FMT " bytes</td></tr>\n",
  +       trstring, tdstring, tdstring, doclen);
       printf("<tr %s><th colspan=2 %s>Concurrency Level:</th>"
  -	   "<td colspan=2 %s>%d</td></tr>\n",
  -	   trstring, tdstring, tdstring, concurrency);
  +       "<td colspan=2 %s>%d</td></tr>\n",
  +       trstring, tdstring, tdstring, concurrency);
       printf("<tr %s><th colspan=2 %s>Time taken for tests:</th>"
  -	   "<td colspan=2 %s>%" APR_INT64_T_FMT ".%03ld seconds</td></tr>\n",
  -	   trstring, tdstring, tdstring, apr_time_sec(timetaken),
  +       "<td colspan=2 %s>%" APR_INT64_T_FMT ".%03ld seconds</td></tr>\n",
  +       trstring, tdstring, tdstring, apr_time_sec(timetaken),
              (long)apr_time_usec(timetaken));
       printf("<tr %s><th colspan=2 %s>Complete requests:</th>"
  -	   "<td colspan=2 %s>%ld</td></tr>\n",
  -	   trstring, tdstring, tdstring, done);
  +       "<td colspan=2 %s>%ld</td></tr>\n",
  +       trstring, tdstring, tdstring, done);
       printf("<tr %s><th colspan=2 %s>Failed requests:</th>"
  -	   "<td colspan=2 %s>%ld</td></tr>\n",
  -	   trstring, tdstring, tdstring, bad);
  +       "<td colspan=2 %s>%ld</td></tr>\n",
  +       trstring, tdstring, tdstring, bad);
       if (bad)
  -	printf("<tr %s><td colspan=4 %s >   (Connect: %d, Length: %d, Exceptions: %d)</td></tr>\n",
  -	       trstring, tdstring, err_conn, err_length, err_except);
  +        printf("<tr %s><td colspan=4 %s >   (Connect: %d, Length: %d, Exceptions: %d)</td></tr>\n",
  +           trstring, tdstring, err_conn, err_length, err_except);
       if (err_response)
  -	printf("<tr %s><th colspan=2 %s>Non-2xx responses:</th>"
  -	       "<td colspan=2 %s>%d</td></tr>\n",
  -	       trstring, tdstring, tdstring, err_response);
  +        printf("<tr %s><th colspan=2 %s>Non-2xx responses:</th>"
  +           "<td colspan=2 %s>%d</td></tr>\n",
  +           trstring, tdstring, tdstring, err_response);
       if (keepalive)
  -	printf("<tr %s><th colspan=2 %s>Keep-Alive requests:</th>"
  -	       "<td colspan=2 %s>%ld</td></tr>\n",
  -	       trstring, tdstring, tdstring, doneka);
  +        printf("<tr %s><th colspan=2 %s>Keep-Alive requests:</th>"
  +           "<td colspan=2 %s>%ld</td></tr>\n",
  +           trstring, tdstring, tdstring, doneka);
       printf("<tr %s><th colspan=2 %s>Total transferred:</th>"
  -	   "<td colspan=2 %s>%ld bytes</td></tr>\n",
  -	   trstring, tdstring, tdstring, totalread);
  +       "<td colspan=2 %s>%ld bytes</td></tr>\n",
  +       trstring, tdstring, tdstring, totalread);
       if (posting > 0)
  -	printf("<tr %s><th colspan=2 %s>Total POSTed:</th>"
  -	       "<td colspan=2 %s>%ld</td></tr>\n",
  -	       trstring, tdstring, tdstring, totalposted);
  +        printf("<tr %s><th colspan=2 %s>Total POSTed:</th>"
  +           "<td colspan=2 %s>%ld</td></tr>\n",
  +           trstring, tdstring, tdstring, totalposted);
       printf("<tr %s><th colspan=2 %s>HTML transferred:</th>"
  -	   "<td colspan=2 %s>%ld bytes</td></tr>\n",
  -	   trstring, tdstring, tdstring, totalbread);
  +       "<td colspan=2 %s>%ld bytes</td></tr>\n",
  +       trstring, tdstring, tdstring, totalbread);
   
       /* avoid divide by zero */
       if (timetaken) {
  -	printf("<tr %s><th colspan=2 %s>Requests per second:</th>"
  -	       "<td colspan=2 %s>%.2f</td></tr>\n",
  -	   trstring, tdstring, tdstring, 1000 * (float) (done) / timetaken);
  -	printf("<tr %s><th colspan=2 %s>Transfer rate:</th>"
  -	       "<td colspan=2 %s>%.2f kb/s received</td></tr>\n",
  -	     trstring, tdstring, tdstring, (float) (totalread) / timetaken);
  -	if (posting > 0) {
  -	    printf("<tr %s><td colspan=2 %s>&nbsp;</td>"
  -		   "<td colspan=2 %s>%.2f kb/s sent</td></tr>\n",
  -		   trstring, tdstring, tdstring,
  -		   (float) (totalposted) / timetaken);
  -	    printf("<tr %s><td colspan=2 %s>&nbsp;</td>"
  -		   "<td colspan=2 %s>%.2f kb/s total</td></tr>\n",
  -		   trstring, tdstring, tdstring,
  -		   (float) (totalread + totalposted) / timetaken);
  -	}
  -    } {
  -	/* work out connection times */
  -	long i;
  -	apr_interval_time_t totalcon = 0, total = 0;
  -	apr_interval_time_t mincon = AB_MAX, mintot = AB_MAX;
  -	apr_interval_time_t maxcon = 0, maxtot = 0;
  -
  -	for (i = 0; i < requests; i++) {
  -	    struct data s = stats[i];
  -	    mincon = ap_min(mincon, s.ctime);
  -	    mintot = ap_min(mintot, s.time);
  -	    maxcon = ap_max(maxcon, s.ctime);
  -	    maxtot = ap_max(maxtot, s.time);
  -	    totalcon += s.ctime;
  -	    total += s.time;
  -	}
  -
  -	if (requests > 0) {	/* avoid division by zero (if 0 requests) */
  -	    printf("<tr %s><th %s colspan=4>Connnection Times (ms)</th></tr>\n",
  -		   trstring, tdstring);
  -	    printf("<tr %s><th %s>&nbsp;</th> <th %s>min</th>   <th %s>avg</th>   <th %s>max</th></tr>\n",
  -		   trstring, tdstring, tdstring, tdstring, tdstring);
  -	    printf("<tr %s><th %s>Connect:</th>"
  -		   "<td %s>%5" APR_TIME_T_FMT "</td>"
  -		   "<td %s>%5" APR_TIME_T_FMT "</td>"
  -		   "<td %s>%5" APR_TIME_T_FMT "</td></tr>\n",
  -		   trstring, tdstring, tdstring, mincon, tdstring, totalcon / requests, tdstring, maxcon);
  -	    printf("<tr %s><th %s>Processing:</th>"
  -		   "<td %s>%5" APR_TIME_T_FMT "</td>"
  -		   "<td %s>%5" APR_TIME_T_FMT "</td>"
  -		   "<td %s>%5" APR_TIME_T_FMT "</td></tr>\n",
  -		   trstring, tdstring, tdstring, mintot - mincon, tdstring,
  -		   (total / requests) - (totalcon / requests), tdstring, maxtot - maxcon);
  -	    printf("<tr %s><th %s>Total:</th>"
  -		   "<td %s>%5" APR_TIME_T_FMT "</td>"
  -		   "<td %s>%5" APR_TIME_T_FMT "</td>"
  -		   "<td %s>%5" APR_TIME_T_FMT "</td></tr>\n",
  -		   trstring, tdstring, tdstring, mintot, tdstring, total / requests, tdstring, maxtot);
  -	}
  -	printf("</table>\n");
  +        printf("<tr %s><th colspan=2 %s>Requests per second:</th>"
  +           "<td colspan=2 %s>%.2f</td></tr>\n",
  +           trstring, tdstring, tdstring, 1000 * (float) (done) / timetaken);
  +        printf("<tr %s><th colspan=2 %s>Transfer rate:</th>"
  +           "<td colspan=2 %s>%.2f kb/s received</td></tr>\n",
  +           trstring, tdstring, tdstring, (float) (totalread) / timetaken);
  +        if (posting > 0) {
  +            printf("<tr %s><td colspan=2 %s>&nbsp;</td>"
  +               "<td colspan=2 %s>%.2f kb/s sent</td></tr>\n",
  +               trstring, tdstring, tdstring,
  +               (float) (totalposted) / timetaken);
  +            printf("<tr %s><td colspan=2 %s>&nbsp;</td>"
  +               "<td colspan=2 %s>%.2f kb/s total</td></tr>\n",
  +               trstring, tdstring, tdstring,
  +               (float) (totalread + totalposted) / timetaken);
  +        }
  +    } 
  +    {
  +        /* work out connection times */
  +        long i;
  +        apr_interval_time_t totalcon = 0, total = 0;
  +        apr_interval_time_t mincon = AB_MAX, mintot = AB_MAX;
  +        apr_interval_time_t maxcon = 0, maxtot = 0;
  +    
  +        for (i = 0; i < requests; i++) {
  +            struct data s = stats[i];
  +            mincon = ap_min(mincon, s.ctime);
  +            mintot = ap_min(mintot, s.time);
  +            maxcon = ap_max(maxcon, s.ctime);
  +            maxtot = ap_max(maxtot, s.time);
  +            totalcon += s.ctime;
  +            total += s.time;
  +        }
  +    
  +        if (requests > 0) { /* avoid division by zero (if 0 requests) */
  +            printf("<tr %s><th %s colspan=4>Connnection Times (ms)</th></tr>\n",
  +               trstring, tdstring);
  +            printf("<tr %s><th %s>&nbsp;</th> <th %s>min</th>   <th %s>avg</th>   <th %s>max</th></tr>\n",
  +               trstring, tdstring, tdstring, tdstring, tdstring);
  +            printf("<tr %s><th %s>Connect:</th>"
  +               "<td %s>%5" APR_TIME_T_FMT "</td>"
  +               "<td %s>%5" APR_TIME_T_FMT "</td>"
  +               "<td %s>%5" APR_TIME_T_FMT "</td></tr>\n",
  +               trstring, tdstring, tdstring, mincon, tdstring, totalcon / requests, tdstring, maxcon);
  +            printf("<tr %s><th %s>Processing:</th>"
  +               "<td %s>%5" APR_TIME_T_FMT "</td>"
  +               "<td %s>%5" APR_TIME_T_FMT "</td>"
  +               "<td %s>%5" APR_TIME_T_FMT "</td></tr>\n",
  +               trstring, tdstring, tdstring, mintot - mincon, tdstring,
  +               (total / requests) - (totalcon / requests), tdstring, maxtot - maxcon);
  +            printf("<tr %s><th %s>Total:</th>"
  +               "<td %s>%5" APR_TIME_T_FMT "</td>"
  +               "<td %s>%5" APR_TIME_T_FMT "</td>"
  +               "<td %s>%5" APR_TIME_T_FMT "</td></tr>\n",
  +               trstring, tdstring, tdstring, mintot, tdstring, total / requests, tdstring, maxtot);
  +        }
  +        printf("</table>\n");
       }
   }
   
  @@ -1199,7 +1201,7 @@
   #endif
       
       if (!(started < requests))
  -	return;
  +    return;
   
       c->read = 0;
       c->bread = 0;
  @@ -1212,8 +1214,8 @@
       apr_pool_create(&c->ctx, cntxt);
   
       if ((rv = apr_socket_create(&c->aprsock, destsa->family,
  -				SOCK_STREAM, 0, c->ctx)) != APR_SUCCESS) {
  -	apr_err("socket", rv);
  +                SOCK_STREAM, 0, c->ctx)) != APR_SUCCESS) {
  +    apr_err("socket", rv);
       }
       if ((rv = apr_socket_opt_set(c->aprsock, APR_SO_NONBLOCK, 1))
            != APR_SUCCESS) {
  @@ -1221,33 +1223,33 @@
       }
       c->start = apr_time_now();
       if ((rv = apr_socket_connect(c->aprsock, destsa)) != APR_SUCCESS) {
  -	if (APR_STATUS_IS_EINPROGRESS(rv)) {
  +        if (APR_STATUS_IS_EINPROGRESS(rv)) {
               apr_pollfd_t new_pollfd;
  -	    c->state = STATE_CONNECTING;
  -	    c->rwrite = 0;
  +            c->state = STATE_CONNECTING;
  +            c->rwrite = 0;
               new_pollfd.desc_type = APR_POLL_SOCKET;
               new_pollfd.reqevents = APR_POLLOUT;
               new_pollfd.desc.s = c->aprsock;
               new_pollfd.client_data = c;
  -	    apr_pollset_add(readbits, &new_pollfd);
  -	    return;
  -	}
  -	else {
  +            apr_pollset_add(readbits, &new_pollfd);
  +            return;
  +        }
  +        else {
               apr_pollfd_t remove_pollfd;
               remove_pollfd.desc_type = APR_POLL_SOCKET;
               remove_pollfd.desc.s = c->aprsock;
  -	    apr_pollset_remove(readbits, &remove_pollfd);
  -	    apr_socket_close(c->aprsock);
  -	    err_conn++;
  -	    if (bad++ > 10) {
  -		fprintf(stderr,
  -			"\nTest aborted after 10 failures\n\n");
  -		apr_err("apr_socket_connect()", rv);
  -	    }
  -	    c->state = STATE_UNCONNECTED;
  -	    start_connect(c);
  -	    return;
  -	}
  +            apr_pollset_remove(readbits, &remove_pollfd);
  +            apr_socket_close(c->aprsock);
  +            err_conn++;
  +            if (bad++ > 10) {
  +                fprintf(stderr,
  +                   "\nTest aborted after 10 failures\n\n");
  +                apr_err("apr_socket_connect()", rv);
  +            }
  +            c->state = STATE_UNCONNECTED;
  +            start_connect(c);
  +            return;
  +        }
       }
   
       /* connected first time */
  @@ -1263,36 +1265,36 @@
   static void close_connection(struct connection * c)
   {
       if (c->read == 0 && c->keepalive) {
  -	/*
  -	 * server has legitimately shut down an idle keep alive request
  -	 */
  -	if (good)
  -	    good--;		/* connection never happened */
  +        /*
  +         * server has legitimately shut down an idle keep alive request
  +         */
  +        if (good)
  +            good--;     /* connection never happened */
       }
       else {
  -	if (good == 1) {
  -	    /* first time here */
  -	    doclen = c->bread;
  -	}
  -	else if (c->bread != doclen) {
  -	    bad++;
  -	    err_length++;
  -	}
  -	/* save out time */
  -	if (done < requests) {
  -	    struct data s;
  -	    if ((done) && heartbeatres && !(done % heartbeatres)) {
  -		fprintf(stderr, "Completed %ld requests\n", done);
  -		fflush(stderr);
  -	    }
  -	    c->done = apr_time_now();
  -	    s.read = c->read;
  -	    s.starttime = c->start;
  -	    s.ctime = ap_max(0, (c->connect - c->start) / 1000);
  -	    s.time = ap_max(0, (c->done - c->start) / 1000);
  -	    s.waittime = ap_max(0, (c->beginread - c->endwrite) / 1000);
  -	    stats[done++] = s;
  -	}
  +        if (good == 1) {
  +            /* first time here */
  +            doclen = c->bread;
  +        }
  +        else if (c->bread != doclen) {
  +            bad++;
  +            err_length++;
  +        }
  +        /* save out time */
  +        if (done < requests) {
  +            struct data s;
  +            if ((done) && heartbeatres && !(done % heartbeatres)) {
  +                fprintf(stderr, "Completed %ld requests\n", done);
  +                fflush(stderr);
  +            }
  +            c->done = apr_time_now();
  +            s.read = c->read;
  +            s.starttime = c->start;
  +            s.ctime = ap_max(0, (c->connect - c->start) / 1000);
  +            s.time = ap_max(0, (c->done - c->start) / 1000);
  +            s.waittime = ap_max(0, (c->beginread - c->endwrite) / 1000);
  +            stats[done++] = s;
  +        }
       }
   
   #ifdef USE_SSL
  @@ -1325,7 +1327,7 @@
       apr_size_t r;
       apr_status_t status;
       char *part;
  -    char respcode[4];		/* 3 digits and null */
  +    char respcode[4];       /* 3 digits and null */
   
       r = sizeof(buffer);
   #ifdef USE_SSL
  @@ -1338,114 +1340,114 @@
               close_connection(c);
               return;
           }
  -    r = status;
  +        r = status;
       }
       else {
   #endif
  -    status = apr_socket_recv(c->aprsock, buffer, &r);
  -    if (APR_STATUS_IS_EAGAIN(status))
  -	return;
  -    else if (r == 0 && APR_STATUS_IS_EOF(status)) {
  -	good++;
  -	close_connection(c);
  -	return;
  -    }
  -    /* catch legitimate fatal apr_socket_recv errors */
  -    else if (status != APR_SUCCESS) {
  -        err_except++; /* XXX: is this the right error counter? */
  -        /* XXX: Should errors here be fatal, or should we allow a
  -         * certain number of them before completely failing? -aaron */
  -        apr_err("apr_socket_recv", status);
  -    }
  +        status = apr_socket_recv(c->aprsock, buffer, &r);
  +        if (APR_STATUS_IS_EAGAIN(status))
  +            return;
  +        else if (r == 0 && APR_STATUS_IS_EOF(status)) {
  +            good++;
  +            close_connection(c);
  +            return;
  +        }
  +        /* catch legitimate fatal apr_socket_recv errors */
  +        else if (status != APR_SUCCESS) {
  +            err_except++; /* XXX: is this the right error counter? */
  +            /* XXX: Should errors here be fatal, or should we allow a
  +             * certain number of them before completely failing? -aaron */
  +            apr_err("apr_socket_recv", status);
  +        }
   #ifdef USE_SSL
       }
   #endif
   
       totalread += r;
       if (c->read == 0) {
  -	c->beginread = apr_time_now();
  +        c->beginread = apr_time_now();
       }
       c->read += r;
   
   
       if (!c->gotheader) {
  -	char *s;
  -	int l = 4;
  -	apr_size_t space = CBUFFSIZE - c->cbx - 1; /* -1 allows for \0 term */
  -	int tocopy = (space < r) ? space : r;
  +        char *s;
  +        int l = 4;
  +        apr_size_t space = CBUFFSIZE - c->cbx - 1; /* -1 allows for \0 term */
  +        int tocopy = (space < r) ? space : r;
   #ifdef NOT_ASCII
  -	apr_size_t inbytes_left = space, outbytes_left = space;
  -
  -	status = apr_xlate_conv_buffer(from_ascii, buffer, &inbytes_left,
  -				       c->cbuff + c->cbx, &outbytes_left);
  -	if (status || inbytes_left || outbytes_left) {
  -	    fprintf(stderr, "only simple translation is supported (%d/%u/%u)\n",
  -		    status, inbytes_left, outbytes_left);
  -	    exit(1);
  -	}
  +        apr_size_t inbytes_left = space, outbytes_left = space;
  +    
  +        status = apr_xlate_conv_buffer(from_ascii, buffer, &inbytes_left,
  +                           c->cbuff + c->cbx, &outbytes_left);
  +        if (status || inbytes_left || outbytes_left) {
  +            fprintf(stderr, "only simple translation is supported (%d/%u/%u)\n",
  +                status, inbytes_left, outbytes_left);
  +            exit(1);
  +        }
   #else
  -	memcpy(c->cbuff + c->cbx, buffer, space);
  -#endif				/* NOT_ASCII */
  -	c->cbx += tocopy;
  -	space -= tocopy;
  -	c->cbuff[c->cbx] = 0;	/* terminate for benefit of strstr */
  +        memcpy(c->cbuff + c->cbx, buffer, space);
  +#endif              /* NOT_ASCII */
  +        c->cbx += tocopy;
  +        space -= tocopy;
  +        c->cbuff[c->cbx] = 0;   /* terminate for benefit of strstr */
           if (verbosity >= 2) {
  -	    printf("LOG: header received:\n%s\n", c->cbuff);
  -	}
  -	s = strstr(c->cbuff, "\r\n\r\n");
  -	/*
  -	 * this next line is so that we talk to NCSA 1.5 which blatantly
  -	 * breaks the http specifaction
  -	 */
  -	if (!s) {
  -	    s = strstr(c->cbuff, "\n\n");
  -	    l = 2;
  -	}
  -
  -	if (!s) {
  -	    /* read rest next time */
  -	    if (space) {
  -		return;
  -	    }
  -	    else {
  -		/* header is in invalid or too big - close connection */
  +            printf("LOG: header received:\n%s\n", c->cbuff);
  +        }
  +        s = strstr(c->cbuff, "\r\n\r\n");
  +        /*
  +         * this next line is so that we talk to NCSA 1.5 which blatantly
  +         * breaks the http specifaction
  +         */
  +        if (!s) {
  +            s = strstr(c->cbuff, "\n\n");
  +            l = 2;
  +        }
  +
  +        if (!s) {
  +            /* read rest next time */
  +            if (space) {
  +                return;
  +            }
  +            else {
  +            /* header is in invalid or too big - close connection */
                   apr_pollfd_t remove_pollfd;
                   remove_pollfd.desc_type = APR_POLL_SOCKET;
                   remove_pollfd.desc.s = c->aprsock;
                   apr_pollset_remove(readbits, &remove_pollfd);
  -		apr_socket_close(c->aprsock);
  -		err_response++;
  -		if (bad++ > 10) {
  -		    err("\nTest aborted after 10 failures\n\n");
  -		}
  -		start_connect(c);
  -	    }
  -	}
  -	else {
  -	    /* have full header */
  -	    if (!good) {
  -		/*
  -		 * this is first time, extract some interesting info
  -		 */
  -		char *p, *q;
  -		p = strstr(c->cbuff, "Server:");
  -		q = servername;
  -		if (p) {
  -		    p += 8;
  -		    while (*p > 32)
  -			*q++ = *p++;
  -		}
  -		*q = 0;
  -	    }
  -	    /*
  -	     * XXX: this parsing isn't even remotely HTTP compliant... but in
  -	     * the interest of speed it doesn't totally have to be, it just
  -	     * needs to be extended to handle whatever servers folks want to
  -	     * test against. -djg
  -	     */
  -
  -	    /* check response code */
  -	    part = strstr(c->cbuff, "HTTP");	/* really HTTP/1.x_ */
  +                apr_socket_close(c->aprsock);
  +                err_response++;
  +                if (bad++ > 10) {
  +                    err("\nTest aborted after 10 failures\n\n");
  +                }
  +                start_connect(c);
  +            }
  +        }
  +        else {
  +            /* have full header */
  +            if (!good) {
  +                /*
  +                 * this is first time, extract some interesting info
  +                 */
  +                char *p, *q;
  +                p = strstr(c->cbuff, "Server:");
  +                q = servername;
  +                if (p) {
  +                    p += 8;
  +                    while (*p > 32)
  +                    *q++ = *p++;
  +                }
  +                *q = 0;
  +            }
  +            /*
  +             * XXX: this parsing isn't even remotely HTTP compliant... but in
  +             * the interest of speed it doesn't totally have to be, it just
  +             * needs to be extended to handle whatever servers folks want to
  +             * test against. -djg
  +             */
  +    
  +            /* check response code */
  +            part = strstr(c->cbuff, "HTTP");    /* really HTTP/1.x_ */
               if (part && strlen(part) > strlen("HTTP/1.x_")) {
                   strncpy(respcode, (part + strlen("HTTP/1.x_")), 3);
                   respcode[3] = '\0';
  @@ -1453,74 +1455,74 @@
               else {
                   strcpy(respcode, "500");
               }
  -
  -	    if (respcode[0] != '2') {
  -		err_response++;
  -		if (verbosity >= 2)
  -		    printf("WARNING: Response code not 2xx (%s)\n", respcode);
  -	    }
  -	    else if (verbosity >= 3) {
  -		printf("LOG: Response code = %s\n", respcode);
  -	    }
  -	    c->gotheader = 1;
  -	    *s = 0;		/* terminate at end of header */
  -	    if (keepalive &&
  -		(strstr(c->cbuff, "Keep-Alive")
  -		 || strstr(c->cbuff, "keep-alive"))) {	/* for benefit of MSIIS */
  -		char *cl;
  -		cl = strstr(c->cbuff, "Content-Length:");
  -		/* handle NCSA, which sends Content-length: */
  -		if (!cl)
  -		    cl = strstr(c->cbuff, "Content-length:");
  -		if (cl) {
  -		    c->keepalive = 1;
  -		    c->length = atoi(cl + 16);
  -		}
  -	    }
  -	    c->bread += c->cbx - (s + l - c->cbuff) + r - tocopy;
  -	    totalbread += c->bread;
  -	}
  +    
  +            if (respcode[0] != '2') {
  +                err_response++;
  +                if (verbosity >= 2)
  +                    printf("WARNING: Response code not 2xx (%s)\n", respcode);
  +            }
  +            else if (verbosity >= 3) {
  +                printf("LOG: Response code = %s\n", respcode);
  +            }
  +            c->gotheader = 1;
  +            *s = 0;     /* terminate at end of header */
  +            if (keepalive &&
  +            (strstr(c->cbuff, "Keep-Alive")
  +             || strstr(c->cbuff, "keep-alive"))) {  /* for benefit of MSIIS */
  +                char *cl;
  +                cl = strstr(c->cbuff, "Content-Length:");
  +                /* handle NCSA, which sends Content-length: */
  +                if (!cl)
  +                    cl = strstr(c->cbuff, "Content-length:");
  +                if (cl) {
  +                    c->keepalive = 1;
  +                    c->length = atoi(cl + 16);
  +                }
  +            }
  +            c->bread += c->cbx - (s + l - c->cbuff) + r - tocopy;
  +            totalbread += c->bread;
  +        }
       }
       else {
  -	/* outside header, everything we have read is entity body */
  -	c->bread += r;
  -	totalbread += r;
  +        /* outside header, everything we have read is entity body */
  +        c->bread += r;
  +        totalbread += r;
       }
   
       if (c->keepalive && (c->bread >= c->length)) {
  -	/* finished a keep-alive connection */
  -	good++;
  -	/* save out time */
  -	if (good == 1) {
  -	    /* first time here */
  -	    doclen = c->bread;
  -	}
  -	else if (c->bread != doclen) {
  -	    bad++;
  -	    err_length++;
  -	}
  -	if (done < requests) {
  -	    struct data s;
  -	    doneka++;
  -	    if (done && heartbeatres && !(done % heartbeatres)) {
  -		fprintf(stderr, "Completed %ld requests\n", done);
  -		fflush(stderr);
  -	    }
  -	    c->done = apr_time_now();
  -	    s.read = c->read;
  -	    s.starttime = c->start;
  -	    s.ctime = ap_max(0, (c->connect - c->start) / 1000);
  -	    s.waittime = ap_max(0, (c->beginread - c->endwrite) / 1000);
  -	    s.time = ap_max(0, (c->done - c->start) / 1000);
  -	    stats[done++] = s;
  -	}
  -	c->keepalive = 0;
  -	c->length = 0;
  -	c->gotheader = 0;
  -	c->cbx = 0;
  -	c->read = c->bread = 0;
  -	c->start = c->connect = apr_time_now();	/* zero connect time with keep-alive */
  -	write_request(c);
  +        /* finished a keep-alive connection */
  +        good++;
  +        /* save out time */
  +        if (good == 1) {
  +            /* first time here */
  +            doclen = c->bread;
  +        }
  +        else if (c->bread != doclen) {
  +            bad++;
  +            err_length++;
  +        }
  +        if (done < requests) {
  +            struct data s;
  +            doneka++;
  +            if (done && heartbeatres && !(done % heartbeatres)) {
  +                fprintf(stderr, "Completed %ld requests\n", done);
  +                fflush(stderr);
  +            }
  +            c->done = apr_time_now();
  +            s.read = c->read;
  +            s.starttime = c->start;
  +            s.ctime = ap_max(0, (c->connect - c->start) / 1000);
  +            s.waittime = ap_max(0, (c->beginread - c->endwrite) / 1000);
  +            s.time = ap_max(0, (c->done - c->start) / 1000);
  +            stats[done++] = s;
  +        }
  +        c->keepalive = 0;
  +        c->length = 0;
  +        c->gotheader = 0;
  +        c->cbx = 0;
  +        c->read = c->bread = 0;
  +        c->start = c->connect = apr_time_now(); /* zero connect time with keep-alive */
  +        write_request(c);
       }
   }
   
  @@ -1539,21 +1541,21 @@
   #endif
   
       if (isproxy) {
  -	connecthost = apr_pstrdup(cntxt, proxyhost);
  -	connectport = proxyport;
  +        connecthost = apr_pstrdup(cntxt, proxyhost);
  +        connectport = proxyport;
       }
       else {
  -	connecthost = apr_pstrdup(cntxt, hostname);
  -	connectport = port;
  +        connecthost = apr_pstrdup(cntxt, hostname);
  +        connectport = port;
       }
   
       if (!use_html) {
  -	printf("Benchmarking %s ", hostname);
  -	if (isproxy)
  -	    printf("[through %s:%d] ", proxyhost, proxyport);
  -	printf("(be patient)%s",
  -	       (heartbeatres ? "\n" : "..."));
  -	fflush(stdout);
  +        printf("Benchmarking %s ", hostname);
  +    if (isproxy)
  +        printf("[through %s:%d] ", proxyhost, proxyport);
  +    printf("(be patient)%s",
  +           (heartbeatres ? "\n" : "..."));
  +    fflush(stdout);
       }
   
       now = apr_time_now();
  @@ -1568,38 +1570,38 @@
   
       /* setup request */
       if (posting <= 0) {
  -	sprintf(request, "%s %s HTTP/1.0\r\n"
  -		"User-Agent: ApacheBench/%s\r\n"
  -		"%s" "%s" "%s"
  -		"Host: %s%s\r\n"
  -		"Accept: */*\r\n"
  -		"%s" "\r\n",
  -		(posting == 0) ? "GET" : "HEAD",
  -		(isproxy) ? fullurl : path,
  -		AP_AB_BASEREVISION,
  -		keepalive ? "Connection: Keep-Alive\r\n" : "",
  -		cookie, auth, host_field, colonhost, hdrs);
  +        sprintf(request, "%s %s HTTP/1.0\r\n"
  +            "User-Agent: ApacheBench/%s\r\n"
  +            "%s" "%s" "%s"
  +            "Host: %s%s\r\n"
  +            "Accept: */*\r\n"
  +            "%s" "\r\n",
  +            (posting == 0) ? "GET" : "HEAD",
  +            (isproxy) ? fullurl : path,
  +            AP_AB_BASEREVISION,
  +            keepalive ? "Connection: Keep-Alive\r\n" : "",
  +            cookie, auth, host_field, colonhost, hdrs);
       }
       else {
  -	sprintf(request, "POST %s HTTP/1.0\r\n"
  -		"User-Agent: ApacheBench/%s\r\n"
  -		"%s" "%s" "%s"
  -		"Host: %s%s\r\n"
  -		"Accept: */*\r\n"
  -		"Content-length: %" APR_SIZE_T_FMT "\r\n"
  -		"Content-type: %s\r\n"
  -		"%s"
  -		"\r\n",
  -		(isproxy) ? fullurl : path,
  -		AP_AB_BASEREVISION,
  -		keepalive ? "Connection: Keep-Alive\r\n" : "",
  -		cookie, auth,
  -		host_field, colonhost, postlen,
  -		(content_type[0]) ? content_type : "text/plain", hdrs);
  +        sprintf(request, "POST %s HTTP/1.0\r\n"
  +            "User-Agent: ApacheBench/%s\r\n"
  +            "%s" "%s" "%s"
  +            "Host: %s%s\r\n"
  +            "Accept: */*\r\n"
  +            "Content-length: %" APR_SIZE_T_FMT "\r\n"
  +            "Content-type: %s\r\n"
  +            "%s"
  +            "\r\n",
  +            (isproxy) ? fullurl : path,
  +            AP_AB_BASEREVISION,
  +            keepalive ? "Connection: Keep-Alive\r\n" : "",
  +            cookie, auth,
  +            host_field, colonhost, postlen,
  +            (content_type[0]) ? content_type : "text/plain", hdrs);
       }
   
       if (verbosity >= 2)
  -	printf("INFO: POST header == \n---\n%s\n---\n", request);
  +        printf("INFO: POST header == \n---\n%s\n---\n", request);
   
       reqlen = strlen(request);
   
  @@ -1607,37 +1609,37 @@
        * Combine headers and (optional) post file into one contineous buffer
        */
       if (posting == 1) {
  -	char *buff = malloc(postlen + reqlen + 1);
  +        char *buff = malloc(postlen + reqlen + 1);
           if (!buff) {
               fprintf(stderr, "error creating request buffer: out of memory\n");
               return;
           }
  -	strcpy(buff, request);
  -	strcpy(buff + reqlen, postdata);
  -	request = buff;
  +        strcpy(buff, request);
  +        strcpy(buff + reqlen, postdata);
  +        request = buff;
       }
   
   #ifdef NOT_ASCII
       inbytes_left = outbytes_left = reqlen;
       status = apr_xlate_conv_buffer(to_ascii, request, &inbytes_left,
  -				   request, &outbytes_left);
  +                   request, &outbytes_left);
       if (status || inbytes_left || outbytes_left) {
  -	fprintf(stderr, "only simple translation is supported (%d/%u/%u)\n",
  -		status, inbytes_left, outbytes_left);
  -	exit(1);
  +        fprintf(stderr, "only simple translation is supported (%d/%u/%u)\n",
  +           status, inbytes_left, outbytes_left);
  +        exit(1);
       }
  -#endif				/* NOT_ASCII */
  +#endif              /* NOT_ASCII */
   
       /* This only needs to be done once */
   #ifdef USE_SSL
       if (ssl != 1)
   #endif
       if ((rv = apr_sockaddr_info_get(&destsa, connecthost, APR_UNSPEC, connectport, 0, cntxt))
  -	!= APR_SUCCESS) {
  -	char buf[120];
  -	apr_snprintf(buf, sizeof(buf),
  -		     "apr_sockaddr_info_get() for %s", connecthost);
  -	apr_err(buf, rv);
  +       != APR_SUCCESS) {
  +        char buf[120];
  +        apr_snprintf(buf, sizeof(buf),
  +                 "apr_sockaddr_info_get() for %s", connecthost);
  +        apr_err(buf, rv);
       }
   
       /* ok - lets start */
  @@ -1645,41 +1647,41 @@
   
       /* initialise lots of requests */
       for (i = 0; i < concurrency; i++) {
  -	con[i].socknum = i;
  -	start_connect(&con[i]);
  +        con[i].socknum = i;
  +        start_connect(&con[i]);
       }
   
       while (done < requests) {
  -	apr_int32_t n;
  -	apr_int32_t timed;
  -        const apr_pollfd_t *pollresults;
  -
  -	/* check for time limit expiry */
  -	now = apr_time_now();
  -	timed = (apr_int32_t)apr_time_sec(now - start);
  -	if (tlimit && timed >= tlimit) {
  -	    requests = done;	/* so stats are correct */
  -	    break;		/* no need to do another round */
  -	}
  -
  -	n = concurrency;
  +        apr_int32_t n;
  +        apr_int32_t timed;
  +            const apr_pollfd_t *pollresults;
  +    
  +        /* check for time limit expiry */
  +        now = apr_time_now();
  +        timed = (apr_int32_t)apr_time_sec(now - start);
  +        if (tlimit && timed >= tlimit) {
  +            requests = done;    /* so stats are correct */
  +            break;      /* no need to do another round */
  +        }
  +    
  +        n = concurrency;
   #ifdef USE_SSL
           if (ssl == 1)
               status = APR_SUCCESS;
           else
   #endif
  -	status = apr_pollset_poll(readbits, aprtimeout, &n, &pollresults);
  -	if (status != APR_SUCCESS)
  -	    apr_err("apr_poll", status);
  -
  -	if (!n) {
  -	    err("\nServer timed out\n\n");
  -	}
  -
  -	for (i = 0; i < n; i++) {
  +        status = apr_pollset_poll(readbits, aprtimeout, &n, &pollresults);
  +        if (status != APR_SUCCESS)
  +            apr_err("apr_poll", status);
  +    
  +        if (!n) {
  +            err("\nServer timed out\n\n");
  +        }
  +    
  +        for (i = 0; i < n; i++) {
               const apr_pollfd_t *next_fd = &(pollresults[i]);
               struct connection *c;
  -            
  +                
   #ifdef USE_SSL
               if (ssl) 
                   c = &con[i];
  @@ -1687,40 +1689,40 @@
   #endif
                   c = next_fd->client_data;
   
  -	    /*
  -	     * If the connection isn't connected how can we check it?
  -	     */
  -	    if (c->state == STATE_UNCONNECTED)
  -		continue;
  -
  +            /*
  +             * If the connection isn't connected how can we check it?
  +             */
  +            if (c->state == STATE_UNCONNECTED)
  +                continue;
  +    
   #ifdef USE_SSL
               if (ssl == 1)
                   rv = APR_POLLIN;
               else
   #endif
  -            rv = next_fd->rtnevents;
  +                rv = next_fd->rtnevents;
   
  -	    /*
  -	     * Notes: APR_POLLHUP is set after FIN is received on some
  -	     * systems, so treat that like APR_POLLIN so that we try to read
  -	     * again.
  -	     *
  -	     * Some systems return APR_POLLERR with APR_POLLHUP.  We need to
  -	     * call read_connection() for APR_POLLHUP, so check for
  -	     * APR_POLLHUP first so that a closed connection isn't treated
  -	     * like an I/O error.  If it is, we never figure out that the
  -	     * connection is done and we loop here endlessly calling
  -	     * apr_poll().
  -	     */
  -	    if ((rv & APR_POLLIN) || (rv & APR_POLLPRI) || (rv & APR_POLLHUP))
  -		read_connection(c);
  -	    if ((rv & APR_POLLERR) || (rv & APR_POLLNVAL)) {
  -		bad++;
  -		err_except++;
  -		start_connect(c);
  -		continue;
  -	    }
  -	    if (rv & APR_POLLOUT) {
  +            /*
  +             * Notes: APR_POLLHUP is set after FIN is received on some
  +             * systems, so treat that like APR_POLLIN so that we try to read
  +             * again.
  +             *
  +             * Some systems return APR_POLLERR with APR_POLLHUP.  We need to
  +             * call read_connection() for APR_POLLHUP, so check for
  +             * APR_POLLHUP first so that a closed connection isn't treated
  +             * like an I/O error.  If it is, we never figure out that the
  +             * connection is done and we loop here endlessly calling
  +             * apr_poll().
  +             */
  +            if ((rv & APR_POLLIN) || (rv & APR_POLLPRI) || (rv & APR_POLLHUP))
  +                read_connection(c);
  +            if ((rv & APR_POLLERR) || (rv & APR_POLLNVAL)) {
  +                bad++;
  +                err_except++;
  +                start_connect(c);
  +                continue;
  +            }
  +            if (rv & APR_POLLOUT) {
                   if (c->state == STATE_CONNECTING) {
                       apr_pollfd_t remove_pollfd;
                       rv = apr_socket_connect(c->aprsock, destsa);
  @@ -1748,14 +1750,14 @@
                       write_request(c);
                   }
               }
  -
  -	    /*
  -	     * When using a select based poll every time we check the bits
  -	     * are reset. In 1.3's ab we copied the FD_SET's each time
  -	     * through, but here we're going to check the state and if the
  -	     * connection is in STATE_READ or STATE_CONNECTING we'll add the
  -	     * socket back in as APR_POLLIN.
  -	     */
  +    
  +            /*
  +             * When using a select based poll every time we check the bits
  +             * are reset. In 1.3's ab we copied the FD_SET's each time
  +             * through, but here we're going to check the state and if the
  +             * connection is in STATE_READ or STATE_CONNECTING we'll add the
  +             * socket back in as APR_POLLIN.
  +             */
   #ifdef USE_SSL
               if (ssl != 1)
   #endif
  @@ -1767,18 +1769,18 @@
                       new_pollfd.client_data = c;
                       apr_pollset_add(readbits, &new_pollfd);
                   }
  -	}
  +        }
       }
   
       if (heartbeatres)
  -	fprintf(stderr, "Finished %ld requests\n", done);
  +        fprintf(stderr, "Finished %ld requests\n", done);
       else
  -	printf("..done\n");
  +        printf("..done\n");
   
       if (use_html)
  -	output_html_results();
  +        output_html_results();
       else
  -	output_results();
  +        output_results();
   }
   
   /* ------------------------------------------------------- */
  @@ -1787,17 +1789,17 @@
   static void copyright(void)
   {
       if (!use_html) {
  -	printf("This is ApacheBench, Version %s\n", AP_AB_BASEREVISION " <$Revision$> apache-2.0");
  -	printf("Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/\n");
  -	printf("Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/\n");
  -	printf("\n");
  +        printf("This is ApacheBench, Version %s\n", AP_AB_BASEREVISION " <$Revision$> apache-2.0");
  +        printf("Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/\n");
  +        printf("Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/\n");
  +        printf("\n");
       }
       else {
  -	printf("<p>\n");
  -	printf(" This is ApacheBench, Version %s <i>&lt;%s&gt;</i> apache-2.0<br>\n", AP_AB_BASEREVISION, "$Revision$");
  -	printf(" Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/<br>\n");
  -	printf(" Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/<br>\n");
  -	printf("</p>\n<p>\n");
  +        printf("<p>\n");
  +        printf(" This is ApacheBench, Version %s <i>&lt;%s&gt;</i> apache-2.0<br>\n", AP_AB_BASEREVISION, "$Revision$");
  +        printf(" Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/<br>\n");
  +        printf(" Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/<br>\n");
  +        printf("</p>\n<p>\n");
       }
   }
   
  @@ -1806,9 +1808,9 @@
   {
       fprintf(stderr, "Usage: %s [options] [http"
   #ifdef USE_SSL
  -	    "[s]"
  +        "[s]"
   #endif
  -	    "://]hostname[:port]/path\n", progname);
  +        "://]hostname[:port]/path\n", progname);
       fprintf(stderr, "Options are:\n");
       fprintf(stderr, "    -n requests     Number of requests to perform\n");
       fprintf(stderr, "    -c concurrency  Number of multiple requests to make\n");
  @@ -1857,49 +1859,49 @@
       fullurl = apr_pstrdup(cntxt, url);
   
       if (strlen(url) > 7 && strncmp(url, "http://", 7) == 0) {
  -	url += 7;
  +        url += 7;
   #ifdef USE_SSL
  -	ssl = 0;
  +        ssl = 0;
   #endif
       }
       else
   #ifdef USE_SSL
       if (strlen(url) > 8 && strncmp(url, "https://", 8) == 0) {
  -	url += 8;
  -	ssl = 1;
  +        url += 8;
  +        ssl = 1;
       }
   #else
       if (strlen(url) > 8 && strncmp(url, "https://", 8) == 0) {
  -	fprintf(stderr, "SSL not compiled in; no https support\n");
  -	exit(1);
  +        fprintf(stderr, "SSL not compiled in; no https support\n");
  +        exit(1);
       }
   #endif
   
       if ((cp = strchr(url, '/')) == NULL)
  -	return 1;
  +        return 1;
       h = apr_palloc(cntxt, cp - url + 1);
       memcpy(h, url, cp - url);
       h[cp - url] = '\0';
       rv = apr_parse_addr_port(&hostname, &scope_id, &port, h, cntxt);
       if (rv != APR_SUCCESS || !hostname || scope_id) {
  -	return 1;
  +        return 1;
       }
       path = apr_pstrdup(cntxt, cp);
       *cp = '\0';
  -    if (*url == '[') {		/* IPv6 numeric address string */
  -	host_field = apr_psprintf(cntxt, "[%s]", hostname);
  +    if (*url == '[') {      /* IPv6 numeric address string */
  +        host_field = apr_psprintf(cntxt, "[%s]", hostname);
       }
       else {
  -	host_field = hostname;
  +        host_field = hostname;
       }
   
  -    if (port == 0) {		/* no port specified */
  +    if (port == 0) {        /* no port specified */
   #ifdef USE_SSL
           if (ssl == 1)
               port = 443;
           else
   #endif
  -            port = 80;
  +        port = 80;
       }
   
       if ((
  @@ -1908,9 +1910,9 @@
   #endif
            (port != 80)))
       {
  -	colonhost = apr_psprintf(cntxt,":%d",port);
  +        colonhost = apr_psprintf(cntxt,":%d",port);
       } else
  -	colonhost = "";
  +        colonhost = "";
       return 0;
   }
   
  @@ -1929,30 +1931,30 @@
   
       rv = apr_file_open(&postfd, pfile, APR_READ, mode, cntxt);
       if (rv != APR_SUCCESS) {
  -	printf("Invalid postfile name (%s): %s\n", pfile,
  -	       apr_strerror(rv, errmsg, sizeof errmsg));
  -	return rv;
  +        printf("Invalid postfile name (%s): %s\n", pfile,
  +           apr_strerror(rv, errmsg, sizeof errmsg));
  +        return rv;
       }
   
       apr_file_info_get(&finfo, APR_FINFO_NORM, postfd);
       postlen = (apr_size_t)finfo.size;
       postdata = (char *) malloc(postlen);
       if (!postdata) {
  -	printf("Can\'t alloc postfile buffer\n");
  -	return APR_ENOMEM;
  +        printf("Can\'t alloc postfile buffer\n");
  +        return APR_ENOMEM;
       }
       length = postlen;
       rv = apr_file_read(postfd, postdata, &length);
       if (rv != APR_SUCCESS) {
  -	printf("error reading postfile: %s\n",
  -	       apr_strerror(rv, errmsg, sizeof errmsg));
  -	return rv;
  +        printf("error reading postfile: %s\n",
  +           apr_strerror(rv, errmsg, sizeof errmsg));
  +        return rv;
       }
       if (length != postlen) {
  -	printf("error reading postfile: read only %"
  -	       APR_SIZE_T_FMT " bytes",
  -	       length);
  -	return APR_EINVAL;
  +        printf("error reading postfile: read only %"
  +           APR_SIZE_T_FMT " bytes",
  +           length);
  +        return APR_EINVAL;
       }
       apr_file_close(postfd);
       return 0;
  @@ -1986,194 +1988,193 @@
   #ifdef NOT_ASCII
       status = apr_xlate_open(&to_ascii, "ISO8859-1", APR_DEFAULT_CHARSET, cntxt);
       if (status) {
  -	fprintf(stderr, "apr_xlate_open(to ASCII)->%d\n", status);
  -	exit(1);
  +        fprintf(stderr, "apr_xlate_open(to ASCII)->%d\n", status);
  +        exit(1);
       }
       status = apr_xlate_open(&from_ascii, APR_DEFAULT_CHARSET, "ISO8859-1", cntxt);
       if (status) {
  -	fprintf(stderr, "apr_xlate_open(from ASCII)->%d\n", status);
  -	exit(1);
  +        fprintf(stderr, "apr_xlate_open(from ASCII)->%d\n", status);
  +        exit(1);
       }
       status = apr_base64init_ebcdic(to_ascii, from_ascii);
       if (status) {
  -	fprintf(stderr, "apr_base64init_ebcdic()->%d\n", status);
  -	exit(1);
  +        fprintf(stderr, "apr_base64init_ebcdic()->%d\n", status);
  +        exit(1);
       }
   #endif
   
       apr_getopt_init(&opt, cntxt, argc, argv);
       while ((status = apr_getopt(opt, "n:c:t:T:p:v:kVhwix:y:z:C:H:P:A:g:X:de:Sq"
   #ifdef USE_SSL
  -				"s"
  +            "s"
   #endif
  -				,&c, &optarg)) == APR_SUCCESS) {
  -	switch (c) {
  -	case 's':
  +            ,&c, &optarg)) == APR_SUCCESS) {
  +        switch (c) {
  +            case 's':
   #ifdef USE_SSL
  -        ssl = 1;
  -        break;
  +                ssl = 1;
  +                break;
   #else
  -        fprintf(stderr, "SSL not compiled in; no https support\n");
  -        exit(1);
  +                fprintf(stderr, "SSL not compiled in; no https support\n");
  +                exit(1);
   #endif
  -	case 'n':
  -	    requests = atoi(optarg);
  -	    if (!requests) {
  -		err("Invalid number of requests\n");
  -	    }
  -	    break;
  -	case 'k':
  -	    keepalive = 1;
  -	    break;
  -	case 'q':
  -	    heartbeatres = 0;
  -	    break;
  -	case 'c':
  -	    concurrency = atoi(optarg);
  -	    break;
  -	case 'i':
  -	    if (posting == 1)
  -		err("Cannot mix POST and HEAD\n");
  -	    posting = -1;
  -	    break;
  -	case 'g':
  -	    gnuplot = strdup(optarg);
  -	    break;
  -	case 'd':
  -	    percentile = 0;
  -	    break;
  -	case 'e':
  -	    csvperc = strdup(optarg);
  -	    break;
  -	case 'S':
  -	    confidence = 0;
  -	    break;
  -	case 'p':
  -	    if (posting != 0)
  -		err("Cannot mix POST and HEAD\n");
  -
  -	    if (0 == (r = open_postfile(optarg))) {
  -		posting = 1;
  -	    }
  -	    else if (postdata) {
  -		exit(r);
  -	    }
  -	    break;
  -	case 'v':
  -	    verbosity = atoi(optarg);
  -	    break;
  -	case 't':
  -	    tlimit = atoi(optarg);
  -	    requests = MAX_REQUESTS;	/* need to size data array on
  -					 * something */
  -	    break;
  -	case 'T':
  -	    strcpy(content_type, optarg);
  -	    break;
  -	case 'C':
  -            cookie = apr_pstrcat(cntxt, "Cookie: ", optarg, "\r\n", NULL);
  -	    break;
  -	case 'A':
  -	    /*
  -	     * assume username passwd already to be in colon separated form.
  -	     * Ready to be uu-encoded.
  -	     */
  -	    while (apr_isspace(*optarg))
  -		optarg++;
  -            if (apr_base64_encode_len(strlen(optarg)) > sizeof(tmp)) {
  -                err("Authentication credentials too long\n");
  -            }
  -	    l = apr_base64_encode(tmp, optarg, strlen(optarg));
  -	    tmp[l] = '\0';
  -
  -            auth = apr_pstrcat(cntxt, auth, "Authorization: Basic ", tmp,
  -                               "\r\n", NULL);
  -	    break;
  -	case 'P':
  -	    /*
  -             * assume username passwd already to be in colon separated form.
  -             */
  -	    while (apr_isspace(*optarg))
  -		optarg++;
  -            if (apr_base64_encode_len(strlen(optarg)) > sizeof(tmp)) {
  -                err("Proxy credentials too long\n");
  -            }
  -	    l = apr_base64_encode(tmp, optarg, strlen(optarg));
  -	    tmp[l] = '\0';
  -
  -            auth = apr_pstrcat(cntxt, auth, "Proxy-Authorization: Basic ",
  -                               tmp, "\r\n", NULL);
  -	    break;
  -	case 'H':
  -            hdrs = apr_pstrcat(cntxt, hdrs, optarg, "\r\n", NULL);
  -	    break;
  -	case 'w':
  -	    use_html = 1;
  -	    break;
  -	    /*
  -	     * if any of the following three are used, turn on html output
  -	     * automatically
  -	     */
  -	case 'x':
  -	    use_html = 1;
  -	    tablestring = optarg;
  -	    break;
  -	case 'X':
  -	    {
  -		char *p;
  -		/*
  -                 * assume proxy-name[:port]
  +            case 'n':
  +                requests = atoi(optarg);
  +                if (!requests) {
  +                    err("Invalid number of requests\n");
  +                }
  +                break;
  +            case 'k':
  +                keepalive = 1;
  +                break;
  +            case 'q':
  +                heartbeatres = 0;
  +                break;
  +            case 'c':
  +                concurrency = atoi(optarg);
  +                break;
  +            case 'i':
  +                if (posting == 1)
  +                err("Cannot mix POST and HEAD\n");
  +                posting = -1;
  +                break;
  +            case 'g':
  +                gnuplot = strdup(optarg);
  +                break;
  +            case 'd':
  +                percentile = 0;
  +                break;
  +            case 'e':
  +                csvperc = strdup(optarg);
  +                break;
  +            case 'S':
  +                confidence = 0;
  +                break;
  +            case 'p':
  +                if (posting != 0)
  +                    err("Cannot mix POST and HEAD\n");
  +                if (0 == (r = open_postfile(optarg))) {
  +                    posting = 1;
  +                }
  +                else if (postdata) {
  +                    exit(r);
  +                }
  +                break;
  +            case 'v':
  +                verbosity = atoi(optarg);
  +                break;
  +            case 't':
  +                tlimit = atoi(optarg);
  +                requests = MAX_REQUESTS;    /* need to size data array on
  +                                             * something */
  +                break;
  +            case 'T':
  +                strcpy(content_type, optarg);
  +                break;
  +            case 'C':
  +                cookie = apr_pstrcat(cntxt, "Cookie: ", optarg, "\r\n", NULL);
  +                break;
  +            case 'A':
  +                /*
  +                 * assume username passwd already to be in colon separated form.
  +                 * Ready to be uu-encoded.
  +                 */
  +                while (apr_isspace(*optarg))
  +                    optarg++;
  +                if (apr_base64_encode_len(strlen(optarg)) > sizeof(tmp)) {
  +                    err("Authentication credentials too long\n");
  +                }
  +                l = apr_base64_encode(tmp, optarg, strlen(optarg));
  +                tmp[l] = '\0';
  +        
  +                auth = apr_pstrcat(cntxt, auth, "Authorization: Basic ", tmp,
  +                                       "\r\n", NULL);
  +                break;
  +            case 'P':
  +                /*
  +                 * assume username passwd already to be in colon separated form.
  +                 */
  +                while (apr_isspace(*optarg))
  +                optarg++;
  +                if (apr_base64_encode_len(strlen(optarg)) > sizeof(tmp)) {
  +                    err("Proxy credentials too long\n");
  +                }
  +                l = apr_base64_encode(tmp, optarg, strlen(optarg));
  +                tmp[l] = '\0';
  +        
  +                auth = apr_pstrcat(cntxt, auth, "Proxy-Authorization: Basic ",
  +                                       tmp, "\r\n", NULL);
  +                break;
  +            case 'H':
  +                hdrs = apr_pstrcat(cntxt, hdrs, optarg, "\r\n", NULL);
  +                break;
  +            case 'w':
  +                use_html = 1;
  +                break;
  +                /*
  +                 * if any of the following three are used, turn on html output
  +                 * automatically
                    */
  -		if ((p = strchr(optarg, ':'))) {
  -		    *p = '\0';
  -		    p++;
  -		    proxyport = atoi(p);
  -		}
  -		strcpy(proxyhost, optarg);
  -		isproxy = 1;
  -	    }
  -	    break;
  -	case 'y':
  -	    use_html = 1;
  -	    trstring = optarg;
  -	    break;
  -	case 'z':
  -	    use_html = 1;
  -	    tdstring = optarg;
  -	    break;
  -	case 'h':
  -	    usage(argv[0]);
  -	    break;
  -	case 'V':
  -	    copyright();
  -	    return 0;
  -	}
  +            case 'x':
  +                use_html = 1;
  +                tablestring = optarg;
  +                break;
  +            case 'X':
  +                {
  +                    char *p;
  +                    /*
  +                     * assume proxy-name[:port]
  +                     */
  +                    if ((p = strchr(optarg, ':'))) {
  +                        *p = '\0';
  +                        p++;
  +                        proxyport = atoi(p);
  +                    }
  +                    strcpy(proxyhost, optarg);
  +                    isproxy = 1;
  +                }
  +                break;
  +            case 'y':
  +                use_html = 1;
  +                trstring = optarg;
  +                break;
  +            case 'z':
  +                use_html = 1;
  +                tdstring = optarg;
  +                break;
  +            case 'h':
  +                usage(argv[0]);
  +                break;
  +            case 'V':
  +                copyright();
  +                return 0;
  +        }
       }
   
       if (opt->ind != argc - 1) {
  -	fprintf(stderr, "%s: wrong number of arguments\n", argv[0]);
  -	usage(argv[0]);
  +        fprintf(stderr, "%s: wrong number of arguments\n", argv[0]);
  +        usage(argv[0]);
       }
   
       if (parse_url(apr_pstrdup(cntxt, opt->argv[opt->ind++]))) {
  -	fprintf(stderr, "%s: invalid URL\n", argv[0]);
  -	usage(argv[0]);
  +        fprintf(stderr, "%s: invalid URL\n", argv[0]);
  +        usage(argv[0]);
       }
   
       if ((concurrency < 0) || (concurrency > MAX_CONCURRENCY)) {
  -	fprintf(stderr, "%s: Invalid Concurrency [Range 0..%d]\n",
  +        fprintf(stderr, "%s: Invalid Concurrency [Range 0..%d]\n",
                   argv[0], MAX_CONCURRENCY);
           usage(argv[0]);
       }
   
       if ((heartbeatres) && (requests > 150)) {
  -	heartbeatres = requests / 10;	/* Print line every 10% of requests */
  -	if (heartbeatres < 100)
  -	    heartbeatres = 100;	/* but never more often than once every 100
  -				 * connections. */
  +        heartbeatres = requests / 10;   /* Print line every 10% of requests */
  +        if (heartbeatres < 100)
  +            heartbeatres = 100; /* but never more often than once every 100
  +                                 * connections. */
       }
       else
  -	heartbeatres = 0;
  +        heartbeatres = 0;
   
   #ifdef USE_SSL
   #ifdef RSAREF
  @@ -2188,9 +2189,9 @@
   
       /* TODO: Allow force SSLv2_client_method() (TLSv1?) */
       if (!(ctx = SSL_CTX_new(SSLv23_client_method()))) {
  -	fprintf(stderr, "Could not init SSL CTX");
  -	ERR_print_errors_fp(stderr);
  -	exit(1);
  +        fprintf(stderr, "Could not init SSL CTX");
  +        ERR_print_errors_fp(stderr);
  +        exit(1);
       }
       SSL_CTX_set_options(ctx, SSL_OP_ALL);
   #ifdef USE_THREADS
  @@ -2199,7 +2200,7 @@
   #endif
   #ifdef SIGPIPE
       apr_signal(SIGPIPE, SIG_IGN);       /* Ignore writes to connections that
  -					 * have been closed at the other end. */
  +                                         * have been closed at the other end. */
   #endif
       copyright();
       test();