You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by di...@covalent.net on 2002/05/02 12:36:28 UTC
Fixing NO_WRIVEV
David,
Could you (or someone else) who is on a legitimate platform which does
not support writev() check if this is functional ?
Note that I also found I had to make the #ifdef/#if defined()s to make
things comply across the board.
I've tried both with and without SSL and with/without WRITEV on bsd and
solaris - but obviously 'faking' the four permutations.
Cheers,
Dw
Index: ab.c
===================================================================
RCS file: /home/cvs/apache-1.3/src/support/ab.c,v
retrieving revision 1.63
diff -c -3 -r1.63 ab.c
*** ab.c 1 May 2002 17:02:20 -0000 1.63
--- ab.c 2 May 2002 10:33:09 -0000
***************
*** 114,120 ****
* configure --your-other-options
*/
-
#define VERSION "1.3d"
/* -------------------------------------------------------------------- */
--- 114,119 ----
***************
*** 161,167 ****
#endif /* NO_APACHE_INCLUDES */
#ifdef USE_SSL
! #if ((!(RSAREF)) && (!(SYSSSL)))
/* Libraries on most systems.. */
#include <openssl/rsa.h>
#include <openssl/crypto.h>
--- 160,166 ----
#endif /* NO_APACHE_INCLUDES */
#ifdef USE_SSL
! #if ((!defined(RSAREF)) && (!defined(SYSSSL)))
/* Libraries on most systems.. */
#include <openssl/rsa.h>
#include <openssl/crypto.h>
***************
*** 312,319 ****
#endif
static void close_connection(struct connection * c);
! #if NO_WRITEV || USE_SSL
! static void s_write(struct connection * c, char *buff, int len);
#endif
/* --------------------------------------------------------- */
--- 311,318 ----
#endif
static void close_connection(struct connection * c);
! #if (defined(NO_WRITEV) || defined(USE_SSL))
! static int s_write(struct connection * c, char *buff, int len);
#endif
/* --------------------------------------------------------- */
***************
*** 343,354 ****
/* XXX this sucks - SSL mode and writev() do not mix
* another artificial difference.
*/
! #if !NO_WRITEV && !USE_SSL
struct iovec out[2];
! int outcnt = 1, snd = 0;
#endif
gettimeofday(&c->connect, 0);
! #if !NO_WRITEV && !USE_SSL
out[0].iov_base = request;
out[0].iov_len = reqlen;
--- 342,354 ----
/* XXX this sucks - SSL mode and writev() do not mix
* another artificial difference.
*/
! #if ((!(defined(NO_WRITEV))) && (!(defined(USE_SSL))))
struct iovec out[2];
! int outcnt = 1;
#endif
+ int snd = 0;
gettimeofday(&c->connect, 0);
! #if ((!(defined(NO_WRITEV))) && (!(defined(USE_SSL))))
out[0].iov_base = request;
out[0].iov_len = reqlen;
***************
*** 387,400 ****
/* Do actual data writing */
! #if NO_WRITEV || USE_SSL
! static void s_write(struct connection * c, char *buff, int len)
{
do {
int n;
! #if USE_SSL
if (ssl) {
! n = SSL_write(c->ssl, buff, len);
if (n < 0) {
int e = SSL_get_error(c->ssl, n);
/* XXXX propably wrong !!! */
--- 388,402 ----
/* Do actual data writing */
! #if ((defined(NO_WRITEV)) || (defined(USE_SSL)))
! static int s_write(struct connection * c, char *buff, int len)
{
+ int left = len;
do {
int n;
! #ifdef USE_SSL
if (ssl) {
! n = SSL_write(c->ssl, buff, left);
if (n < 0) {
int e = SSL_get_error(c->ssl, n);
/* XXXX propably wrong !!! */
***************
*** 406,412 ****
}
else
#endif
! n = ab_write(c->fd, buff, len);
if (n < 0) {
switch (errno) {
--- 408,414 ----
}
else
#endif
! n = ab_write(c->fd, buff, left);
if (n < 0) {
switch (errno) {
***************
*** 416,424 ****
/* We've tried to write to a broken pipe. */
epipe++;
close_connection(c);
! return;
default:
! #if USE_SSL
if (ssl) {
fprintf(stderr,"Error writing: ");
ERR_print_errors_fp(stderr);
--- 418,426 ----
/* We've tried to write to a broken pipe. */
epipe++;
close_connection(c);
! return len - left;
default:
! #ifdef USE_SSL
if (ssl) {
fprintf(stderr,"Error writing: ");
ERR_print_errors_fp(stderr);
***************
*** 430,440 ****
}
else if (n) {
if (verbosity >= 3)
! printf(" --> write(%x) %d (%d)\n", (unsigned char) buff[0], n, len);
buff += n;
! len -= n;
};
! } while (len > 0);
}
#endif
--- 432,444 ----
}
else if (n) {
if (verbosity >= 3)
! printf(" --> write(%x) %d (%d)\n", (unsigned char) buff[0], n, left);
buff += n;
! left -= n;
};
! } while (left > 0);
!
! return len-left;
}
#endif
***************
*** 879,885 ****
goto _bad;
};
! #if USE_SSL
/*
* XXXX move nonblocker - so that measnurement needs to have its OWN
* state engine OR cannot be compared to http.
--- 883,889 ----
goto _bad;
};
! #ifdef USE_SSL
/*
* XXXX move nonblocker - so that measnurement needs to have its OWN
* state engine OR cannot be compared to http.
***************
*** 926,932 ****
fprintf(stderr, "SSL connection OK: %s\n", SSL_get_cipher(c->ssl));
}
#endif
! #if USE_SSL
if (ssl)
nonblock(c->fd);
#endif
--- 930,936 ----
fprintf(stderr, "SSL connection OK: %s\n", SSL_get_cipher(c->ssl));
}
#endif
! #ifdef USE_SSL
if (ssl)
nonblock(c->fd);
#endif
***************
*** 1001,1007 ****
char respcode[4]; /* 3 digits and null */
gettimeofday(&c->beginread, 0);
! #if USE_SSL
if (ssl) {
r = SSL_read(c->ssl, buffer, sizeof(buffer));
/* XXX fundamwentally worng .. */
--- 1005,1011 ----
char respcode[4]; /* 3 digits and null */
gettimeofday(&c->beginread, 0);
! #ifdef USE_SSL
if (ssl) {
r = SSL_read(c->ssl, buffer, sizeof(buffer));
/* XXX fundamwentally worng .. */
***************
*** 1364,1370 ****
static void usage(char *progname)
{
fprintf(stderr, "Usage: %s [options] [http"
! #if USE_SSL
"[s]"
#endif
"://]hostname[:port]/path\n", progname);
--- 1368,1374 ----
static void usage(char *progname)
{
fprintf(stderr, "Usage: %s [options] [http"
! #ifdef USE_SSL
"[s]"
#endif
"://]hostname[:port]/path\n", progname);
***************
*** 1394,1400 ****
fprintf(stderr, " -S Do not show confidence estimators and warnings.\n");
fprintf(stderr, " -g filename Output collected data to gnuplot format file.\n");
fprintf(stderr, " -e filename Output CSV file with percentages served\n");
! #if USE_SSL
fprintf(stderr, " -s Use httpS instead of HTTP (SSL)\n");
#endif
fprintf(stderr, " -h Display usage information (this message)\n");
--- 1398,1404 ----
fprintf(stderr, " -S Do not show confidence estimators and warnings.\n");
fprintf(stderr, " -g filename Output collected data to gnuplot format file.\n");
fprintf(stderr, " -e filename Output CSV file with percentages served\n");
! #ifdef USE_SSL
fprintf(stderr, " -s Use httpS instead of HTTP (SSL)\n");
#endif
fprintf(stderr, " -h Display usage information (this message)\n");
***************
*** 1414,1420 ****
if (strlen(purl) > 7 && strncmp(purl, "http://", 7) == 0)
purl += 7;
else
! #if USE_SSL
if (strlen(purl) > 8 && strncmp(purl, "https://", 8) == 0) {
purl += 8;
ssl = 1;
--- 1418,1424 ----
if (strlen(purl) > 7 && strncmp(purl, "http://", 7) == 0)
purl += 7;
else
! #ifdef USE_SSL
if (strlen(purl) > 8 && strncmp(purl, "https://", 8) == 0) {
purl += 8;
ssl = 1;
***************
*** 1442,1448 ****
port = atoi(p);
if ((
! #if USE_SSL
(ssl != 0) && (port != 443)) || ((ssl == 0) &&
#endif
(port != 80)))
--- 1446,1452 ----
port = atoi(p);
if ((
! #ifdef USE_SSL
(ssl != 0) && (port != 443)) || ((ssl == 0) &&
#endif
(port != 80)))
***************
*** 1504,1515 ****
proxyhost[0] = '\0';
optind = 1;
while ((c = getopt(argc, argv, "n:c:t:T:p:v:kVhwix:y:z:C:H:P:A:g:X:de:Sq"
! #if USE_SSL
"s"
#endif
)) > 0) {
switch (c) {
! #if USE_SSL
case 's':
ssl = 1;
break;
--- 1508,1519 ----
proxyhost[0] = '\0';
optind = 1;
while ((c = getopt(argc, argv, "n:c:t:T:p:v:kVhwix:y:z:C:H:P:A:g:X:de:Sq"
! #ifdef USE_SSL
"s"
#endif
)) > 0) {
switch (c) {
! #ifdef USE_SSL
case 's':
ssl = 1;
break;
Re: Fixing NO_WRIVEV
Posted by David Reid <dr...@jetnet.co.uk>.
Will do in a while :)
david
----- Original Message -----
From: <di...@covalent.net>
To: <de...@httpd.apache.org>
Sent: Thursday, May 02, 2002 11:36 AM
Subject: Fixing NO_WRIVEV
>
> David,
>
> Could you (or someone else) who is on a legitimate platform which does
> not support writev() check if this is functional ?
>
> Note that I also found I had to make the #ifdef/#if defined()s to make
> things comply across the board.
>
> I've tried both with and without SSL and with/without WRITEV on bsd and
> solaris - but obviously 'faking' the four permutations.
>
> Cheers,
>
> Dw
>
> Index: ab.c
> ===================================================================
> RCS file: /home/cvs/apache-1.3/src/support/ab.c,v
> retrieving revision 1.63
> diff -c -3 -r1.63 ab.c
> *** ab.c 1 May 2002 17:02:20 -0000 1.63
> --- ab.c 2 May 2002 10:33:09 -0000
> ***************
> *** 114,120 ****
> * configure --your-other-options
> */
>
> -
> #define VERSION "1.3d"
>
> /* --------------------------------------------------------------------
*/
> --- 114,119 ----
> ***************
> *** 161,167 ****
> #endif /* NO_APACHE_INCLUDES */
>
> #ifdef USE_SSL
> ! #if ((!(RSAREF)) && (!(SYSSSL)))
> /* Libraries on most systems.. */
> #include <openssl/rsa.h>
> #include <openssl/crypto.h>
> --- 160,166 ----
> #endif /* NO_APACHE_INCLUDES */
>
> #ifdef USE_SSL
> ! #if ((!defined(RSAREF)) && (!defined(SYSSSL)))
> /* Libraries on most systems.. */
> #include <openssl/rsa.h>
> #include <openssl/crypto.h>
> ***************
> *** 312,319 ****
> #endif
>
> static void close_connection(struct connection * c);
> ! #if NO_WRITEV || USE_SSL
> ! static void s_write(struct connection * c, char *buff, int len);
> #endif
>
> /* --------------------------------------------------------- */
> --- 311,318 ----
> #endif
>
> static void close_connection(struct connection * c);
> ! #if (defined(NO_WRITEV) || defined(USE_SSL))
> ! static int s_write(struct connection * c, char *buff, int len);
> #endif
>
> /* --------------------------------------------------------- */
> ***************
> *** 343,354 ****
> /* XXX this sucks - SSL mode and writev() do not mix
> * another artificial difference.
> */
> ! #if !NO_WRITEV && !USE_SSL
> struct iovec out[2];
> ! int outcnt = 1, snd = 0;
> #endif
> gettimeofday(&c->connect, 0);
> ! #if !NO_WRITEV && !USE_SSL
> out[0].iov_base = request;
> out[0].iov_len = reqlen;
>
> --- 342,354 ----
> /* XXX this sucks - SSL mode and writev() do not mix
> * another artificial difference.
> */
> ! #if ((!(defined(NO_WRITEV))) && (!(defined(USE_SSL))))
> struct iovec out[2];
> ! int outcnt = 1;
> #endif
> + int snd = 0;
> gettimeofday(&c->connect, 0);
> ! #if ((!(defined(NO_WRITEV))) && (!(defined(USE_SSL))))
> out[0].iov_base = request;
> out[0].iov_len = reqlen;
>
> ***************
> *** 387,400 ****
>
> /* Do actual data writing */
>
> ! #if NO_WRITEV || USE_SSL
> ! static void s_write(struct connection * c, char *buff, int len)
> {
> do {
> int n;
> ! #if USE_SSL
> if (ssl) {
> ! n = SSL_write(c->ssl, buff, len);
> if (n < 0) {
> int e = SSL_get_error(c->ssl, n);
> /* XXXX propably wrong !!! */
> --- 388,402 ----
>
> /* Do actual data writing */
>
> ! #if ((defined(NO_WRITEV)) || (defined(USE_SSL)))
> ! static int s_write(struct connection * c, char *buff, int len)
> {
> + int left = len;
> do {
> int n;
> ! #ifdef USE_SSL
> if (ssl) {
> ! n = SSL_write(c->ssl, buff, left);
> if (n < 0) {
> int e = SSL_get_error(c->ssl, n);
> /* XXXX propably wrong !!! */
> ***************
> *** 406,412 ****
> }
> else
> #endif
> ! n = ab_write(c->fd, buff, len);
>
> if (n < 0) {
> switch (errno) {
> --- 408,414 ----
> }
> else
> #endif
> ! n = ab_write(c->fd, buff, left);
>
> if (n < 0) {
> switch (errno) {
> ***************
> *** 416,424 ****
> /* We've tried to write to a broken pipe. */
> epipe++;
> close_connection(c);
> ! return;
> default:
> ! #if USE_SSL
> if (ssl) {
> fprintf(stderr,"Error writing: ");
> ERR_print_errors_fp(stderr);
> --- 418,426 ----
> /* We've tried to write to a broken pipe. */
> epipe++;
> close_connection(c);
> ! return len - left;
> default:
> ! #ifdef USE_SSL
> if (ssl) {
> fprintf(stderr,"Error writing: ");
> ERR_print_errors_fp(stderr);
> ***************
> *** 430,440 ****
> }
> else if (n) {
> if (verbosity >= 3)
> ! printf(" --> write(%x) %d (%d)\n", (unsigned char) buff[0], n, len);
> buff += n;
> ! len -= n;
> };
> ! } while (len > 0);
> }
> #endif
>
> --- 432,444 ----
> }
> else if (n) {
> if (verbosity >= 3)
> ! printf(" --> write(%x) %d (%d)\n", (unsigned char) buff[0], n, left);
> buff += n;
> ! left -= n;
> };
> ! } while (left > 0);
> !
> ! return len-left;
> }
> #endif
>
> ***************
> *** 879,885 ****
> goto _bad;
> };
>
> ! #if USE_SSL
> /*
> * XXXX move nonblocker - so that measnurement needs to have its OWN
> * state engine OR cannot be compared to http.
> --- 883,889 ----
> goto _bad;
> };
>
> ! #ifdef USE_SSL
> /*
> * XXXX move nonblocker - so that measnurement needs to have its OWN
> * state engine OR cannot be compared to http.
> ***************
> *** 926,932 ****
> fprintf(stderr, "SSL connection OK: %s\n", SSL_get_cipher(c->ssl));
> }
> #endif
> ! #if USE_SSL
> if (ssl)
> nonblock(c->fd);
> #endif
> --- 930,936 ----
> fprintf(stderr, "SSL connection OK: %s\n", SSL_get_cipher(c->ssl));
> }
> #endif
> ! #ifdef USE_SSL
> if (ssl)
> nonblock(c->fd);
> #endif
> ***************
> *** 1001,1007 ****
> char respcode[4]; /* 3 digits and null */
>
> gettimeofday(&c->beginread, 0);
> ! #if USE_SSL
> if (ssl) {
> r = SSL_read(c->ssl, buffer, sizeof(buffer));
> /* XXX fundamwentally worng .. */
> --- 1005,1011 ----
> char respcode[4]; /* 3 digits and null */
>
> gettimeofday(&c->beginread, 0);
> ! #ifdef USE_SSL
> if (ssl) {
> r = SSL_read(c->ssl, buffer, sizeof(buffer));
> /* XXX fundamwentally worng .. */
> ***************
> *** 1364,1370 ****
> static void usage(char *progname)
> {
> fprintf(stderr, "Usage: %s [options] [http"
> ! #if USE_SSL
> "[s]"
> #endif
> "://]hostname[:port]/path\n", progname);
> --- 1368,1374 ----
> static void usage(char *progname)
> {
> fprintf(stderr, "Usage: %s [options] [http"
> ! #ifdef USE_SSL
> "[s]"
> #endif
> "://]hostname[:port]/path\n", progname);
> ***************
> *** 1394,1400 ****
> fprintf(stderr, " -S Do not show confidence
estimators and warnings.\n");
> fprintf(stderr, " -g filename Output collected data to
gnuplot format file.\n");
> fprintf(stderr, " -e filename Output CSV file with
percentages served\n");
> ! #if USE_SSL
> fprintf(stderr, " -s Use httpS instead of HTTP
(SSL)\n");
> #endif
> fprintf(stderr, " -h Display usage information (this
message)\n");
> --- 1398,1404 ----
> fprintf(stderr, " -S Do not show confidence
estimators and warnings.\n");
> fprintf(stderr, " -g filename Output collected data to
gnuplot format file.\n");
> fprintf(stderr, " -e filename Output CSV file with
percentages served\n");
> ! #ifdef USE_SSL
> fprintf(stderr, " -s Use httpS instead of HTTP
(SSL)\n");
> #endif
> fprintf(stderr, " -h Display usage information (this
message)\n");
> ***************
> *** 1414,1420 ****
> if (strlen(purl) > 7 && strncmp(purl, "http://", 7) == 0)
> purl += 7;
> else
> ! #if USE_SSL
> if (strlen(purl) > 8 && strncmp(purl, "https://", 8) == 0) {
> purl += 8;
> ssl = 1;
> --- 1418,1424 ----
> if (strlen(purl) > 7 && strncmp(purl, "http://", 7) == 0)
> purl += 7;
> else
> ! #ifdef USE_SSL
> if (strlen(purl) > 8 && strncmp(purl, "https://", 8) == 0) {
> purl += 8;
> ssl = 1;
> ***************
> *** 1442,1448 ****
> port = atoi(p);
>
> if ((
> ! #if USE_SSL
> (ssl != 0) && (port != 443)) || ((ssl == 0) &&
> #endif
> (port != 80)))
> --- 1446,1452 ----
> port = atoi(p);
>
> if ((
> ! #ifdef USE_SSL
> (ssl != 0) && (port != 443)) || ((ssl == 0) &&
> #endif
> (port != 80)))
> ***************
> *** 1504,1515 ****
> proxyhost[0] = '\0';
> optind = 1;
> while ((c = getopt(argc, argv,
"n:c:t:T:p:v:kVhwix:y:z:C:H:P:A:g:X:de:Sq"
> ! #if USE_SSL
> "s"
> #endif
> )) > 0) {
> switch (c) {
> ! #if USE_SSL
> case 's':
> ssl = 1;
> break;
> --- 1508,1519 ----
> proxyhost[0] = '\0';
> optind = 1;
> while ((c = getopt(argc, argv,
"n:c:t:T:p:v:kVhwix:y:z:C:H:P:A:g:X:de:Sq"
> ! #ifdef USE_SSL
> "s"
> #endif
> )) > 0) {
> switch (c) {
> ! #ifdef USE_SSL
> case 's':
> ssl = 1;
> break;
>
>
>