synchronize with engine branch (some changes were done only
[oweals/openssl.git] / apps / s_client.c
index e629f8e7f13f6a5c2e03c3bc70ace073d782d65f..9cfe2b15804b842fce48e21fd1503a984850a449 100644 (file)
@@ -79,6 +79,7 @@ typedef unsigned int u_int;
 #include <openssl/ssl.h>
 #include <openssl/err.h>
 #include <openssl/pem.h>
+#include <openssl/rand.h>
 #include "s_apps.h"
 
 #ifdef WINDOWS
@@ -152,6 +153,7 @@ static void sc_usage(void)
        BIO_printf(bio_err," -bugs         - Switch on all SSL implementation bug workarounds\n");
        BIO_printf(bio_err," -cipher       - preferred cipher to use, use the 'openssl ciphers'\n");
        BIO_printf(bio_err,"                 command to see what is available\n");
+       BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
 
        }
 
@@ -179,6 +181,7 @@ int MAIN(int argc, char **argv)
        int prexit = 0;
        SSL_METHOD *meth=NULL;
        BIO *sbio;
+       char *inrand=NULL;
 #ifdef WINDOWS
        struct timeval tv;
 #endif
@@ -201,8 +204,8 @@ int MAIN(int argc, char **argv)
        if (bio_err == NULL)
                bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
 
-       if (    ((cbuf=Malloc(BUFSIZZ)) == NULL) ||
-               ((sbuf=Malloc(BUFSIZZ)) == NULL))
+       if (    ((cbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
+               ((sbuf=OPENSSL_malloc(BUFSIZZ)) == NULL))
                {
                BIO_printf(bio_err,"out of memory\n");
                goto end;
@@ -316,6 +319,11 @@ int MAIN(int argc, char **argv)
                else if (strcmp(*argv,"-nbio") == 0)
                        { c_nbio=1; }
 #endif
+               else if (strcmp(*argv,"-rand") == 0)
+                       {
+                       if (--argc < 1) goto bad;
+                       inrand= *(++argv);
+                       }
                else
                        {
                        BIO_printf(bio_err,"unknown option %s\n",*argv);
@@ -332,7 +340,14 @@ bad:
                goto end;
                }
 
-       app_RAND_load_file(NULL, bio_err, 0);
+       if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL
+               && !RAND_status())
+               {
+               BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n");
+               }
+       if (inrand != NULL)
+               BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
+                       app_RAND_load_files(inrand));
 
        if (bio_c_out == NULL)
                {
@@ -523,7 +538,7 @@ re_start:
                                        tv.tv_usec = 0;
                                        i=select(width,(void *)&readfds,(void *)&writefds,
                                                 NULL,&tv);
-                                       if(!i && (!_kbhit() || !read_tty) ) continue;
+                                       if(!i && (!((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0))) || !read_tty) ) continue;
                                } else  i=select(width,(void *)&readfds,(void *)&writefds,
                                         NULL,NULL);
                        }
@@ -689,7 +704,7 @@ printf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240
                        }
 
 #ifdef WINDOWS
-               else if (_kbhit())
+               else if ((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0)))
 #else
                else if (FD_ISSET(fileno(stdin),&readfds))
 #endif
@@ -753,8 +768,8 @@ end:
        if (con != NULL) SSL_free(con);
        if (con2 != NULL) SSL_free(con2);
        if (ctx != NULL) SSL_CTX_free(ctx);
-       if (cbuf != NULL) { memset(cbuf,0,BUFSIZZ); Free(cbuf); }
-       if (sbuf != NULL) { memset(sbuf,0,BUFSIZZ); Free(sbuf); }
+       if (cbuf != NULL) { memset(cbuf,0,BUFSIZZ); OPENSSL_free(cbuf); }
+       if (sbuf != NULL) { memset(sbuf,0,BUFSIZZ); OPENSSL_free(sbuf); }
        if (bio_c_out != NULL)
                {
                BIO_free(bio_c_out);
@@ -881,5 +896,7 @@ static void print_stuff(BIO *bio, SSL *s, int full)
        BIO_printf(bio,"---\n");
        if (peer != NULL)
                X509_free(peer);
+       /* flush, or debugging output gets mixed with http response */
+       BIO_flush(bio);
        }