X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=apps%2Fs_client.c;h=b06104130e5372a4996010e33cdfbba3f6a8078d;hp=2afb031b0ba467e573397bf35af44d0b2dc2e732;hb=204cf1abb0fa5c5f31397a79eac3a8739f360d9e;hpb=c7ac31e26ed46c957983111d3a537085167fcc9c diff --git a/apps/s_client.c b/apps/s_client.c index 2afb031b0b..b06104130e 100644 --- a/apps/s_client.c +++ b/apps/s_client.c @@ -56,20 +56,42 @@ * [including the GNU Public Licence.] */ +#ifdef APPS_CRLF +# include +#endif #include #include #include -#define USE_SOCKETS #ifdef NO_STDIO #define APPS_WIN16 #endif + +/* With IPv6, it looks like Digital has mixed up the proper order of + recursive header file inclusion, resulting in the compiler complaining + that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which + is needed to have fileno() declared correctly... So let's define u_int */ +#if defined(VMS) && defined(__DECC) && !defined(__U_INT) +#define __U_INT +typedef unsigned int u_int; +#endif + +#define USE_SOCKETS #include "apps.h" -#include "x509.h" -#include "ssl.h" -#include "err.h" -#include "pem.h" +#include +#include +#include +#include #include "s_apps.h" +#if (defined(VMS) && __VMS_VER < 70000000) +/* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */ +#undef FIONBIO +#endif + +#if defined(NO_RSA) && !defined(NO_SSL2) +#define NO_SSL2 +#endif + #undef PROG #define PROG s_client_main @@ -92,18 +114,12 @@ static int c_Pause=0; static int c_debug=0; static int c_showcerts=0; -#ifndef NOPROTO static void sc_usage(void); static void print_stuff(BIO *berr,SSL *con,int full); -#else -static void sc_usage(); -static void print_stuff(); -#endif - static BIO *bio_c_out=NULL; static int c_quiet=0; -static void sc_usage() +static void sc_usage(void) { BIO_printf(bio_err,"usage: s_client args\n"); BIO_printf(bio_err,"\n"); @@ -125,6 +141,9 @@ static void sc_usage() BIO_printf(bio_err," -state - print the 'ssl' states\n"); #ifdef FIONBIO BIO_printf(bio_err," -nbio - Run with non-blocking IO\n"); +#endif +#ifdef APPS_CRLF /* won't be #ifdef'd in next release */ + BIO_printf(bio_err," -crlf - convert LF from terminal into CRLF\n"); #endif BIO_printf(bio_err," -quiet - no s_client output\n"); BIO_printf(bio_err," -ssl2 - just use SSLv2\n"); @@ -137,9 +156,7 @@ static void sc_usage() } -int MAIN(argc, argv) -int argc; -char **argv; +int MAIN(int argc, char **argv) { int off=0; SSL *con=NULL,*con2=NULL; @@ -154,6 +171,9 @@ char **argv; char *cert_file=NULL,*key_file=NULL; char *CApath=NULL,*CAfile=NULL,*cipher=NULL; int reconnect=0,badop=0,verify=SSL_VERIFY_NONE,bugs=0; +#ifdef APPS_CRLF + int crlf=0; +#endif int write_tty,read_tty,write_ssl,read_ssl,tty_on,ssl_pending; SSL_CTX *ctx=NULL; int ret=1,in_init=1,i,nbio_test=0; @@ -224,6 +244,10 @@ char **argv; if (--argc < 1) goto bad; cert_file= *(++argv); } +#ifdef APPS_CRLF + else if (strcmp(*argv,"-crlf") == 0) + crlf=1; +#endif else if (strcmp(*argv,"-quiet") == 0) c_quiet=1; else if (strcmp(*argv,"-pause") == 0) @@ -442,8 +466,8 @@ re_start: ssl_pending = read_ssl && SSL_pending(con); if (!ssl_pending) -#ifndef WINDOWS { +#ifndef WINDOWS if (tty_on) { if (read_tty) FD_SET(fileno(stdin),&readfds); @@ -458,7 +482,14 @@ re_start: /* printf("mode tty(%d %d%d) ssl(%d%d)\n", tty_on,read_tty,write_tty,read_ssl,write_ssl);*/ - i=select(width,&readfds,&writefds,NULL,NULL); + /* Note: under VMS with SOCKETSHR the second parameter + * is currently of type (int *) whereas under other + * systems it is (void *) if you don't have a cast it + * will choke the compiler: if you do have a cast then + * you can either go for (int *) or (void *). + */ + i=select(width,(void *)&readfds,(void *)&writefds, + NULL,NULL); if ( i < 0) { BIO_printf(bio_err,"bad select %d\n", @@ -538,6 +569,9 @@ re_start: #ifndef WINDOWS else if (!ssl_pending && FD_ISSET(fileno(stdout),&writefds)) { +#ifdef CHARSET_EBCDIC + ascii2ebcdic(&(sbuf[sbuf_off]),&(sbuf[sbuf_off]),sbuf_len); +#endif i=write(fileno(stdout),&(sbuf[sbuf_off]),sbuf_len); if (i <= 0) @@ -613,7 +647,32 @@ printf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240 #ifndef WINDOWS else if (FD_ISSET(fileno(stdin),&readfds)) { - i=read(fileno(stdin),cbuf,BUFSIZZ); +#ifdef APPS_CRLF + if (crlf) + { + int j, lf_num; + + i=read(fileno(stdin),cbuf,BUFSIZZ/2); + lf_num = 0; + /* both loops are skipped when i <= 0 */ + for (j = 0; j < i; j++) + if (cbuf[j] == '\n') + lf_num++; + for (j = i-1; j >= 0; j--) + { + cbuf[j+lf_num] = cbuf[j]; + if (cbuf[j] == '\n') + { + lf_num--; + i++; + cbuf[j+lf_num] = '\r'; + } + } + assert(lf_num == 0); + } + else +#endif + i=read(fileno(stdin),cbuf,BUFSIZZ); if ((!c_quiet) && ((i <= 0) || (cbuf[0] == 'Q'))) { @@ -623,18 +682,21 @@ printf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240 if ((!c_quiet) && (cbuf[0] == 'R')) { + BIO_printf(bio_err,"RENEGOTIATING\n"); SSL_renegotiate(con); - read_tty=0; - write_ssl=1; + cbuf_len=0; } else { cbuf_len=i; cbuf_off=0; +#ifdef CHARSET_EBCDIC + ebcdic2ascii(cbuf, cbuf, i); +#endif } - read_tty=0; write_ssl=1; + read_tty=0; } #endif } @@ -657,36 +719,38 @@ end: } -static void print_stuff(bio,s,full) -BIO *bio; -SSL *s; -int full; +static void print_stuff(BIO *bio, SSL *s, int full) { X509 *peer=NULL; char *p; static char *space=" "; char buf[BUFSIZ]; - STACK *sk; + STACK_OF(X509) *sk; + STACK_OF(X509_NAME) *sk2; SSL_CIPHER *c; X509_NAME *xn; int j,i; if (full) { + int got_a_chain = 0; + sk=SSL_get_peer_cert_chain(s); if (sk != NULL) { + got_a_chain = 1; /* we don't have it for SSL2 (yet) */ + BIO_printf(bio,"---\nCertificate chain\n"); - for (i=0; i 0)) + sk2=SSL_get_client_CA_list(s); + if ((sk2 != NULL) && (sk_X509_NAME_num(sk2) > 0)) { BIO_printf(bio,"---\nAcceptable client certificate CA names\n"); - for (i=0; i