Here is a revised patch using isatty() to check if stdin/stdin
is redirected. If they are allow setting binary mode. Otherwise
skip it as doing so prevents terminating a stuck app with ^C/^Break.

I can't see any use for making stdin binary while in "interactive"
mode except maybe in a password prompt. But then use of conio
functions would probably be better.

Patch against today's snapshot:

------------------------------------------------------------
--- ./snap-20030818/apps/s_apps.h     Tue Aug 19 00:12:16 2003
+++ ./apps/s_apps.h    Tue Jul 29 01:07:50 2003
@@ -112,6 +112,14 @@
 #include <sys/types.h>
 #include <openssl/opensslconf.h>

+#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
+#include <conio.h>
+#endif
+
+#ifdef OPENSSL_SYS_MSDOS
+#define _kbhit kbhit
+#endif
+
 #if defined(OPENSSL_SYS_VMS) && !defined(FD_SET)
 /* VAX C does not defined fd_set and friends, but it's actually quite simple */
 /* These definitions are borrowed from SOCKETSHR. /Richard Levitte */

--- ./snap-20030818/apps/s_client.c   Tue Aug 19 00:12:16 2003
+++ ./apps/s_client.c  Tue Jul 29 00:10:06 2003
@@ -136,10 +136,6 @@
 #include <openssl/rand.h>
 #include "s_apps.h"

-#ifdef OPENSSL_SYS_WINDOWS
-#include <conio.h>
-#endif
-
 #ifdef OPENSSL_SYS_WINCE
 /* Windows CE incorrectly defines fileno as returning void*, so to avoid problems 
below... */
 #ifdef fileno
@@ -260,7 +256,7 @@
  char *engine_id=NULL;
  ENGINE *e=NULL;
 #endif
-#ifdef OPENSSL_SYS_WINDOWS
+#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
  struct timeval tv;
 #endif

@@ -644,7 +640,7 @@

   if (!ssl_pending)
    {
-#ifndef OPENSSL_SYS_WINDOWS
+#if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS)
    if (tty_on)
     {
     if (read_tty)  FD_SET(fileno(stdin),&readfds);
@@ -671,8 +667,8 @@
     * will choke the compiler: if you do have a cast then
     * you can either go for (int *) or (void *).
     */
-#ifdef OPENSSL_SYS_WINDOWS
-   /* Under Windows we make the assumption that we can
+#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
+                        /* Under Windows/DOS 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
@@ -686,7 +682,7 @@
      tv.tv_usec = 0;
      i=select(width,(void *)&readfds,(void *)&writefds,
        NULL,&tv);
-#ifdef OPENSSL_SYS_WINCE
+#if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
      if(!i && (!_kbhit() || !read_tty) ) continue;
 #else
      if(!i && (!((_kbhit()) || (WAIT_OBJECT_0 == 
WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0))) || !read_tty) ) continue;
@@ -855,8 +851,8 @@
     }
    }

-#ifdef OPENSSL_SYS_WINDOWS
-#ifdef OPENSSL_SYS_WINCE
+#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
+#if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
   else if (_kbhit())
 #else
   else if ((_kbhit()) || (WAIT_OBJECT_0 == 
WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0)))

--- ./snap-20030818/apps/s_server.c   Tue Aug 19 00:12:16 2003
+++ ./apps/s_server.c  Mon Jul 28 23:58:10 2003
@@ -151,10 +151,6 @@
 #include <openssl/rand.h>
 #include "s_apps.h"

-#ifdef OPENSSL_SYS_WINDOWS
-#include <conio.h>
-#endif
-
 #ifdef OPENSSL_SYS_WINCE
 /* Windows CE incorrectly defines fileno as returning void*, so to avoid problems 
below... */
 #ifdef fileno
@@ -1001,7 +997,7 @@
  unsigned long l;
  SSL *con=NULL;
  BIO *sbio;
-#ifdef OPENSSL_SYS_WINDOWS
+#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
  struct timeval tv;
 #endif

@@ -1075,7 +1071,7 @@
   if (!read_from_sslcon)
    {
    FD_ZERO(&readfds);
-#ifndef OPENSSL_SYS_WINDOWS
+#if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS)
    FD_SET(fileno(stdin),&readfds);
 #endif
    FD_SET(s,&readfds);
@@ -1085,8 +1081,8 @@
     * the compiler: if you do have a cast then you can either
     * go for (int *) or (void *).
     */
-#ifdef OPENSSL_SYS_WINDOWS
-   /* Under Windows we can't select on stdin: only
+#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
+                        /* Under DOS (non-djgpp) and 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.

--- ./snap-20030818/crypto/bio/bss_file.c     Tue Aug 19 00:12:18 2003
+++ ./crypto/bio/bss_file.c    Mon Aug 18 01:35:48 2003
@@ -213,12 +213,29 @@
   b->shutdown=(int)num&BIO_CLOSE;
   b->ptr=(char *)ptr;
   b->init=1;
-#if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WINDOWS)
-  /* Set correct text/binary mode */
-  if (num & BIO_FP_TEXT)
-   _setmode(fileno((FILE *)ptr),_O_TEXT);
-  else
-   _setmode(fileno((FILE *)ptr),_O_BINARY);
+#if defined(OPENSSL_SYS_WINDOWS)
+                if (num & BIO_FP_TEXT)
+                     _setmode(fd,_O_TEXT);
+                else
+                     _setmode(fd,_O_BINARY);
+#elif defined(OPENSSL_SYS_MSDOS)
+                {
+                  int fd = fileno((FILE*)ptr);
+                  /* Set correct text/binary mode */
+                  if (num & BIO_FP_TEXT)
+                     _setmode(fd,_O_TEXT);
+                  /* Dangerous to set stdin/stdout to raw (unless redirected) */
+                  else
+                  {
+                    if (fd == STDIN_FILENO || fd == STDOUT_FILENO)
+                    {
+                      if (isatty(fd) <= 0)
+                         _setmode(fd,_O_BINARY);
+                    }
+                    else
+                      _setmode(fd,_O_BINARY);
+                  }
+                }
 #elif defined(OPENSSL_SYS_OS2)
   if (num & BIO_FP_TEXT)
    setmode(fileno((FILE *)ptr), O_TEXT);

------------------------------------------------------------

Gisle V.

Not what you think it is;  http://www.nice-tits.org


______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
Development Mailing List                       [EMAIL PROTECTED]
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to