Commit 06f4536a authored by Dr. Stephen Henson's avatar Dr. Stephen Henson
Browse files

Fix to make s_client and s_server work under Windows. A bit of a hack but

an improvement on not working at all.
parent bf196635
Loading
Loading
Loading
Loading
+13 −0
Original line number Original line Diff line number Diff line
@@ -4,6 +4,19 @@


 Changes between 0.9.4 and 0.9.5  [xx XXX 1999]
 Changes between 0.9.4 and 0.9.5  [xx XXX 1999]


  *) Ugly workaround to get s_client and s_server working under Windows. The
     old code wouldn't work because it needed to select() on sockets and the
     tty (for keypresses and to see if data could be written). Win32 only
     supports select() on sockets so we select() with a 1s timeout on the
     sockets and then see if any characters are waiting to be read, if none
     are present then we retry, we also assume we can always write data to
     the tty. This isn't nice because the code then blocks until we've
     received a complete line of data and it is effectively polling the
     keyboard at 1s intervals: however it's quite a bit better than not
     working at all :-) A dedicated Windows application might handle this
     with an event loop for example.
     [Steve Henson]

  *) Enhance RSA_METHOD structure. Now there are two extra methods, rsa_sign
  *) Enhance RSA_METHOD structure. Now there are two extra methods, rsa_sign
     and rsa_verify. When the RSA_FLAGS_SIGN_VER option is set these functions
     and rsa_verify. When the RSA_FLAGS_SIGN_VER option is set these functions
     will be called when RSA_sign() and RSA_verify() are used. This is useful
     will be called when RSA_sign() and RSA_verify() are used. This is useful
+45 −7
Original line number Original line Diff line number Diff line
@@ -81,6 +81,11 @@ typedef unsigned int u_int;
#include <openssl/pem.h>
#include <openssl/pem.h>
#include "s_apps.h"
#include "s_apps.h"


#ifdef WINDOWS
#include <conio.h>
#endif


#if (defined(VMS) && __VMS_VER < 70000000)
#if (defined(VMS) && __VMS_VER < 70000000)
/* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */
/* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */
#undef FIONBIO
#undef FIONBIO
@@ -173,7 +178,9 @@ int MAIN(int argc, char **argv)
	int ret=1,in_init=1,i,nbio_test=0;
	int ret=1,in_init=1,i,nbio_test=0;
	SSL_METHOD *meth=NULL;
	SSL_METHOD *meth=NULL;
	BIO *sbio;
	BIO *sbio;
	/*static struct timeval timeout={10,0};*/
#ifdef WINDOWS
	struct timeval tv;
#endif


#if !defined(NO_SSL2) && !defined(NO_SSL3)
#if !defined(NO_SSL2) && !defined(NO_SSL3)
	meth=SSLv23_client_method();
	meth=SSLv23_client_method();
@@ -465,12 +472,18 @@ re_start:
				if (read_tty)  FD_SET(fileno(stdin),&readfds);
				if (read_tty)  FD_SET(fileno(stdin),&readfds);
				if (write_tty) FD_SET(fileno(stdout),&writefds);
				if (write_tty) FD_SET(fileno(stdout),&writefds);
				}
				}
#endif
			if (read_ssl)
			if (read_ssl)
				FD_SET(SSL_get_fd(con),&readfds);
				FD_SET(SSL_get_fd(con),&readfds);
			if (write_ssl)
			if (write_ssl)
				FD_SET(SSL_get_fd(con),&writefds);
				FD_SET(SSL_get_fd(con),&writefds);

#else
			if(!tty_on || !write_tty) {
				if (read_ssl)
					FD_SET(SSL_get_fd(con),&readfds);
				if (write_ssl)
					FD_SET(SSL_get_fd(con),&writefds);
			}
#endif
/*			printf("mode tty(%d %d%d) ssl(%d%d)\n",
/*			printf("mode tty(%d %d%d) ssl(%d%d)\n",
				tty_on,read_tty,write_tty,read_ssl,write_ssl);*/
				tty_on,read_tty,write_tty,read_ssl,write_ssl);*/


@@ -480,8 +493,28 @@ re_start:
			 * will choke the compiler: if you do have a cast then
			 * will choke the compiler: if you do have a cast then
			 * you can either go for (int *) or (void *).
			 * you can either go for (int *) or (void *).
			 */
			 */
#ifdef WINDOWS
			/* Under Windows we make the assumption that we can
			 * always write to the tty: therefore if we need to
			 * write to the tty we just fall through. Otherwise
			 * we timeout the select every second and see if there
			 * are any keypresses. Note: this is a hack, in a proper
			 * Windows application we wouldn't do this.
			 */
			if(!write_tty) {
				if(read_tty) {
					tv.tv_sec = 1;
					tv.tv_usec = 0;
					i=select(width,(void *)&readfds,(void *)&writefds,
					i=select(width,(void *)&readfds,(void *)&writefds,
						 NULL,&tv);
					if(!i && (!_kbhit() || !read_tty) ) continue;
				} else 	i=select(width,(void *)&readfds,(void *)&writefds,
					 NULL,NULL);
					 NULL,NULL);
			}
#else
			i=select(width,(void *)&readfds,(void *)&writefds,
				 NULL,NULL);
#endif
			if ( i < 0)
			if ( i < 0)
				{
				{
				BIO_printf(bio_err,"bad select %d\n",
				BIO_printf(bio_err,"bad select %d\n",
@@ -558,8 +591,12 @@ re_start:
				goto shut;
				goto shut;
				}
				}
			}
			}
#ifndef WINDOWS
#ifdef WINDOWS
		/* Assume Windows can always write */
		else if (!ssl_pending && write_tty)
#else
		else if (!ssl_pending && FD_ISSET(fileno(stdout),&writefds))
		else if (!ssl_pending && FD_ISSET(fileno(stdout),&writefds))
#endif
			{
			{
#ifdef CHARSET_EBCDIC
#ifdef CHARSET_EBCDIC
			ascii2ebcdic(&(sbuf[sbuf_off]),&(sbuf[sbuf_off]),sbuf_len);
			ascii2ebcdic(&(sbuf[sbuf_off]),&(sbuf[sbuf_off]),sbuf_len);
@@ -581,7 +618,6 @@ re_start:
				write_tty=0;
				write_tty=0;
				}
				}
			}
			}
#endif
		else if (ssl_pending || FD_ISSET(SSL_get_fd(con),&readfds))
		else if (ssl_pending || FD_ISSET(SSL_get_fd(con),&readfds))
			{
			{
#ifdef RENEG
#ifdef RENEG
@@ -636,8 +672,11 @@ printf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240
				}
				}
			}
			}


#ifndef WINDOWS
#ifdef WINDOWS
		else if (_kbhit())
#else
		else if (FD_ISSET(fileno(stdin),&readfds))
		else if (FD_ISSET(fileno(stdin),&readfds))
#endif
			{
			{
			if (crlf)
			if (crlf)
				{
				{
@@ -688,7 +727,6 @@ printf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240
			write_ssl=1;
			write_ssl=1;
			read_tty=0;
			read_tty=0;
			}
			}
#endif
		}
		}
shut:
shut:
	SSL_shutdown(con);
	SSL_shutdown(con);
+23 −3
Original line number Original line Diff line number Diff line
@@ -85,6 +85,10 @@ typedef unsigned int u_int;
#include <openssl/ssl.h>
#include <openssl/ssl.h>
#include "s_apps.h"
#include "s_apps.h"


#ifdef WINDOWS
#include <conio.h>
#endif

#if (defined(VMS) && __VMS_VER < 70000000)
#if (defined(VMS) && __VMS_VER < 70000000)
/* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */
/* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */
#undef FIONBIO
#undef FIONBIO
@@ -748,6 +752,9 @@ static int sv_body(char *hostname, int s, unsigned char *context)
	unsigned long l;
	unsigned long l;
	SSL *con=NULL;
	SSL *con=NULL;
	BIO *sbio;
	BIO *sbio;
#ifdef WINDOWS
	struct timeval tv;
#endif


	if ((buf=Malloc(bufsize)) == NULL)
	if ((buf=Malloc(bufsize)) == NULL)
		{
		{
@@ -807,9 +814,22 @@ static int sv_body(char *hostname, int s, unsigned char *context)
		 * the compiler: if you do have a cast then you can either
		 * the compiler: if you do have a cast then you can either
		 * go for (int *) or (void *).
		 * go for (int *) or (void *).
		 */
		 */
#ifdef WINDOWS
		/* Under Windows we can't select on stdin: only
		 * on sockets. As a workaround we timeout the select every
		 * second and check for any keypress. In a proper Windows
		 * application we wouldn't do this because it is inefficient.
		 */
		tv.tv_sec = 1;
		tv.tv_usec = 0;
		i=select(width,(void *)&readfds,NULL,NULL,&tv);
		if((i < 0) || (!i && !_kbhit() ) )continue;
		if(_kbhit())
#else
  		i=select(width,(void *)&readfds,NULL,NULL,NULL);
  		i=select(width,(void *)&readfds,NULL,NULL,NULL);
  		if (i <= 0) continue;
  		if (i <= 0) continue;
  		if (FD_ISSET(fileno(stdin),&readfds))
  		if (FD_ISSET(fileno(stdin),&readfds))
#endif
			{
			{
			if (s_crlf)
			if (s_crlf)
				{
				{