diff options
author | marha <marha@users.sourceforge.net> | 2015-02-22 21:39:56 +0100 |
---|---|---|
committer | marha <marha@users.sourceforge.net> | 2015-02-22 21:39:56 +0100 |
commit | 462f18c7b25fe3e467f837647d07ab0a78aa8d2b (patch) | |
tree | fc8013c0a1bac05a1945846c1697e973f4c35013 /openssl/crypto/des/read_pwd.c | |
parent | 36f711ee12b6dd5184198abed3aa551efb585587 (diff) | |
download | vcxsrv-462f18c7b25fe3e467f837647d07ab0a78aa8d2b.tar.gz vcxsrv-462f18c7b25fe3e467f837647d07ab0a78aa8d2b.tar.bz2 vcxsrv-462f18c7b25fe3e467f837647d07ab0a78aa8d2b.zip |
Merged origin/release (checked in because wanted to merge new stuff)
Diffstat (limited to 'openssl/crypto/des/read_pwd.c')
-rw-r--r-- | openssl/crypto/des/read_pwd.c | 728 |
1 files changed, 370 insertions, 358 deletions
diff --git a/openssl/crypto/des/read_pwd.c b/openssl/crypto/des/read_pwd.c index ce5fa00a3..514a7063b 100644 --- a/openssl/crypto/des/read_pwd.c +++ b/openssl/crypto/des/read_pwd.c @@ -5,21 +5,21 @@ * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. - * + * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). - * + * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -34,10 +34,10 @@ * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). - * 4. If you include any Windows specific code (or a derivative thereof) from + * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - * + * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -49,7 +49,7 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * + * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence @@ -58,29 +58,32 @@ #include <openssl/e_os2.h> #if !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_WIN32) -#ifdef OPENSSL_UNISTD -# include OPENSSL_UNISTD -#else -# include <unistd.h> -#endif -/* If unistd.h defines _POSIX_VERSION, we conclude that we - * are on a POSIX system and have sigaction and termios. */ -#if defined(_POSIX_VERSION) - -# define SIGACTION -# if !defined(TERMIOS) && !defined(TERMIO) && !defined(SGTTY) -# define TERMIOS +# ifdef OPENSSL_UNISTD +# include OPENSSL_UNISTD +# else +# include <unistd.h> # endif +/* + * If unistd.h defines _POSIX_VERSION, we conclude that we are on a POSIX + * system and have sigaction and termios. + */ +# if defined(_POSIX_VERSION) -#endif +# define SIGACTION +# if !defined(TERMIOS) && !defined(TERMIO) && !defined(SGTTY) +# define TERMIOS +# endif + +# endif #endif -/* #define SIGACTION */ /* Define this if you have sigaction() */ +/* Define this if you have sigaction() */ +/* #define SIGACTION */ #ifdef WIN16TTY -#undef OPENSSL_SYS_WIN16 -#undef _WINDOWS -#include <graph.h> +# undef OPENSSL_SYS_WIN16 +# undef _WINDOWS +# include <graph.h> #endif /* 06-Apr-92 Luke Brennan Support for VMS */ @@ -92,111 +95,111 @@ #include <setjmp.h> #include <errno.h> -#ifdef OPENSSL_SYS_VMS /* prototypes for sys$whatever */ -#include <starlet.h> -#ifdef __DECC -#pragma message disable DOLLARID -#endif +#ifdef OPENSSL_SYS_VMS /* prototypes for sys$whatever */ +# include <starlet.h> +# ifdef __DECC +# pragma message disable DOLLARID +# endif #endif #ifdef WIN_CONSOLE_BUG -#include <windows.h> -#ifndef OPENSSL_SYS_WINCE -#include <wincon.h> -#endif +# include <windows.h> +# ifndef OPENSSL_SYS_WINCE +# include <wincon.h> +# endif #endif - -/* There are 5 types of terminal interface supported, - * TERMIO, TERMIOS, VMS, MSDOS and SGTTY +/* + * There are 5 types of terminal interface supported, TERMIO, TERMIOS, VMS, + * MSDOS and SGTTY */ #if defined(__sgi) && !defined(TERMIOS) -#define TERMIOS -#undef TERMIO -#undef SGTTY +# define TERMIOS +# undef TERMIO +# undef SGTTY #endif #if defined(linux) && !defined(TERMIO) -#undef TERMIOS -#define TERMIO -#undef SGTTY +# undef TERMIOS +# define TERMIO +# undef SGTTY #endif #ifdef _LIBC -#undef TERMIOS -#define TERMIO -#undef SGTTY +# undef TERMIOS +# define TERMIO +# undef SGTTY #endif #if !defined(TERMIO) && !defined(TERMIOS) && !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_MSDOS) && !defined(MAC_OS_pre_X) && !defined(MAC_OS_GUSI_SOURCE) -#undef TERMIOS -#undef TERMIO -#define SGTTY +# undef TERMIOS +# undef TERMIO +# define SGTTY #endif #if defined(OPENSSL_SYS_VXWORKS) -#undef TERMIOS -#undef TERMIO -#undef SGTTY +# undef TERMIOS +# undef TERMIO +# undef SGTTY #endif #ifdef TERMIOS -#include <termios.h> -#define TTY_STRUCT struct termios -#define TTY_FLAGS c_lflag -#define TTY_get(tty,data) tcgetattr(tty,data) -#define TTY_set(tty,data) tcsetattr(tty,TCSANOW,data) +# include <termios.h> +# define TTY_STRUCT struct termios +# define TTY_FLAGS c_lflag +# define TTY_get(tty,data) tcgetattr(tty,data) +# define TTY_set(tty,data) tcsetattr(tty,TCSANOW,data) #endif #ifdef TERMIO -#include <termio.h> -#define TTY_STRUCT struct termio -#define TTY_FLAGS c_lflag -#define TTY_get(tty,data) ioctl(tty,TCGETA,data) -#define TTY_set(tty,data) ioctl(tty,TCSETA,data) +# include <termio.h> +# define TTY_STRUCT struct termio +# define TTY_FLAGS c_lflag +# define TTY_get(tty,data) ioctl(tty,TCGETA,data) +# define TTY_set(tty,data) ioctl(tty,TCSETA,data) #endif #ifdef SGTTY -#include <sgtty.h> -#define TTY_STRUCT struct sgttyb -#define TTY_FLAGS sg_flags -#define TTY_get(tty,data) ioctl(tty,TIOCGETP,data) -#define TTY_set(tty,data) ioctl(tty,TIOCSETP,data) +# include <sgtty.h> +# define TTY_STRUCT struct sgttyb +# define TTY_FLAGS sg_flags +# define TTY_get(tty,data) ioctl(tty,TIOCGETP,data) +# define TTY_set(tty,data) ioctl(tty,TIOCSETP,data) #endif #if !defined(_LIBC) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VMS) && !defined(MAC_OS_pre_X) -#include <sys/ioctl.h> +# include <sys/ioctl.h> #endif -#if defined(OPENSSL_SYS_MSDOS) && !defined(__CYGWIN32__) && !defined(OPENSSL_SYS_WINCE) -#include <conio.h> -#define fgets(a,b,c) noecho_fgets(a,b,c) +#if defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_WINCE) +# include <conio.h> +# define fgets(a,b,c) noecho_fgets(a,b,c) #endif #ifdef OPENSSL_SYS_VMS -#include <ssdef.h> -#include <iodef.h> -#include <ttdef.h> -#include <descrip.h> +# include <ssdef.h> +# include <iodef.h> +# include <ttdef.h> +# include <descrip.h> struct IOSB { - short iosb$w_value; - short iosb$w_count; - long iosb$l_info; - }; + short iosb$w_value; + short iosb$w_count; + long iosb$l_info; +}; #endif #if defined(MAC_OS_pre_X) || defined(MAC_OS_GUSI_SOURCE) /* * This one needs work. As a matter of fact the code is unoperational * and this is only a trick to get it compiled. - * <appro@fy.chalmers.se> + * <appro@fy.chalmers.se> */ -#define TTY_STRUCT int +# define TTY_STRUCT int #endif #ifndef NX509_SIG -#define NX509_SIG 32 +# define NX509_SIG 32 #endif static void read_till_nl(FILE *); @@ -207,315 +210,324 @@ static void popsig(void); static int noecho_fgets(char *buf, int size, FILE *tty); #endif #ifdef SIGACTION - static struct sigaction savsig[NX509_SIG]; +static struct sigaction savsig[NX509_SIG]; #else - static void (*savsig[NX509_SIG])(int ); +static void (*savsig[NX509_SIG]) (int); #endif static jmp_buf save; -int des_read_pw_string(char *buf, int length, const char *prompt, - int verify) - { - char buff[BUFSIZ]; - int ret; +int des_read_pw_string(char *buf, int length, const char *prompt, int verify) +{ + char buff[BUFSIZ]; + int ret; - ret=des_read_pw(buf,buff,(length>BUFSIZ)?BUFSIZ:length,prompt,verify); - OPENSSL_cleanse(buff,BUFSIZ); - return(ret); - } + ret = + des_read_pw(buf, buff, (length > BUFSIZ) ? BUFSIZ : length, prompt, + verify); + OPENSSL_cleanse(buff, BUFSIZ); + return (ret); +} #ifdef OPENSSL_SYS_WINCE -int des_read_pw(char *buf, char *buff, int size, const char *prompt, int verify) - { - memset(buf,0,size); - memset(buff,0,size); - return(0); - } +int des_read_pw(char *buf, char *buff, int size, const char *prompt, + int verify) +{ + memset(buf, 0, size); + memset(buff, 0, size); + return (0); +} #elif defined(OPENSSL_SYS_WIN16) int des_read_pw(char *buf, char *buff, int size, char *prompt, int verify) - { - memset(buf,0,size); - memset(buff,0,size); - return(0); - } +{ + memset(buf, 0, size); + memset(buff, 0, size); + return (0); +} -#else /* !OPENSSL_SYS_WINCE && !OPENSSL_SYS_WIN16 */ +#else /* !OPENSSL_SYS_WINCE && !OPENSSL_SYS_WIN16 */ static void read_till_nl(FILE *in) - { -#define SIZE 4 - char buf[SIZE+1]; - - do { - fgets(buf,SIZE,in); - } while (strchr(buf,'\n') == NULL); - } +{ +# define SIZE 4 + char buf[SIZE + 1]; + do { + fgets(buf, SIZE, in); + } while (strchr(buf, '\n') == NULL); +} /* return 0 if ok, 1 (or -1) otherwise */ int des_read_pw(char *buf, char *buff, int size, const char *prompt, - int verify) - { -#ifdef OPENSSL_SYS_VMS - struct IOSB iosb; - $DESCRIPTOR(terminal,"TT"); - long tty_orig[3], tty_new[3]; - long status; - unsigned short channel = 0; -#else -#if !defined(OPENSSL_SYS_MSDOS) || defined(__DJGPP__) - TTY_STRUCT tty_orig,tty_new; -#endif -#endif - int number; - int ok; - /* statics are simply to avoid warnings about longjmp clobbering - things */ - static int ps; - int is_a_tty; - static FILE *tty; - char *p; - - if (setjmp(save)) - { - ok=0; - goto error; - } - - number=5; - ok=0; - ps=0; - is_a_tty=1; - tty=NULL; - -#ifdef OPENSSL_SYS_MSDOS - if ((tty=fopen("con","r")) == NULL) - tty=stdin; -#elif defined(MAC_OS_pre_X) || defined(OPENSSL_SYS_VXWORKS) - tty=stdin; -#else -#ifndef OPENSSL_SYS_MPE - if ((tty=fopen("/dev/tty","r")) == NULL) -#endif - tty=stdin; -#endif + int verify) +{ +# ifdef OPENSSL_SYS_VMS + struct IOSB iosb; + $DESCRIPTOR(terminal, "TT"); + long tty_orig[3], tty_new[3]; + long status; + unsigned short channel = 0; +# else +# if !defined(OPENSSL_SYS_MSDOS) || defined(__DJGPP__) + TTY_STRUCT tty_orig, tty_new; +# endif +# endif + int number; + int ok; + /* + * statics are simply to avoid warnings about longjmp clobbering things + */ + static int ps; + int is_a_tty; + static FILE *tty; + char *p; + + if (setjmp(save)) { + ok = 0; + goto error; + } + + number = 5; + ok = 0; + ps = 0; + is_a_tty = 1; + tty = NULL; + +# ifdef OPENSSL_SYS_MSDOS + if ((tty = fopen("con", "r")) == NULL) + tty = stdin; +# elif defined(MAC_OS_pre_X) || defined(OPENSSL_SYS_VXWORKS) + tty = stdin; +# else +# ifndef OPENSSL_SYS_MPE + if ((tty = fopen("/dev/tty", "r")) == NULL) +# endif + tty = stdin; +# endif -#if defined(TTY_get) && !defined(OPENSSL_SYS_VMS) - if (TTY_get(fileno(tty),&tty_orig) == -1) - { -#ifdef ENOTTY - if (errno == ENOTTY) - is_a_tty=0; - else -#endif -#ifdef EINVAL - /* Ariel Glenn ariel@columbia.edu reports that solaris - * can return EINVAL instead. This should be ok */ - if (errno == EINVAL) - is_a_tty=0; - else -#endif - return(-1); - } - memcpy(&(tty_new),&(tty_orig),sizeof(tty_orig)); -#endif -#ifdef OPENSSL_SYS_VMS - status = sys$assign(&terminal,&channel,0,0); - if (status != SS$_NORMAL) - return(-1); - status=sys$qiow(0,channel,IO$_SENSEMODE,&iosb,0,0,tty_orig,12,0,0,0,0); - if ((status != SS$_NORMAL) || (iosb.iosb$w_value != SS$_NORMAL)) - return(-1); -#endif +# if defined(TTY_get) && !defined(OPENSSL_SYS_VMS) + if (TTY_get(fileno(tty), &tty_orig) == -1) { +# ifdef ENOTTY + if (errno == ENOTTY) + is_a_tty = 0; + else +# endif +# ifdef EINVAL + /* + * Ariel Glenn ariel@columbia.edu reports that solaris can return + * EINVAL instead. This should be ok + */ + if (errno == EINVAL) + is_a_tty = 0; + else +# endif + return (-1); + } + memcpy(&(tty_new), &(tty_orig), sizeof(tty_orig)); +# endif +# ifdef OPENSSL_SYS_VMS + status = sys$assign(&terminal, &channel, 0, 0); + if (status != SS$_NORMAL) + return (-1); + status = + sys$qiow(0, channel, IO$_SENSEMODE, &iosb, 0, 0, tty_orig, 12, 0, 0, + 0, 0); + if ((status != SS$_NORMAL) || (iosb.iosb$w_value != SS$_NORMAL)) + return (-1); +# endif - pushsig(); - ps=1; + pushsig(); + ps = 1; -#ifdef TTY_FLAGS - tty_new.TTY_FLAGS &= ~ECHO; -#endif +# ifdef TTY_FLAGS + tty_new.TTY_FLAGS &= ~ECHO; +# endif -#if defined(TTY_set) && !defined(OPENSSL_SYS_VMS) - if (is_a_tty && (TTY_set(fileno(tty),&tty_new) == -1)) -#ifdef OPENSSL_SYS_MPE - ; /* MPE lies -- echo really has been disabled */ -#else - return(-1); -#endif -#endif -#ifdef OPENSSL_SYS_VMS - tty_new[0] = tty_orig[0]; - tty_new[1] = tty_orig[1] | TT$M_NOECHO; - tty_new[2] = tty_orig[2]; - status = sys$qiow(0,channel,IO$_SETMODE,&iosb,0,0,tty_new,12,0,0,0,0); - if ((status != SS$_NORMAL) || (iosb.iosb$w_value != SS$_NORMAL)) - return(-1); -#endif - ps=2; - - while ((!ok) && (number--)) - { - fputs(prompt,stderr); - fflush(stderr); - - buf[0]='\0'; - fgets(buf,size,tty); - if (feof(tty)) goto error; - if (ferror(tty)) goto error; - if ((p=(char *)strchr(buf,'\n')) != NULL) - *p='\0'; - else read_till_nl(tty); - if (verify) - { - fprintf(stderr,"\nVerifying password - %s",prompt); - fflush(stderr); - buff[0]='\0'; - fgets(buff,size,tty); - if (feof(tty)) goto error; - if ((p=(char *)strchr(buff,'\n')) != NULL) - *p='\0'; - else read_till_nl(tty); - - if (strcmp(buf,buff) != 0) - { - fprintf(stderr,"\nVerify failure"); - fflush(stderr); - break; - /* continue; */ - } - } - ok=1; - } - -error: - fprintf(stderr,"\n"); -#if 0 - perror("fgets(tty)"); -#endif - /* What can we do if there is an error? */ -#if defined(TTY_set) && !defined(OPENSSL_SYS_VMS) - if (ps >= 2) TTY_set(fileno(tty),&tty_orig); -#endif -#ifdef OPENSSL_SYS_VMS - if (ps >= 2) - status = sys$qiow(0,channel,IO$_SETMODE,&iosb,0,0 - ,tty_orig,12,0,0,0,0); -#endif - - if (ps >= 1) popsig(); - if (stdin != tty) fclose(tty); -#ifdef OPENSSL_SYS_VMS - status = sys$dassgn(channel); -#endif - return(!ok); - } +# if defined(TTY_set) && !defined(OPENSSL_SYS_VMS) + if (is_a_tty && (TTY_set(fileno(tty), &tty_new) == -1)) +# ifdef OPENSSL_SYS_MPE + ; /* MPE lies -- echo really has been disabled */ +# else + return (-1); +# endif +# endif +# ifdef OPENSSL_SYS_VMS + tty_new[0] = tty_orig[0]; + tty_new[1] = tty_orig[1] | TT$M_NOECHO; + tty_new[2] = tty_orig[2]; + status = + sys$qiow(0, channel, IO$_SETMODE, &iosb, 0, 0, tty_new, 12, 0, 0, 0, + 0); + if ((status != SS$_NORMAL) || (iosb.iosb$w_value != SS$_NORMAL)) + return (-1); +# endif + ps = 2; + + while ((!ok) && (number--)) { + fputs(prompt, stderr); + fflush(stderr); + + buf[0] = '\0'; + fgets(buf, size, tty); + if (feof(tty)) + goto error; + if (ferror(tty)) + goto error; + if ((p = (char *)strchr(buf, '\n')) != NULL) + *p = '\0'; + else + read_till_nl(tty); + if (verify) { + fprintf(stderr, "\nVerifying password - %s", prompt); + fflush(stderr); + buff[0] = '\0'; + fgets(buff, size, tty); + if (feof(tty)) + goto error; + if ((p = (char *)strchr(buff, '\n')) != NULL) + *p = '\0'; + else + read_till_nl(tty); + + if (strcmp(buf, buff) != 0) { + fprintf(stderr, "\nVerify failure"); + fflush(stderr); + break; + /* continue; */ + } + } + ok = 1; + } + + error: + fprintf(stderr, "\n"); +# if 0 + perror("fgets(tty)"); +# endif + /* What can we do if there is an error? */ +# if defined(TTY_set) && !defined(OPENSSL_SYS_VMS) + if (ps >= 2) + TTY_set(fileno(tty), &tty_orig); +# endif +# ifdef OPENSSL_SYS_VMS + if (ps >= 2) + status = + sys$qiow(0, channel, IO$_SETMODE, &iosb, 0, 0, tty_orig, 12, 0, 0, + 0, 0); +# endif + + if (ps >= 1) + popsig(); + if (stdin != tty) + fclose(tty); +# ifdef OPENSSL_SYS_VMS + status = sys$dassgn(channel); +# endif + return (!ok); +} static void pushsig(void) - { - int i; -#ifdef SIGACTION - struct sigaction sa; +{ + int i; +# ifdef SIGACTION + struct sigaction sa; - memset(&sa,0,sizeof sa); - sa.sa_handler=recsig; -#endif + memset(&sa, 0, sizeof sa); + sa.sa_handler = recsig; +# endif - for (i=1; i<NX509_SIG; i++) - { -#ifdef SIGUSR1 - if (i == SIGUSR1) - continue; -#endif -#ifdef SIGUSR2 - if (i == SIGUSR2) - continue; -#endif -#ifdef SIGACTION - sigaction(i,&sa,&savsig[i]); -#else - savsig[i]=signal(i,recsig); -#endif - } + for (i = 1; i < NX509_SIG; i++) { +# ifdef SIGUSR1 + if (i == SIGUSR1) + continue; +# endif +# ifdef SIGUSR2 + if (i == SIGUSR2) + continue; +# endif +# ifdef SIGACTION + sigaction(i, &sa, &savsig[i]); +# else + savsig[i] = signal(i, recsig); +# endif + } -#ifdef SIGWINCH - signal(SIGWINCH,SIG_DFL); -#endif - } +# ifdef SIGWINCH + signal(SIGWINCH, SIG_DFL); +# endif +} static void popsig(void) - { - int i; - - for (i=1; i<NX509_SIG; i++) - { -#ifdef SIGUSR1 - if (i == SIGUSR1) - continue; -#endif -#ifdef SIGUSR2 - if (i == SIGUSR2) - continue; -#endif -#ifdef SIGACTION - sigaction(i,&savsig[i],NULL); -#else - signal(i,savsig[i]); -#endif - } - } +{ + int i; + + for (i = 1; i < NX509_SIG; i++) { +# ifdef SIGUSR1 + if (i == SIGUSR1) + continue; +# endif +# ifdef SIGUSR2 + if (i == SIGUSR2) + continue; +# endif +# ifdef SIGACTION + sigaction(i, &savsig[i], NULL); +# else + signal(i, savsig[i]); +# endif + } +} static void recsig(int i) - { - longjmp(save,1); -#ifdef LINT - i=i; -#endif - } +{ + longjmp(save, 1); +# ifdef LINT + i = i; +# endif +} -#ifdef OPENSSL_SYS_MSDOS +# ifdef OPENSSL_SYS_MSDOS static int noecho_fgets(char *buf, int size, FILE *tty) - { - int i; - char *p; - - p=buf; - for (;;) - { - if (size == 0) - { - *p='\0'; - break; - } - size--; -#ifdef WIN16TTY - i=_inchar(); -#else - i=getch(); -#endif - if (i == '\r') i='\n'; - *(p++)=i; - if (i == '\n') - { - *p='\0'; - break; - } - } -#ifdef WIN_CONSOLE_BUG -/* Win95 has several evil console bugs: one of these is that the - * last character read using getch() is passed to the next read: this is - * usually a CR so this can be trouble. No STDIO fix seems to work but - * flushing the console appears to do the trick. - */ - { - HANDLE inh; - inh = GetStdHandle(STD_INPUT_HANDLE); - FlushConsoleInputBuffer(inh); - } -#endif - return(strlen(buf)); - } -#endif -#endif /* !OPENSSL_SYS_WINCE && !WIN16 */ +{ + int i; + char *p; + + p = buf; + for (;;) { + if (size == 0) { + *p = '\0'; + break; + } + size--; +# ifdef WIN16TTY + i = _inchar(); +# else + i = getch(); +# endif + if (i == '\r') + i = '\n'; + *(p++) = i; + if (i == '\n') { + *p = '\0'; + break; + } + } +# ifdef WIN_CONSOLE_BUG + /* + * Win95 has several evil console bugs: one of these is that the last + * character read using getch() is passed to the next read: this is + * usually a CR so this can be trouble. No STDIO fix seems to work but + * flushing the console appears to do the trick. + */ + { + HANDLE inh; + inh = GetStdHandle(STD_INPUT_HANDLE); + FlushConsoleInputBuffer(inh); + } +# endif + return (strlen(buf)); +} +# endif +#endif /* !OPENSSL_SYS_WINCE && !WIN16 */ |