📄 ui_openssl.c
字号:
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_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_out,"Verify failure\n"); fflush(tty_out); return 0; } break; default: 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) {#define SIZE 4 char buf[SIZE+1]; do { fgets(buf,SIZE,in); } while (strchr(buf,'\n') == NULL); }static volatile sig_atomic_t intr_signal;#endifstatic int read_string_inner(UI *ui, UI_STRING *uis, int echo, int strip_nl) { static int ps; int ok; char result[BUFSIZ]; int maxsize = BUFSIZ-1;#if !defined(OPENSSL_SYS_WIN16) && !defined(OPENSSL_SYS_WINCE) char *p; intr_signal=0; ok=0; ps=0; pushsig(); ps=1; if (!echo && !noecho_console(ui)) goto error; ps=2; result[0]='\0';#ifdef OPENSSL_SYS_MSDOS 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 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_in); if (UI_set_result(ui, uis, result) >= 0) ok=1;error: 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 ok=1;#endif OPENSSL_cleanse(result,BUFSIZ); return ok; }/* Internal functions to open, handle and close a channel to the console. */static int open_console(UI *ui) { CRYPTO_w_lock(CRYPTO_LOCK_UI); is_a_tty = 1;#if defined(OPENSSL_SYS_MACINTOSH_CLASSIC) || defined(OPENSSL_SYS_VXWORKS) || defined(OPENSSL_SYS_NETWARE) tty_in=stdin; tty_out=stderr;#else# 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(OPENSSL_SYS_VMS) if (TTY_get(fileno(tty_in),&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 0; }#endif#ifdef OPENSSL_SYS_VMS status = sys$assign(&terminal,&channel,0,0); if (status != SS$_NORMAL) return 0; 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 0;#endif return 1; }static int noecho_console(UI *ui) {#ifdef TTY_FLAGS memcpy(&(tty_new),&(tty_orig),sizeof(tty_orig)); tty_new.TTY_FLAGS &= ~ECHO;#endif#if defined(TTY_set) && !defined(OPENSSL_SYS_VMS) if (is_a_tty && (TTY_set(fileno(tty_in),&tty_new) == -1)) return 0;#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 0;#endif return 1; }static int echo_console(UI *ui) {#if defined(TTY_set) && !defined(OPENSSL_SYS_VMS) memcpy(&(tty_new),&(tty_orig),sizeof(tty_orig)); tty_new.TTY_FLAGS |= ECHO;#endif#if defined(TTY_set) && !defined(OPENSSL_SYS_VMS) if (is_a_tty && (TTY_set(fileno(tty_in),&tty_new) == -1)) return 0;#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 0;#endif return 1; }static int close_console(UI *ui) { if (tty_in != stdin) fclose(tty_in); if (tty_out != stderr) fclose(tty_out);#ifdef OPENSSL_SYS_VMS status = sys$dassgn(channel);#endif CRYPTO_w_unlock(CRYPTO_LOCK_UI); return 1; }#if !defined(OPENSSL_SYS_WIN16) && !defined(OPENSSL_SYS_WINCE)/* Internal functions to handle signals and act on them */static void pushsig(void) {#ifndef OPENSSL_SYS_WIN32 int i;#endif#ifdef SIGACTION struct sigaction sa; memset(&sa,0,sizeof sa); sa.sa_handler=recsig;#endif#ifdef OPENSSL_SYS_WIN32 savsig[SIGABRT]=signal(SIGABRT,recsig); savsig[SIGFPE]=signal(SIGFPE,recsig); savsig[SIGILL]=signal(SIGILL,recsig); savsig[SIGINT]=signal(SIGINT,recsig); savsig[SIGSEGV]=signal(SIGSEGV,recsig); savsig[SIGTERM]=signal(SIGTERM,recsig);#else for (i=1; i<NX509_SIG; i++) {#ifdef SIGUSR1 if (i == SIGUSR1) continue;#endif#ifdef SIGUSR2 if (i == SIGUSR2) continue;#endif#ifdef SIGKILL if (i == SIGKILL) /* We can't make any action on that. */ continue;#endif#ifdef SIGACTION sigaction(i,&sa,&savsig[i]);#else savsig[i]=signal(i,recsig);#endif }#endif#ifdef SIGWINCH signal(SIGWINCH,SIG_DFL);#endif }static void popsig(void) {#ifdef OPENSSL_SYS_WIN32 signal(SIGABRT,savsig[SIGABRT]); signal(SIGFPE,savsig[SIGFPE]); signal(SIGILL,savsig[SIGILL]); signal(SIGINT,savsig[SIGINT]); signal(SIGSEGV,savsig[SIGSEGV]); signal(SIGTERM,savsig[SIGTERM]);#else 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 }#endif }static void recsig(int i) { intr_signal=i; }#endif/* Internal functions specific for Windows */#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; char *p; p=buf; for (;;) { if (size == 0) { *p='\0'; break; } size--;#ifdef WIN16TTY i=_inchar();#elif defined(_WIN32) i=_getch();#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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -