diff options
author | Bodo Möller <bodo@openssl.org> | 1999-09-10 16:03:21 +0200 |
---|---|---|
committer | Bodo Möller <bodo@openssl.org> | 1999-09-10 16:03:21 +0200 |
commit | 6f7af1524ea4a0eb9bcd0596075cef4bcaf887b1 (patch) | |
tree | df687fb476121221cb20c582ebf4557eca9f384d /ssl | |
parent | typo (diff) | |
download | openssl-6f7af1524ea4a0eb9bcd0596075cef4bcaf887b1.tar.xz openssl-6f7af1524ea4a0eb9bcd0596075cef4bcaf887b1.zip |
Use non-copying BIO interface in ssltest.c.
Diffstat (limited to 'ssl')
-rw-r--r-- | ssl/ssltest.c | 103 |
1 files changed, 53 insertions, 50 deletions
diff --git a/ssl/ssltest.c b/ssl/ssltest.c index ec57c71026..bebe726192 100644 --- a/ssl/ssltest.c +++ b/ssl/ssltest.c @@ -56,11 +56,12 @@ * [including the GNU Public Licence.] */ +#include <assert.h> +#include <errno.h> +#include <limits.h> #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <errno.h> -#include <limits.h> #include "openssl/e_os.h" @@ -653,48 +654,40 @@ int doit_biopair(SSL *s_ssl, SSL *c_ssl, long count) { /* "I/O" BETWEEN CLIENT AND SERVER. */ - /* TODO: use non-blocking BIO interface for (say) the client - * to illustrate its use and to test it. */ - -#define RELAYBUFSIZ 200 - static char buf[RELAYBUFSIZ]; - - /* RELAYBUF is arbitrary. When writing data over some real - * network, use a buffer of the same size as in the BIO_pipe - * and make that size large (for reading from the network - * small buffers usually won't hurt). - * Here sizes differ for testing. */ - size_t r1, r2; - size_t num; - int r; + BIO *io1 = server_io, *io2 = client_io; + /* we use the non-copying interface for io1 + * and the standard BIO_write/BIO_read interface for io2 + */ + static int prev_progress = 1; int progress = 0; - /* client to server */ + /* io1 to io2 */ do { - r1 = BIO_ctrl_pending(client_io); - r2 = BIO_ctrl_get_write_guarantee(server_io); + size_t num; + int r; + + r1 = BIO_ctrl_pending(io1); + r2 = BIO_ctrl_get_write_guarantee(io2); num = r1; if (r2 < num) num = r2; if (num) { - if (sizeof buf < num) - num = sizeof buf; + char *dataptr; + if (INT_MAX < num) /* yeah, right */ num = INT_MAX; - r = BIO_read(client_io, buf, (int)num); - if (r != (int)num) /* can't happen */ - { - fprintf(stderr, "ERROR: BIO_read could not read " - "BIO_ctrl_pending() bytes"); - goto err; - } - r = BIO_write(server_io, buf, (int)num); + r = BIO_nread(io1, &dataptr, (int)num); + assert(r > 0); + assert(r <= (int)num); + /* possibly r < num (non-contiguous data) */ + num = r; + r = BIO_write(io2, dataptr, (int)num); if (r != (int)num) /* can't happen */ { fprintf(stderr, "ERROR: BIO_write could not write " @@ -704,48 +697,58 @@ int doit_biopair(SSL *s_ssl, SSL *c_ssl, long count) progress = 1; if (debug) - printf("C->S relaying: %d bytes\n", (int)num); + printf((io1 == client_io) ? + "C->S relaying: %d bytes\n" : + "S->C relaying: %d bytes\n", + (int)num); } } while (r1 && r2); - /* server to client */ - do - { - r1 = BIO_ctrl_pending(server_io); - r2 = BIO_ctrl_get_write_guarantee(client_io); - + /* io2 to io1 */ + { + size_t num; + int r; + + r1 = BIO_ctrl_pending(io2); + r2 = BIO_ctrl_get_read_request(io1); + /* here we could use ..._get_write_guarantee instead of + * ..._get_read_request, but by using the latter + * we test restartability of the SSL implementation + * more thoroughly */ num = r1; if (r2 < num) num = r2; if (num) { - if (sizeof buf < num) - num = sizeof buf; + char *dataptr; + if (INT_MAX < num) num = INT_MAX; + + if (num > 1) + --num; /* for testing restartability even more thoroughly */ - r = BIO_read(server_io, buf, (int)num); + r = BIO_nwrite(io1, &dataptr, (int)num); + assert(r > 0); + assert(r <= (int)num); + num = r; + r = BIO_read(io2, dataptr, (int)num); if (r != (int)num) /* can't happen */ { fprintf(stderr, "ERROR: BIO_read could not read " "BIO_ctrl_pending() bytes"); goto err; } - r = BIO_write(client_io, buf, (int)num); - if (r != (int)num) /* can't happen */ - { - fprintf(stderr, "ERROR: BIO_write could not write " - "BIO_ctrl_get_write_guarantee() bytes"); - goto err; - } progress = 1; - + if (debug) - printf("S->C relaying: %d bytes\n", (int)num); + printf((io2 == client_io) ? + "C->S relaying: %d bytes\n" : + "S->C relaying: %d bytes\n", + (int)num); } - } - while (r1 && r2); + } /* no loop, BIO_ctrl_get_read_request now returns 0 anyway */ if (!progress && !prev_progress) if (cw_num > 0 || cr_num > 0 || sw_num > 0 || sr_num > 0) |