diff options
Diffstat (limited to 'apps')
-rw-r--r-- | apps/apps.c | 31 | ||||
-rw-r--r-- | apps/apps.h | 3 | ||||
-rw-r--r-- | apps/s_client.c | 23 | ||||
-rw-r--r-- | apps/s_server.c | 6 |
4 files changed, 40 insertions, 23 deletions
diff --git a/apps/apps.c b/apps/apps.c index 5db4b22b3a..a3e1794c31 100644 --- a/apps/apps.c +++ b/apps/apps.c @@ -14,6 +14,7 @@ */ # define _POSIX_C_SOURCE 2 #endif + #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -41,7 +42,7 @@ #endif #include <openssl/bn.h> #include <openssl/ssl.h> - +#include "s_apps.h" #include "apps.h" #ifdef _WIN32 @@ -2550,3 +2551,31 @@ void wait_for_async(SSL *s) select(width, (void *)&asyncfds, NULL, NULL, NULL); #endif } + +/* if OPENSSL_SYS_WINDOWS is defined then so is OPENSSL_SYS_MSDOS */ +#if defined(OPENSSL_SYS_MSDOS) +int has_stdin_waiting(void) +{ +# if defined(OPENSSL_SYS_WINDOWS) + HANDLE inhand = GetStdHandle(STD_INPUT_HANDLE); + DWORD events = 0; + INPUT_RECORD inputrec; + DWORD insize = 1; + BOOL peeked; + + if (inhand == INVALID_HANDLE_VALUE) { + return 0; + } + + peeked = PeekConsoleInput(inhand, &inputrec, insize, &events); + if (!peeked) { + /* Probably redirected input? _kbhit() does not work in this case */ + if (!feof(stdin)) { + return 1; + } + return 0; + } +# endif + return _kbhit(); +} +#endif diff --git a/apps/apps.h b/apps/apps.h index 83dc0c157b..6a0acab58c 100644 --- a/apps/apps.h +++ b/apps/apps.h @@ -67,6 +67,9 @@ CONF *app_load_config_quiet(const char *filename); int app_load_modules(const CONF *config); void unbuffer(FILE *fp); void wait_for_async(SSL *s); +# if defined(OPENSSL_SYS_MSDOS) +int has_stdin_waiting(void); +# endif /* * Common verification options. diff --git a/apps/s_client.c b/apps/s_client.c index d8678c39ef..fab5a5d807 100644 --- a/apps/s_client.c +++ b/apps/s_client.c @@ -2160,18 +2160,8 @@ int s_client_main(int argc, char **argv) tv.tv_usec = 0; i = select(width, (void *)&readfds, (void *)&writefds, NULL, &tv); -# if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS) - if (!i && (!_kbhit() || !read_tty)) + if (!i && (!has_stdin_waiting() || !read_tty)) continue; -# else - if (!i && (!((_kbhit()) - || (WAIT_OBJECT_0 == - WaitForSingleObject(GetStdHandle - (STD_INPUT_HANDLE), - 0))) - || !read_tty)) - continue; -# endif } else i = select(width, (void *)&readfds, (void *)&writefds, NULL, timeoutp); @@ -2348,14 +2338,9 @@ int s_client_main(int argc, char **argv) /* break; */ } } -#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))) -# endif +/* OPENSSL_SYS_MSDOS includes OPENSSL_SYS_WINDOWS */ +#if defined(OPENSSL_SYS_MSDOS) + else if (has_stdin_waiting()) #else else if (FD_ISSET(fileno(stdin), &readfds)) #endif diff --git a/apps/s_server.c b/apps/s_server.c index 7271b611ef..08753c30fd 100644 --- a/apps/s_server.c +++ b/apps/s_server.c @@ -2167,10 +2167,10 @@ static int sv_body(int s, int stype, unsigned char *context) tv.tv_sec = 1; tv.tv_usec = 0; i = select(width, (void *)&readfds, NULL, NULL, &tv); - if ((i < 0) || (!i && !_kbhit())) - continue; - if (_kbhit()) + if (has_stdin_waiting()) read_from_terminal = 1; + if ((i < 0) || (!i && !read_from_terminal)) + continue; #else if ((SSL_version(con) == DTLS1_VERSION) && DTLSv1_get_timeout(con, &timeout)) |