X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=crypto%2Fui%2Fui_openssl.c;h=75318d48a14290ddd7dc84eeba9ba2486d368634;hp=c4e8c9c54b4035e6ce3536f50abe27644022c7e7;hb=018c56fdcad95befe7fe07b51d4c04d9af866c24;hpb=027902999e3adec562f8286eeed09c24aa82f465 diff --git a/crypto/ui/ui_openssl.c b/crypto/ui/ui_openssl.c index c4e8c9c54b..75318d48a1 100644 --- a/crypto/ui/ui_openssl.c +++ b/crypto/ui/ui_openssl.c @@ -1,9 +1,9 @@ /* crypto/ui/ui_openssl.c -*- mode:C; c-file-style: "eay" -*- */ -/* Written by Richard Levitte (levitte@stacken.kth.se) for the OpenSSL - * project 2000. +/* Written by Richard Levitte (richard@levitte.org) and others + * for the OpenSSL project 2001. */ /* ==================================================================== - * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved. + * Copyright (c) 2001 The OpenSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -115,7 +115,7 @@ */ -#include +#include #if !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VMS) # ifdef OPENSSL_UNISTD @@ -148,7 +148,6 @@ #include #include #include -#include #include #ifdef OPENSSL_SYS_VMS /* prototypes for sys$whatever */ @@ -160,8 +159,10 @@ #ifdef WIN_CONSOLE_BUG # include +#ifndef OPENSSL_SYS_WINCE # include #endif +#endif /* There are 5 types of terminal interface supported, @@ -192,6 +193,12 @@ # define SGTTY #endif +#if defined(OPENSSL_SYS_VXWORKS) +#undef TERMIOS +#undef TERMIO +#undef SGTTY +#endif + #ifdef TERMIOS # include # define TTY_STRUCT struct termios @@ -216,7 +223,7 @@ # define TTY_set(tty,data) ioctl(tty,TIOCSETP,data) #endif -#if !defined(_LIBC) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_MACINTOSH_CLASSIC) +#if !defined(_LIBC) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && !defined(OPENSSL_SYS_SUNOS) # include #endif @@ -236,6 +243,10 @@ struct IOSB { }; #endif +#ifdef OPENSSL_SYS_SUNOS + typedef int sig_atomic_t; +#endif + #if defined(OPENSSL_SYS_MACINTOSH_CLASSIC) || defined(MAC_OS_GUSI_SOURCE) /* * This one needs work. As a matter of fact the code is unoperational @@ -256,33 +267,35 @@ static struct sigaction savsig[NX509_SIG]; #else static void (*savsig[NX509_SIG])(int ); #endif -static jmp_buf save; #ifdef OPENSSL_SYS_VMS static struct IOSB iosb; static $DESCRIPTOR(terminal,"TT"); -static long tty_orig[3], tty_new[3]; +static long tty_orig[3], tty_new[3]; /* XXX Is there any guarantee that this will always suffice for the actual structures? */ static long status; static unsigned short channel = 0; #else -#ifndef OPENSSL_SYS_MSDOS +#if !defined(OPENSSL_SYS_MSDOS) || defined(__DJGPP__) static TTY_STRUCT tty_orig,tty_new; #endif #endif -static FILE *tty; +static FILE *tty_in, *tty_out; static int is_a_tty; /* Declare static functions */ +#if !defined(OPENSSL_SYS_WIN16) && !defined(OPENSSL_SYS_WINCE) static void read_till_nl(FILE *); static void recsig(int); static void pushsig(void); static void popsig(void); -#if defined(OENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_WIN16) +#endif +#if defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_WIN16) static int noecho_fgets(char *buf, int size, FILE *tty); #endif -static int read_string_inner(UI *ui, UI_STRING *uis, int echo); +static int read_string_inner(UI *ui, UI_STRING *uis, int echo, int strip_nl); static int read_string(UI *ui, UI_STRING *uis); +static int write_string(UI *ui, UI_STRING *uis); static int open_console(UI *ui); static int echo_console(UI *ui); @@ -293,9 +306,11 @@ static UI_METHOD ui_openssl = { "OpenSSL default user interface", open_console, + write_string, + NULL, /* No flusher is needed for command lines */ read_string, - NULL, /* The reader function writes as well */ close_console, + NULL }; /* The method with all the built-in thingies */ @@ -304,55 +319,63 @@ UI_METHOD *UI_OpenSSL(void) return &ui_openssl; } -static int read_string(UI *ui, UI_STRING *uis) +/* The following function makes sure that info and error strings are printed + before any prompt. */ +static int write_string(UI *ui, UI_STRING *uis) { switch (UI_get_string_type(uis)) { - case UI_VERIFY_NOECHO: - fprintf(tty,"Verifying - %s", - UI_get0_output_string(uis)); - fflush(tty); - if (read_string_inner(ui, uis, 0) == 0) - return 0; - if (strcmp(UI_get0_result_string(uis), - UI_get0_test_string(uis)) != 0) - { - fprintf(tty,"Verify failure\n"); - fflush(tty); - return 0; - } + case UIT_ERROR: + case UIT_INFO: + fputs(UI_get0_output_string(uis), tty_out); + fflush(tty_out); + break; + default: break; - case UI_VERIFY_ECHO: - fprintf(tty,"Verifying - %s", + } + return 1; + } + +static int read_string(UI *ui, UI_STRING *uis) + { + int ok = 0; + + switch (UI_get_string_type(uis)) + { + case UIT_BOOLEAN: + fputs(UI_get0_output_string(uis), tty_out); + fputs(UI_get0_action_string(uis), tty_out); + fflush(tty_out); + return read_string_inner(ui, uis, + UI_get_input_flags(uis) & UI_INPUT_FLAG_ECHO, 0); + case UIT_PROMPT: + fputs(UI_get0_output_string(uis), tty_out); + fflush(tty_out); + return read_string_inner(ui, uis, + UI_get_input_flags(uis) & UI_INPUT_FLAG_ECHO, 1); + case UIT_VERIFY: + fprintf(tty_out,"Verifying - %s", UI_get0_output_string(uis)); - fflush(tty); - if (read_string_inner(ui, uis, 1) == 0) - return 0; + fflush(tty_out); + if ((ok = read_string_inner(ui, uis, + UI_get_input_flags(uis) & UI_INPUT_FLAG_ECHO, 1)) <= 0) + return ok; if (strcmp(UI_get0_result_string(uis), UI_get0_test_string(uis)) != 0) { - fprintf(tty,"Verify failure\n"); - fflush(tty); + fprintf(tty_out,"Verify failure\n"); + fflush(tty_out); return 0; } break; - case UI_STRING_NOECHO: - fputs(UI_get0_output_string(uis), tty); - fflush(tty); - return read_string_inner(ui, uis, 0); - case UI_STRING_ECHO: - fputs(UI_get0_output_string(uis), tty); - fflush(tty); - return read_string_inner(ui, uis, 1); default: - fputs(UI_get0_output_string(uis), tty); - fflush(tty); break; } return 1; } +#if !defined(OPENSSL_SYS_WIN16) && !defined(OPENSSL_SYS_WINCE) /* Internal functions to read a string without echoing */ static void read_till_nl(FILE *in) { @@ -364,61 +387,69 @@ static void read_till_nl(FILE *in) } while (strchr(buf,'\n') == NULL); } -static int read_string_inner(UI *ui, UI_STRING *uis, int echo) +static volatile sig_atomic_t intr_signal; +#endif + +static int read_string_inner(UI *ui, UI_STRING *uis, int echo, int strip_nl) { static int ps; int ok; - char *result = OPENSSL_malloc(BUFSIZ); + char result[BUFSIZ]; int maxsize = BUFSIZ-1; +#if !defined(OPENSSL_SYS_WIN16) && !defined(OPENSSL_SYS_WINCE) + char *p; -#ifndef OPENSSL_SYS_WIN16 - if (setjmp(save)) - { - ok=0; - goto error; - } + intr_signal=0; ok=0; ps=0; pushsig(); ps=1; - if (!echo) noecho_console(ui); + if (!echo && !noecho_console(ui)) + goto error; ps=2; - while (!ok) - { - char *p; - - result[0]='\0'; + result[0]='\0'; #ifdef OPENSSL_SYS_MSDOS - if (!echo) - noecho_fgets(result,maxsize,tty); - else + if (!echo) + { + noecho_fgets(result,maxsize,tty_in); + p=result; /* FIXME: noecho_fgets doesn't return errors */ + } + else + p=fgets(result,maxsize,tty_in); +#else + p=fgets(result,maxsize,tty_in); #endif - fgets(result,maxsize,tty); - if (feof(tty)) goto error; - if (ferror(tty)) goto error; - if ((p=(char *)strchr(result,'\n')) != NULL) + if(!p) + goto error; + if (feof(tty_in)) goto error; + if (ferror(tty_in)) goto error; + if ((p=(char *)strchr(result,'\n')) != NULL) + { + if (strip_nl) *p='\0'; - else read_till_nl(tty); - if (UI_set_result(uis, result) >= 0) - ok=1; } + else + read_till_nl(tty_in); + if (UI_set_result(ui, uis, result) >= 0) + ok=1; error: - if (!echo) fprintf(tty,"\n"); - if (ps >= 2 && !echo) - echo_console(ui); + if (intr_signal == SIGINT) + ok=-1; + if (!echo) fprintf(tty_out,"\n"); + if (ps >= 2 && !echo && !echo_console(ui)) + ok=0; if (ps >= 1) popsig(); #else - memset(result,0,BUFSIZ); ok=1; #endif - OPENSSL_free(result); + OPENSSL_cleanse(result,BUFSIZ); return ok; } @@ -429,18 +460,23 @@ static int open_console(UI *ui) CRYPTO_w_lock(CRYPTO_LOCK_UI); is_a_tty = 1; -#ifdef OPENSSL_SYS_MSDOS - if ((tty=fopen("con","w+")) == NULL) - tty=stdin; -#elif defined(OPENSSL_SYS_MACINTOSH_CLASSIC) - tty=stdin; +#if defined(OPENSSL_SYS_MACINTOSH_CLASSIC) || defined(OPENSSL_SYS_VXWORKS) + tty_in=stdin; + tty_out=stderr; #else - if ((tty=fopen("/dev/tty","w+")) == NULL) - tty=stdin; +# ifdef OPENSSL_SYS_MSDOS +# define DEV_TTY "con" +# else +# define DEV_TTY "/dev/tty" +# endif + if ((tty_in=fopen(DEV_TTY,"r")) == NULL) + tty_in=stdin; + if ((tty_out=fopen(DEV_TTY,"w")) == NULL) + tty_out=stderr; #endif -#if defined(TTY_get) && !defined(VMS) - if (TTY_get(fileno(tty),&tty_orig) == -1) +#if defined(TTY_get) && !defined(OPENSSL_SYS_VMS) + if (TTY_get(fileno(tty_in),&tty_orig) == -1) { #ifdef ENOTTY if (errno == ENOTTY) @@ -476,7 +512,7 @@ static int noecho_console(UI *ui) #endif #if defined(TTY_set) && !defined(OPENSSL_SYS_VMS) - if (is_a_tty && (TTY_set(fileno(tty),&tty_new) == -1)) + if (is_a_tty && (TTY_set(fileno(tty_in),&tty_new) == -1)) return 0; #endif #ifdef OPENSSL_SYS_VMS @@ -498,7 +534,7 @@ static int echo_console(UI *ui) #endif #if defined(TTY_set) && !defined(OPENSSL_SYS_VMS) - if (is_a_tty && (TTY_set(fileno(tty),&tty_new) == -1)) + if (is_a_tty && (TTY_set(fileno(tty_in),&tty_new) == -1)) return 0; #endif #ifdef OPENSSL_SYS_VMS @@ -514,7 +550,8 @@ static int echo_console(UI *ui) static int close_console(UI *ui) { - if (stdin != tty) fclose(tty); + if (tty_in != stdin) fclose(tty_in); + if (tty_out != stderr) fclose(tty_out); #ifdef OPENSSL_SYS_VMS status = sys$dassgn(channel); #endif @@ -524,6 +561,7 @@ static int close_console(UI *ui) } +#if !defined(OPENSSL_SYS_WIN16) && !defined(OPENSSL_SYS_WINCE) /* Internal functions to handle signals and act on them */ static void pushsig(void) { @@ -585,15 +623,12 @@ static void popsig(void) static void recsig(int i) { - longjmp(save,1); -#ifdef LINT - i=i; -#endif + intr_signal=i; } - +#endif /* Internal functions specific for Windows */ -#if defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_WIN16) +#if defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_WIN16) && !defined(OPENSSL_SYS_WINCE) static int noecho_fgets(char *buf, int size, FILE *tty) { int i;