155714Skris/* apps/s_time.c */ 255714Skris/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 355714Skris * All rights reserved. 455714Skris * 555714Skris * This package is an SSL implementation written 655714Skris * by Eric Young (eay@cryptsoft.com). 755714Skris * The implementation was written so as to conform with Netscapes SSL. 855714Skris * 955714Skris * This library is free for commercial and non-commercial use as long as 1055714Skris * the following conditions are aheared to. The following conditions 1155714Skris * apply to all code found in this distribution, be it the RC4, RSA, 1255714Skris * lhash, DES, etc., code; not just the SSL code. The SSL documentation 1355714Skris * included with this distribution is covered by the same copyright terms 1455714Skris * except that the holder is Tim Hudson (tjh@cryptsoft.com). 1555714Skris * 1655714Skris * Copyright remains Eric Young's, and as such any Copyright notices in 1755714Skris * the code are not to be removed. 1855714Skris * If this package is used in a product, Eric Young should be given attribution 1955714Skris * as the author of the parts of the library used. 2055714Skris * This can be in the form of a textual message at program startup or 2155714Skris * in documentation (online or textual) provided with the package. 2255714Skris * 2355714Skris * Redistribution and use in source and binary forms, with or without 2455714Skris * modification, are permitted provided that the following conditions 2555714Skris * are met: 2655714Skris * 1. Redistributions of source code must retain the copyright 2755714Skris * notice, this list of conditions and the following disclaimer. 2855714Skris * 2. Redistributions in binary form must reproduce the above copyright 2955714Skris * notice, this list of conditions and the following disclaimer in the 3055714Skris * documentation and/or other materials provided with the distribution. 3155714Skris * 3. All advertising materials mentioning features or use of this software 3255714Skris * must display the following acknowledgement: 3355714Skris * "This product includes cryptographic software written by 3455714Skris * Eric Young (eay@cryptsoft.com)" 3555714Skris * The word 'cryptographic' can be left out if the rouines from the library 3655714Skris * being used are not cryptographic related :-). 3755714Skris * 4. If you include any Windows specific code (or a derivative thereof) from 3855714Skris * the apps directory (application code) you must include an acknowledgement: 3955714Skris * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 4055714Skris * 4155714Skris * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 4255714Skris * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 4355714Skris * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 4455714Skris * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 4555714Skris * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 4655714Skris * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 4755714Skris * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 4855714Skris * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 4955714Skris * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 5055714Skris * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 5155714Skris * SUCH DAMAGE. 5255714Skris * 5355714Skris * The licence and distribution terms for any publically available version or 5455714Skris * derivative of this code cannot be changed. i.e. this code cannot simply be 5555714Skris * copied and put under another distribution licence 5655714Skris * [including the GNU Public Licence.] 5755714Skris */ 5855714Skris 5955714Skris#define NO_SHUTDOWN 6055714Skris 6155714Skris/*----------------------------------------- 6255714Skris s_time - SSL client connection timer program 6355714Skris Written and donated by Larry Streepy <streepy@healthcare.com> 6455714Skris -----------------------------------------*/ 6555714Skris 6655714Skris#include <stdio.h> 6755714Skris#include <stdlib.h> 6855714Skris#include <string.h> 6955714Skris 70109998Smarkm#define USE_SOCKETS 71109998Smarkm#include "apps.h" 72109998Smarkm#ifdef OPENSSL_NO_STDIO 7355714Skris#define APPS_WIN16 7455714Skris#endif 7555714Skris#include <openssl/x509.h> 7655714Skris#include <openssl/ssl.h> 7755714Skris#include <openssl/pem.h> 7855714Skris#include "s_apps.h" 7955714Skris#include <openssl/err.h> 8055714Skris#ifdef WIN32_STUFF 8155714Skris#include "winmain.h" 8255714Skris#include "wintext.h" 8355714Skris#endif 84109998Smarkm#if !defined(OPENSSL_SYS_MSDOS) 85109998Smarkm#include OPENSSL_UNISTD 86109998Smarkm#endif 8755714Skris 8855714Skris#undef PROG 8955714Skris#define PROG s_time_main 9055714Skris 9155714Skris#undef ioctl 9255714Skris#define ioctl ioctlsocket 9355714Skris 9455714Skris#define SSL_CONNECT_NAME "localhost:4433" 9555714Skris 9655714Skris/*#define TEST_CERT "client.pem" */ /* no default cert. */ 9755714Skris 9855714Skris#undef BUFSIZZ 9955714Skris#define BUFSIZZ 1024*10 10055714Skris 101109998Smarkm#define MYBUFSIZ 1024*8 102109998Smarkm 103100928Snectar#undef min 104100928Snectar#undef max 10555714Skris#define min(a,b) (((a) < (b)) ? (a) : (b)) 10655714Skris#define max(a,b) (((a) > (b)) ? (a) : (b)) 10755714Skris 10855714Skris#undef SECONDS 10955714Skris#define SECONDS 30 11055714Skrisextern int verify_depth; 11155714Skrisextern int verify_error; 11255714Skris 11355714Skrisstatic void s_time_usage(void); 11455714Skrisstatic int parseArgs( int argc, char **argv ); 11555714Skrisstatic SSL *doConnection( SSL *scon ); 11655714Skrisstatic void s_time_init(void); 11755714Skris 11855714Skris/*********************************************************************** 11955714Skris * Static data declarations 12055714Skris */ 12155714Skris 12255714Skris/* static char *port=PORT_STR;*/ 12355714Skrisstatic char *host=SSL_CONNECT_NAME; 12455714Skrisstatic char *t_cert_file=NULL; 12555714Skrisstatic char *t_key_file=NULL; 12655714Skrisstatic char *CApath=NULL; 12755714Skrisstatic char *CAfile=NULL; 12855714Skrisstatic char *tm_cipher=NULL; 12955714Skrisstatic int tm_verify = SSL_VERIFY_NONE; 13055714Skrisstatic int maxTime = SECONDS; 13155714Skrisstatic SSL_CTX *tm_ctx=NULL; 132238405Sjkimstatic const SSL_METHOD *s_time_meth=NULL; 13355714Skrisstatic char *s_www_path=NULL; 13455714Skrisstatic long bytes_read=0; 13555714Skrisstatic int st_bugs=0; 13655714Skrisstatic int perform=0; 13755714Skris#ifdef FIONBIO 13855714Skrisstatic int t_nbio=0; 13955714Skris#endif 140109998Smarkm#ifdef OPENSSL_SYS_WIN32 14155714Skrisstatic int exitNow = 0; /* Set when it's time to exit main */ 14255714Skris#endif 14355714Skris 14455714Skrisstatic void s_time_init(void) 14555714Skris { 14655714Skris host=SSL_CONNECT_NAME; 14755714Skris t_cert_file=NULL; 14855714Skris t_key_file=NULL; 14955714Skris CApath=NULL; 15055714Skris CAfile=NULL; 15155714Skris tm_cipher=NULL; 15255714Skris tm_verify = SSL_VERIFY_NONE; 15355714Skris maxTime = SECONDS; 15455714Skris tm_ctx=NULL; 15555714Skris s_time_meth=NULL; 15655714Skris s_www_path=NULL; 15755714Skris bytes_read=0; 15855714Skris st_bugs=0; 15955714Skris perform=0; 16055714Skris 16155714Skris#ifdef FIONBIO 16255714Skris t_nbio=0; 16355714Skris#endif 164109998Smarkm#ifdef OPENSSL_SYS_WIN32 16555714Skris exitNow = 0; /* Set when it's time to exit main */ 16655714Skris#endif 16755714Skris } 16855714Skris 16955714Skris/*********************************************************************** 17055714Skris * usage - display usage message 17155714Skris */ 17255714Skrisstatic void s_time_usage(void) 17355714Skris{ 17455714Skris static char umsg[] = "\ 17555714Skris-time arg - max number of seconds to collect data, default %d\n\ 17655714Skris-verify arg - turn on peer certificate verification, arg == depth\n\ 17755714Skris-cert arg - certificate file to use, PEM format assumed\n\ 17855714Skris-key arg - RSA file to use, PEM format assumed, key is in cert file\n\ 17955714Skris file if not specified by this option\n\ 18055714Skris-CApath arg - PEM format directory of CA's\n\ 18155714Skris-CAfile arg - PEM format file of CA's\n\ 18259191Skris-cipher - preferred cipher to use, play with 'openssl ciphers'\n\n"; 18355714Skris 18455714Skris printf( "usage: s_time <args>\n\n" ); 18555714Skris 18655714Skris printf("-connect host:port - host:port to connect to (default is %s)\n",SSL_CONNECT_NAME); 18755714Skris#ifdef FIONBIO 18855714Skris printf("-nbio - Run with non-blocking IO\n"); 18955714Skris printf("-ssl2 - Just use SSLv2\n"); 19055714Skris printf("-ssl3 - Just use SSLv3\n"); 19159191Skris printf("-bugs - Turn on SSL bug compatibility\n"); 19255714Skris printf("-new - Just time new connections\n"); 19355714Skris printf("-reuse - Just time connection reuse\n"); 19455714Skris printf("-www page - Retrieve 'page' from the site\n"); 19555714Skris#endif 19655714Skris printf( umsg,SECONDS ); 19755714Skris} 19855714Skris 19955714Skris/*********************************************************************** 20055714Skris * parseArgs - Parse command line arguments and initialize data 20155714Skris * 20255714Skris * Returns 0 if ok, -1 on bad args 20355714Skris */ 20455714Skrisstatic int parseArgs(int argc, char **argv) 20555714Skris{ 20655714Skris int badop = 0; 20755714Skris 20855714Skris verify_depth=0; 20955714Skris verify_error=X509_V_OK; 21055714Skris 21155714Skris argc--; 21255714Skris argv++; 21355714Skris 21455714Skris while (argc >= 1) { 21555714Skris if (strcmp(*argv,"-connect") == 0) 21655714Skris { 21755714Skris if (--argc < 1) goto bad; 21855714Skris host= *(++argv); 21955714Skris } 22055714Skris#if 0 22155714Skris else if( strcmp(*argv,"-host") == 0) 22255714Skris { 22355714Skris if (--argc < 1) goto bad; 22455714Skris host= *(++argv); 22555714Skris } 22655714Skris else if( strcmp(*argv,"-port") == 0) 22755714Skris { 22855714Skris if (--argc < 1) goto bad; 22955714Skris port= *(++argv); 23055714Skris } 23155714Skris#endif 23255714Skris else if (strcmp(*argv,"-reuse") == 0) 23355714Skris perform=2; 23455714Skris else if (strcmp(*argv,"-new") == 0) 23555714Skris perform=1; 23655714Skris else if( strcmp(*argv,"-verify") == 0) { 23755714Skris 23855714Skris tm_verify=SSL_VERIFY_PEER|SSL_VERIFY_CLIENT_ONCE; 23955714Skris if (--argc < 1) goto bad; 24055714Skris verify_depth=atoi(*(++argv)); 24155714Skris BIO_printf(bio_err,"verify depth is %d\n",verify_depth); 24255714Skris 24355714Skris } else if( strcmp(*argv,"-cert") == 0) { 24455714Skris 24555714Skris if (--argc < 1) goto bad; 24655714Skris t_cert_file= *(++argv); 24755714Skris 24855714Skris } else if( strcmp(*argv,"-key") == 0) { 24955714Skris 25055714Skris if (--argc < 1) goto bad; 25155714Skris t_key_file= *(++argv); 25255714Skris 25355714Skris } else if( strcmp(*argv,"-CApath") == 0) { 25455714Skris 25555714Skris if (--argc < 1) goto bad; 25655714Skris CApath= *(++argv); 25755714Skris 25855714Skris } else if( strcmp(*argv,"-CAfile") == 0) { 25955714Skris 26055714Skris if (--argc < 1) goto bad; 26155714Skris CAfile= *(++argv); 26255714Skris 26355714Skris } else if( strcmp(*argv,"-cipher") == 0) { 26455714Skris 26555714Skris if (--argc < 1) goto bad; 26655714Skris tm_cipher= *(++argv); 26755714Skris } 26855714Skris#ifdef FIONBIO 26955714Skris else if(strcmp(*argv,"-nbio") == 0) { 27055714Skris t_nbio=1; 27155714Skris } 27255714Skris#endif 27355714Skris else if(strcmp(*argv,"-www") == 0) 27455714Skris { 27555714Skris if (--argc < 1) goto bad; 27655714Skris s_www_path= *(++argv); 277109998Smarkm if(strlen(s_www_path) > MYBUFSIZ-100) 278109998Smarkm { 279109998Smarkm BIO_printf(bio_err,"-www option too long\n"); 280109998Smarkm badop=1; 281109998Smarkm } 28255714Skris } 28355714Skris else if(strcmp(*argv,"-bugs") == 0) 28455714Skris st_bugs=1; 285109998Smarkm#ifndef OPENSSL_NO_SSL2 28655714Skris else if(strcmp(*argv,"-ssl2") == 0) 28755714Skris s_time_meth=SSLv2_client_method(); 28855714Skris#endif 289109998Smarkm#ifndef OPENSSL_NO_SSL3 29055714Skris else if(strcmp(*argv,"-ssl3") == 0) 29155714Skris s_time_meth=SSLv3_client_method(); 29255714Skris#endif 29355714Skris else if( strcmp(*argv,"-time") == 0) { 29455714Skris 29555714Skris if (--argc < 1) goto bad; 29655714Skris maxTime= atoi(*(++argv)); 29755714Skris } 29855714Skris else { 29955714Skris BIO_printf(bio_err,"unknown option %s\n",*argv); 30055714Skris badop=1; 30155714Skris break; 30255714Skris } 30355714Skris 30455714Skris argc--; 30555714Skris argv++; 30655714Skris } 30755714Skris 30855714Skris if (perform == 0) perform=3; 30955714Skris 31055714Skris if(badop) { 31155714Skrisbad: 31255714Skris s_time_usage(); 31355714Skris return -1; 31455714Skris } 31555714Skris 31655714Skris return 0; /* Valid args */ 31755714Skris} 31855714Skris 31955714Skris/*********************************************************************** 32055714Skris * TIME - time functions 32155714Skris */ 32255714Skris#define START 0 32355714Skris#define STOP 1 32455714Skris 32555714Skrisstatic double tm_Time_F(int s) 32655714Skris { 327238405Sjkim return app_tminterval(s,1); 32855714Skris } 329160814Ssimon 33055714Skris/*********************************************************************** 33155714Skris * MAIN - main processing area for client 33255714Skris * real name depends on MONOLITH 33355714Skris */ 33459191Skrisint MAIN(int, char **); 33559191Skris 33655714Skrisint MAIN(int argc, char **argv) 33755714Skris { 33855714Skris double totalTime = 0.0; 33955714Skris int nConn = 0; 34055714Skris SSL *scon=NULL; 34155714Skris long finishtime=0; 34255714Skris int ret=1,i; 34355714Skris MS_STATIC char buf[1024*8]; 34455714Skris int ver; 34555714Skris 34659191Skris apps_startup(); 34759191Skris s_time_init(); 34859191Skris 34959191Skris if (bio_err == NULL) 35059191Skris bio_err=BIO_new_fp(stderr,BIO_NOCLOSE); 35159191Skris 35255714Skris s_time_meth=SSLv23_client_method(); 35355714Skris 35455714Skris /* parse the command line arguments */ 35555714Skris if( parseArgs( argc, argv ) < 0 ) 35655714Skris goto end; 35755714Skris 35859191Skris OpenSSL_add_ssl_algorithms(); 35955714Skris if ((tm_ctx=SSL_CTX_new(s_time_meth)) == NULL) return(1); 36055714Skris 36155714Skris SSL_CTX_set_quiet_shutdown(tm_ctx,1); 36255714Skris 36355714Skris if (st_bugs) SSL_CTX_set_options(tm_ctx,SSL_OP_ALL); 36455714Skris SSL_CTX_set_cipher_list(tm_ctx,tm_cipher); 36555714Skris if(!set_cert_stuff(tm_ctx,t_cert_file,t_key_file)) 36655714Skris goto end; 36755714Skris 36855714Skris SSL_load_error_strings(); 36955714Skris 37055714Skris if ((!SSL_CTX_load_verify_locations(tm_ctx,CAfile,CApath)) || 37155714Skris (!SSL_CTX_set_default_verify_paths(tm_ctx))) 37255714Skris { 37359191Skris /* BIO_printf(bio_err,"error setting default verify locations\n"); */ 37455714Skris ERR_print_errors(bio_err); 37555714Skris /* goto end; */ 37655714Skris } 37755714Skris 37855714Skris if (tm_cipher == NULL) 37955714Skris tm_cipher = getenv("SSL_CIPHER"); 38055714Skris 38155714Skris if (tm_cipher == NULL ) { 38255714Skris fprintf( stderr, "No CIPHER specified\n" ); 38355714Skris } 38455714Skris 38555714Skris if (!(perform & 1)) goto next; 38655714Skris printf( "Collecting connection statistics for %d seconds\n", maxTime ); 38755714Skris 38855714Skris /* Loop and time how long it takes to make connections */ 38955714Skris 39055714Skris bytes_read=0; 39155714Skris finishtime=(long)time(NULL)+maxTime; 39255714Skris tm_Time_F(START); 39355714Skris for (;;) 39455714Skris { 395109998Smarkm if (finishtime < (long)time(NULL)) break; 39655714Skris#ifdef WIN32_STUFF 39755714Skris 39855714Skris if( flushWinMsgs(0) == -1 ) 39955714Skris goto end; 40055714Skris 40155714Skris if( waitingToDie || exitNow ) /* we're dead */ 40255714Skris goto end; 40355714Skris#endif 40455714Skris 40555714Skris if( (scon = doConnection( NULL )) == NULL ) 40655714Skris goto end; 40755714Skris 40855714Skris if (s_www_path != NULL) 40955714Skris { 410127128Snectar BIO_snprintf(buf,sizeof buf,"GET %s HTTP/1.0\r\n\r\n",s_www_path); 41155714Skris SSL_write(scon,buf,strlen(buf)); 41255714Skris while ((i=SSL_read(scon,buf,sizeof(buf))) > 0) 41355714Skris bytes_read+=i; 41455714Skris } 41555714Skris 41655714Skris#ifdef NO_SHUTDOWN 41755714Skris SSL_set_shutdown(scon,SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN); 41855714Skris#else 41955714Skris SSL_shutdown(scon); 42055714Skris#endif 42155714Skris SHUTDOWN2(SSL_get_fd(scon)); 42255714Skris 42355714Skris nConn += 1; 42455714Skris if (SSL_session_reused(scon)) 42555714Skris ver='r'; 42655714Skris else 42755714Skris { 42855714Skris ver=SSL_version(scon); 42955714Skris if (ver == TLS1_VERSION) 43055714Skris ver='t'; 43155714Skris else if (ver == SSL3_VERSION) 43255714Skris ver='3'; 43355714Skris else if (ver == SSL2_VERSION) 43455714Skris ver='2'; 43555714Skris else 43655714Skris ver='*'; 43755714Skris } 43855714Skris fputc(ver,stdout); 43955714Skris fflush(stdout); 44055714Skris 44155714Skris SSL_free( scon ); 44255714Skris scon=NULL; 44355714Skris } 44455714Skris totalTime += tm_Time_F(STOP); /* Add the time for this iteration */ 44555714Skris 446109998Smarkm i=(int)((long)time(NULL)-finishtime+maxTime); 44755714Skris printf( "\n\n%d connections in %.2fs; %.2f connections/user sec, bytes read %ld\n", nConn, totalTime, ((double)nConn/totalTime),bytes_read); 448109998Smarkm printf( "%d connections in %ld real seconds, %ld bytes read per connection\n",nConn,(long)time(NULL)-finishtime+maxTime,bytes_read/nConn); 44955714Skris 45055714Skris /* Now loop and time connections using the same session id over and over */ 45155714Skris 45255714Skrisnext: 45355714Skris if (!(perform & 2)) goto end; 45455714Skris printf( "\n\nNow timing with session id reuse.\n" ); 45555714Skris 45655714Skris /* Get an SSL object so we can reuse the session id */ 45755714Skris if( (scon = doConnection( NULL )) == NULL ) 45855714Skris { 45955714Skris fprintf( stderr, "Unable to get connection\n" ); 46055714Skris goto end; 46155714Skris } 46255714Skris 46355714Skris if (s_www_path != NULL) 46455714Skris { 465127128Snectar BIO_snprintf(buf,sizeof buf,"GET %s HTTP/1.0\r\n\r\n",s_www_path); 46655714Skris SSL_write(scon,buf,strlen(buf)); 46755714Skris while (SSL_read(scon,buf,sizeof(buf)) > 0) 46855714Skris ; 46955714Skris } 47055714Skris#ifdef NO_SHUTDOWN 47155714Skris SSL_set_shutdown(scon,SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN); 47255714Skris#else 47355714Skris SSL_shutdown(scon); 47455714Skris#endif 47555714Skris SHUTDOWN2(SSL_get_fd(scon)); 47655714Skris 47755714Skris nConn = 0; 47855714Skris totalTime = 0.0; 47955714Skris 480109998Smarkm finishtime=(long)time(NULL)+maxTime; 48155714Skris 48255714Skris printf( "starting\n" ); 48355714Skris bytes_read=0; 48455714Skris tm_Time_F(START); 48555714Skris 48655714Skris for (;;) 48755714Skris { 488109998Smarkm if (finishtime < (long)time(NULL)) break; 48955714Skris 49055714Skris#ifdef WIN32_STUFF 49155714Skris if( flushWinMsgs(0) == -1 ) 49255714Skris goto end; 49355714Skris 49455714Skris if( waitingToDie || exitNow ) /* we're dead */ 49555714Skris goto end; 49655714Skris#endif 49755714Skris 49855714Skris if( (doConnection( scon )) == NULL ) 49955714Skris goto end; 50055714Skris 50155714Skris if (s_www_path) 50255714Skris { 503127128Snectar BIO_snprintf(buf,sizeof buf,"GET %s HTTP/1.0\r\n\r\n",s_www_path); 50455714Skris SSL_write(scon,buf,strlen(buf)); 50555714Skris while ((i=SSL_read(scon,buf,sizeof(buf))) > 0) 50655714Skris bytes_read+=i; 50755714Skris } 50855714Skris 50955714Skris#ifdef NO_SHUTDOWN 51055714Skris SSL_set_shutdown(scon,SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN); 51155714Skris#else 51255714Skris SSL_shutdown(scon); 51355714Skris#endif 51455714Skris SHUTDOWN2(SSL_get_fd(scon)); 51555714Skris 51655714Skris nConn += 1; 51755714Skris if (SSL_session_reused(scon)) 51855714Skris ver='r'; 51955714Skris else 52055714Skris { 52155714Skris ver=SSL_version(scon); 52255714Skris if (ver == TLS1_VERSION) 52355714Skris ver='t'; 52455714Skris else if (ver == SSL3_VERSION) 52555714Skris ver='3'; 52655714Skris else if (ver == SSL2_VERSION) 52755714Skris ver='2'; 52855714Skris else 52955714Skris ver='*'; 53055714Skris } 53155714Skris fputc(ver,stdout); 53255714Skris fflush(stdout); 53355714Skris } 53455714Skris totalTime += tm_Time_F(STOP); /* Add the time for this iteration*/ 53555714Skris 53655714Skris 53755714Skris printf( "\n\n%d connections in %.2fs; %.2f connections/user sec, bytes read %ld\n", nConn, totalTime, ((double)nConn/totalTime),bytes_read); 538109998Smarkm printf( "%d connections in %ld real seconds, %ld bytes read per connection\n",nConn,(long)time(NULL)-finishtime+maxTime,bytes_read/nConn); 53955714Skris 54055714Skris ret=0; 54155714Skrisend: 54255714Skris if (scon != NULL) SSL_free(scon); 54355714Skris 54455714Skris if (tm_ctx != NULL) 54555714Skris { 54655714Skris SSL_CTX_free(tm_ctx); 54755714Skris tm_ctx=NULL; 54855714Skris } 549109998Smarkm apps_shutdown(); 550109998Smarkm OPENSSL_EXIT(ret); 55155714Skris } 55255714Skris 55355714Skris/*********************************************************************** 55455714Skris * doConnection - make a connection 55555714Skris * Args: 55655714Skris * scon = earlier ssl connection for session id, or NULL 55755714Skris * Returns: 55855714Skris * SSL * = the connection pointer. 55955714Skris */ 56055714Skrisstatic SSL *doConnection(SSL *scon) 56155714Skris { 56255714Skris BIO *conn; 56355714Skris SSL *serverCon; 56455714Skris int width, i; 56555714Skris fd_set readfds; 56655714Skris 56755714Skris if ((conn=BIO_new(BIO_s_connect())) == NULL) 56855714Skris return(NULL); 56955714Skris 57055714Skris/* BIO_set_conn_port(conn,port);*/ 57155714Skris BIO_set_conn_hostname(conn,host); 57255714Skris 57355714Skris if (scon == NULL) 57459191Skris serverCon=SSL_new(tm_ctx); 57555714Skris else 57655714Skris { 57755714Skris serverCon=scon; 57855714Skris SSL_set_connect_state(serverCon); 57955714Skris } 58055714Skris 58155714Skris SSL_set_bio(serverCon,conn,conn); 58255714Skris 58355714Skris#if 0 58455714Skris if( scon != NULL ) 58555714Skris SSL_set_session(serverCon,SSL_get_session(scon)); 58655714Skris#endif 58755714Skris 58855714Skris /* ok, lets connect */ 58955714Skris for(;;) { 59055714Skris i=SSL_connect(serverCon); 59155714Skris if (BIO_sock_should_retry(i)) 59255714Skris { 59355714Skris BIO_printf(bio_err,"DELAY\n"); 59455714Skris 59555714Skris i=SSL_get_fd(serverCon); 59655714Skris width=i+1; 59755714Skris FD_ZERO(&readfds); 598238405Sjkim openssl_fdset(i,&readfds); 59955714Skris /* Note: under VMS with SOCKETSHR the 2nd parameter 60055714Skris * is currently of type (int *) whereas under other 60155714Skris * systems it is (void *) if you don't have a cast it 60255714Skris * will choke the compiler: if you do have a cast then 60355714Skris * you can either go for (int *) or (void *). 60455714Skris */ 60555714Skris select(width,(void *)&readfds,NULL,NULL,NULL); 60655714Skris continue; 60755714Skris } 60855714Skris break; 60955714Skris } 61055714Skris if(i <= 0) 61155714Skris { 61255714Skris BIO_printf(bio_err,"ERROR\n"); 61355714Skris if (verify_error != X509_V_OK) 61455714Skris BIO_printf(bio_err,"verify error:%s\n", 61555714Skris X509_verify_cert_error_string(verify_error)); 61655714Skris else 61755714Skris ERR_print_errors(bio_err); 61855714Skris if (scon == NULL) 61955714Skris SSL_free(serverCon); 62055714Skris return NULL; 62155714Skris } 62255714Skris 62355714Skris return serverCon; 62455714Skris } 62555714Skris 62655714Skris 627