Branch data Line data Source code
1 : : /* crypto/ui/ui_openssl.c -*- mode:C; c-file-style: "eay" -*- */
2 : : /* Written by Richard Levitte (richard@levitte.org) and others
3 : : * for the OpenSSL project 2001.
4 : : */
5 : : /* ====================================================================
6 : : * Copyright (c) 2001 The OpenSSL Project. All rights reserved.
7 : : *
8 : : * Redistribution and use in source and binary forms, with or without
9 : : * modification, are permitted provided that the following conditions
10 : : * are met:
11 : : *
12 : : * 1. Redistributions of source code must retain the above copyright
13 : : * notice, this list of conditions and the following disclaimer.
14 : : *
15 : : * 2. Redistributions in binary form must reproduce the above copyright
16 : : * notice, this list of conditions and the following disclaimer in
17 : : * the documentation and/or other materials provided with the
18 : : * distribution.
19 : : *
20 : : * 3. All advertising materials mentioning features or use of this
21 : : * software must display the following acknowledgment:
22 : : * "This product includes software developed by the OpenSSL Project
23 : : * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
24 : : *
25 : : * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26 : : * endorse or promote products derived from this software without
27 : : * prior written permission. For written permission, please contact
28 : : * openssl-core@openssl.org.
29 : : *
30 : : * 5. Products derived from this software may not be called "OpenSSL"
31 : : * nor may "OpenSSL" appear in their names without prior written
32 : : * permission of the OpenSSL Project.
33 : : *
34 : : * 6. Redistributions of any form whatsoever must retain the following
35 : : * acknowledgment:
36 : : * "This product includes software developed by the OpenSSL Project
37 : : * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
38 : : *
39 : : * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40 : : * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41 : : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42 : : * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
43 : : * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44 : : * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45 : : * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46 : : * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47 : : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48 : : * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49 : : * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50 : : * OF THE POSSIBILITY OF SUCH DAMAGE.
51 : : * ====================================================================
52 : : *
53 : : * This product includes cryptographic software written by Eric Young
54 : : * (eay@cryptsoft.com). This product includes software written by Tim
55 : : * Hudson (tjh@cryptsoft.com).
56 : : *
57 : : */
58 : :
59 : : /* The lowest level part of this file was previously in crypto/des/read_pwd.c,
60 : : * Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
61 : : * All rights reserved.
62 : : *
63 : : * This package is an SSL implementation written
64 : : * by Eric Young (eay@cryptsoft.com).
65 : : * The implementation was written so as to conform with Netscapes SSL.
66 : : *
67 : : * This library is free for commercial and non-commercial use as long as
68 : : * the following conditions are aheared to. The following conditions
69 : : * apply to all code found in this distribution, be it the RC4, RSA,
70 : : * lhash, DES, etc., code; not just the SSL code. The SSL documentation
71 : : * included with this distribution is covered by the same copyright terms
72 : : * except that the holder is Tim Hudson (tjh@cryptsoft.com).
73 : : *
74 : : * Copyright remains Eric Young's, and as such any Copyright notices in
75 : : * the code are not to be removed.
76 : : * If this package is used in a product, Eric Young should be given attribution
77 : : * as the author of the parts of the library used.
78 : : * This can be in the form of a textual message at program startup or
79 : : * in documentation (online or textual) provided with the package.
80 : : *
81 : : * Redistribution and use in source and binary forms, with or without
82 : : * modification, are permitted provided that the following conditions
83 : : * are met:
84 : : * 1. Redistributions of source code must retain the copyright
85 : : * notice, this list of conditions and the following disclaimer.
86 : : * 2. Redistributions in binary form must reproduce the above copyright
87 : : * notice, this list of conditions and the following disclaimer in the
88 : : * documentation and/or other materials provided with the distribution.
89 : : * 3. All advertising materials mentioning features or use of this software
90 : : * must display the following acknowledgement:
91 : : * "This product includes cryptographic software written by
92 : : * Eric Young (eay@cryptsoft.com)"
93 : : * The word 'cryptographic' can be left out if the rouines from the library
94 : : * being used are not cryptographic related :-).
95 : : * 4. If you include any Windows specific code (or a derivative thereof) from
96 : : * the apps directory (application code) you must include an acknowledgement:
97 : : * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
98 : : *
99 : : * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
100 : : * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
101 : : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
102 : : * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
103 : : * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
104 : : * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
105 : : * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
106 : : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
107 : : * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
108 : : * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
109 : : * SUCH DAMAGE.
110 : : *
111 : : * The licence and distribution terms for any publically available version or
112 : : * derivative of this code cannot be changed. i.e. this code cannot simply be
113 : : * copied and put under another distribution licence
114 : : * [including the GNU Public Licence.]
115 : : */
116 : :
117 : :
118 : : #include <openssl/e_os2.h>
119 : :
120 : : /* need for #define _POSIX_C_SOURCE arises whenever you pass -ansi to gcc
121 : : * [maybe others?], because it masks interfaces not discussed in standard,
122 : : * sigaction and fileno included. -pedantic would be more appropriate for
123 : : * the intended purposes, but we can't prevent users from adding -ansi.
124 : : */
125 : : #if defined(OPENSSL_SYSNAME_VXWORKS)
126 : : #include <sys/types.h>
127 : : #endif
128 : :
129 : : #if !defined(_POSIX_C_SOURCE) && defined(OPENSSL_SYS_VMS)
130 : : #ifndef _POSIX_C_SOURCE
131 : : #define _POSIX_C_SOURCE 2
132 : : #endif
133 : : #endif
134 : : #include <signal.h>
135 : : #include <stdio.h>
136 : : #include <string.h>
137 : : #include <errno.h>
138 : :
139 : : #if !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VMS)
140 : : # ifdef OPENSSL_UNISTD
141 : : # include OPENSSL_UNISTD
142 : : # else
143 : : # include <unistd.h>
144 : : # endif
145 : : /* If unistd.h defines _POSIX_VERSION, we conclude that we
146 : : * are on a POSIX system and have sigaction and termios. */
147 : : # if defined(_POSIX_VERSION)
148 : :
149 : : # define SIGACTION
150 : : # if !defined(TERMIOS) && !defined(TERMIO) && !defined(SGTTY)
151 : : # define TERMIOS
152 : : # endif
153 : :
154 : : # endif
155 : : #endif
156 : :
157 : : #ifdef WIN16TTY
158 : : # undef OPENSSL_SYS_WIN16
159 : : # undef WIN16
160 : : # undef _WINDOWS
161 : : # include <graph.h>
162 : : #endif
163 : :
164 : : /* 06-Apr-92 Luke Brennan Support for VMS */
165 : : #include "ui_locl.h"
166 : : #include "cryptlib.h"
167 : :
168 : : #ifdef OPENSSL_SYS_VMS /* prototypes for sys$whatever */
169 : : # include <starlet.h>
170 : : # ifdef __DECC
171 : : # pragma message disable DOLLARID
172 : : # endif
173 : : #endif
174 : :
175 : : #ifdef WIN_CONSOLE_BUG
176 : : # include <windows.h>
177 : : #ifndef OPENSSL_SYS_WINCE
178 : : # include <wincon.h>
179 : : #endif
180 : : #endif
181 : :
182 : :
183 : : /* There are 5 types of terminal interface supported,
184 : : * TERMIO, TERMIOS, VMS, MSDOS and SGTTY
185 : : */
186 : :
187 : : #if defined(__sgi) && !defined(TERMIOS)
188 : : # define TERMIOS
189 : : # undef TERMIO
190 : : # undef SGTTY
191 : : #endif
192 : :
193 : : #if defined(linux) && !defined(TERMIO)
194 : : # undef TERMIOS
195 : : # define TERMIO
196 : : # undef SGTTY
197 : : #endif
198 : :
199 : : #ifdef _LIBC
200 : : # undef TERMIOS
201 : : # define TERMIO
202 : : # undef SGTTY
203 : : #endif
204 : :
205 : : #if !defined(TERMIO) && !defined(TERMIOS) && !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && !defined(MAC_OS_GUSI_SOURCE)
206 : : # undef TERMIOS
207 : : # undef TERMIO
208 : : # define SGTTY
209 : : #endif
210 : :
211 : : #if defined(OPENSSL_SYS_VXWORKS)
212 : : #undef TERMIOS
213 : : #undef TERMIO
214 : : #undef SGTTY
215 : : #endif
216 : :
217 : : #if defined(OPENSSL_SYS_NETWARE)
218 : : #undef TERMIOS
219 : : #undef TERMIO
220 : : #undef SGTTY
221 : : #endif
222 : :
223 : : #ifdef TERMIOS
224 : : # include <termios.h>
225 : : # define TTY_STRUCT struct termios
226 : : # define TTY_FLAGS c_lflag
227 : : # define TTY_get(tty,data) tcgetattr(tty,data)
228 : : # define TTY_set(tty,data) tcsetattr(tty,TCSANOW,data)
229 : : #endif
230 : :
231 : : #ifdef TERMIO
232 : : # include <termio.h>
233 : : # define TTY_STRUCT struct termio
234 : : # define TTY_FLAGS c_lflag
235 : : # define TTY_get(tty,data) ioctl(tty,TCGETA,data)
236 : : # define TTY_set(tty,data) ioctl(tty,TCSETA,data)
237 : : #endif
238 : :
239 : : #ifdef SGTTY
240 : : # include <sgtty.h>
241 : : # define TTY_STRUCT struct sgttyb
242 : : # define TTY_FLAGS sg_flags
243 : : # define TTY_get(tty,data) ioctl(tty,TIOCGETP,data)
244 : : # define TTY_set(tty,data) ioctl(tty,TIOCSETP,data)
245 : : #endif
246 : :
247 : : #if !defined(_LIBC) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && !defined(OPENSSL_SYS_SUNOS)
248 : : # include <sys/ioctl.h>
249 : : #endif
250 : :
251 : : #ifdef OPENSSL_SYS_MSDOS
252 : : # include <conio.h>
253 : : #endif
254 : :
255 : : #ifdef OPENSSL_SYS_VMS
256 : : # include <ssdef.h>
257 : : # include <iodef.h>
258 : : # include <ttdef.h>
259 : : # include <descrip.h>
260 : : struct IOSB {
261 : : short iosb$w_value;
262 : : short iosb$w_count;
263 : : long iosb$l_info;
264 : : };
265 : : #endif
266 : :
267 : : #ifdef OPENSSL_SYS_SUNOS
268 : : typedef int sig_atomic_t;
269 : : #endif
270 : :
271 : : #if defined(OPENSSL_SYS_MACINTOSH_CLASSIC) || defined(MAC_OS_GUSI_SOURCE) || defined(OPENSSL_SYS_NETWARE)
272 : : /*
273 : : * This one needs work. As a matter of fact the code is unoperational
274 : : * and this is only a trick to get it compiled.
275 : : * <appro@fy.chalmers.se>
276 : : */
277 : : # define TTY_STRUCT int
278 : : #endif
279 : :
280 : : #ifndef NX509_SIG
281 : : # define NX509_SIG 32
282 : : #endif
283 : :
284 : :
285 : : /* Define globals. They are protected by a lock */
286 : : #ifdef SIGACTION
287 : : static struct sigaction savsig[NX509_SIG];
288 : : #else
289 : : static void (*savsig[NX509_SIG])(int );
290 : : #endif
291 : :
292 : : #ifdef OPENSSL_SYS_VMS
293 : : static struct IOSB iosb;
294 : : static $DESCRIPTOR(terminal,"TT");
295 : : static long tty_orig[3], tty_new[3]; /* XXX Is there any guarantee that this will always suffice for the actual structures? */
296 : : static long status;
297 : : static unsigned short channel = 0;
298 : : #else
299 : : #if !defined(OPENSSL_SYS_MSDOS) || defined(__DJGPP__)
300 : : static TTY_STRUCT tty_orig,tty_new;
301 : : #endif
302 : : #endif
303 : : static FILE *tty_in, *tty_out;
304 : : static int is_a_tty;
305 : :
306 : : /* Declare static functions */
307 : : #if !defined(OPENSSL_SYS_WIN16) && !defined(OPENSSL_SYS_WINCE)
308 : : static int read_till_nl(FILE *);
309 : : static void recsig(int);
310 : : static void pushsig(void);
311 : : static void popsig(void);
312 : : #endif
313 : : #if defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_WIN16)
314 : : static int noecho_fgets(char *buf, int size, FILE *tty);
315 : : #endif
316 : : static int read_string_inner(UI *ui, UI_STRING *uis, int echo, int strip_nl);
317 : :
318 : : static int read_string(UI *ui, UI_STRING *uis);
319 : : static int write_string(UI *ui, UI_STRING *uis);
320 : :
321 : : static int open_console(UI *ui);
322 : : static int echo_console(UI *ui);
323 : : static int noecho_console(UI *ui);
324 : : static int close_console(UI *ui);
325 : :
326 : : static UI_METHOD ui_openssl =
327 : : {
328 : : "OpenSSL default user interface",
329 : : open_console,
330 : : write_string,
331 : : NULL, /* No flusher is needed for command lines */
332 : : read_string,
333 : : close_console,
334 : : NULL
335 : : };
336 : :
337 : : /* The method with all the built-in thingies */
338 : 0 : UI_METHOD *UI_OpenSSL(void)
339 : : {
340 : 0 : return &ui_openssl;
341 : : }
342 : :
343 : : /* The following function makes sure that info and error strings are printed
344 : : before any prompt. */
345 : 0 : static int write_string(UI *ui, UI_STRING *uis)
346 : : {
347 [ # # ]: 0 : switch (UI_get_string_type(uis))
348 : : {
349 : : case UIT_ERROR:
350 : : case UIT_INFO:
351 : 0 : fputs(UI_get0_output_string(uis), tty_out);
352 : 0 : fflush(tty_out);
353 : 0 : break;
354 : : default:
355 : : break;
356 : : }
357 : 0 : return 1;
358 : : }
359 : :
360 : 0 : static int read_string(UI *ui, UI_STRING *uis)
361 : : {
362 : 0 : int ok = 0;
363 : :
364 [ # # # # ]: 0 : switch (UI_get_string_type(uis))
365 : : {
366 : : case UIT_BOOLEAN:
367 : 0 : fputs(UI_get0_output_string(uis), tty_out);
368 : 0 : fputs(UI_get0_action_string(uis), tty_out);
369 : 0 : fflush(tty_out);
370 : 0 : return read_string_inner(ui, uis,
371 : 0 : UI_get_input_flags(uis) & UI_INPUT_FLAG_ECHO, 0);
372 : : case UIT_PROMPT:
373 : 0 : fputs(UI_get0_output_string(uis), tty_out);
374 : 0 : fflush(tty_out);
375 : 0 : return read_string_inner(ui, uis,
376 : 0 : UI_get_input_flags(uis) & UI_INPUT_FLAG_ECHO, 1);
377 : : case UIT_VERIFY:
378 : 0 : fprintf(tty_out,"Verifying - %s",
379 : : UI_get0_output_string(uis));
380 : 0 : fflush(tty_out);
381 [ # # ]: 0 : if ((ok = read_string_inner(ui, uis,
382 : 0 : UI_get_input_flags(uis) & UI_INPUT_FLAG_ECHO, 1)) <= 0)
383 : : return ok;
384 [ # # ]: 0 : if (strcmp(UI_get0_result_string(uis),
385 : : UI_get0_test_string(uis)) != 0)
386 : : {
387 : 0 : fprintf(tty_out,"Verify failure\n");
388 : 0 : fflush(tty_out);
389 : 0 : return 0;
390 : : }
391 : : break;
392 : : default:
393 : : break;
394 : : }
395 : : return 1;
396 : : }
397 : :
398 : :
399 : : #if !defined(OPENSSL_SYS_WIN16) && !defined(OPENSSL_SYS_WINCE)
400 : : /* Internal functions to read a string without echoing */
401 : 0 : static int read_till_nl(FILE *in)
402 : : {
403 : : #define SIZE 4
404 : : char buf[SIZE+1];
405 : :
406 : : do {
407 [ # # ]: 0 : if (!fgets(buf,SIZE,in))
408 : : return 0;
409 [ # # ]: 0 : } while (strchr(buf,'\n') == NULL);
410 : : return 1;
411 : : }
412 : :
413 : : static volatile sig_atomic_t intr_signal;
414 : : #endif
415 : :
416 : 0 : static int read_string_inner(UI *ui, UI_STRING *uis, int echo, int strip_nl)
417 : : {
418 : : static int ps;
419 : : int ok;
420 : : char result[BUFSIZ];
421 : 0 : int maxsize = BUFSIZ-1;
422 : : #if !defined(OPENSSL_SYS_WIN16) && !defined(OPENSSL_SYS_WINCE)
423 : : char *p;
424 : :
425 : 0 : intr_signal=0;
426 : 0 : ok=0;
427 : 0 : ps=0;
428 : :
429 : 0 : pushsig();
430 : 0 : ps=1;
431 : :
432 [ # # ][ # # ]: 0 : if (!echo && !noecho_console(ui))
433 : : goto error;
434 : 0 : ps=2;
435 : :
436 : 0 : result[0]='\0';
437 : : #ifdef OPENSSL_SYS_MSDOS
438 : : if (!echo)
439 : : {
440 : : noecho_fgets(result,maxsize,tty_in);
441 : : p=result; /* FIXME: noecho_fgets doesn't return errors */
442 : : }
443 : : else
444 : : p=fgets(result,maxsize,tty_in);
445 : : #else
446 : 0 : p=fgets(result,maxsize,tty_in);
447 : : #endif
448 [ # # ]: 0 : if(!p)
449 : : goto error;
450 [ # # ]: 0 : if (feof(tty_in)) goto error;
451 [ # # ]: 0 : if (ferror(tty_in)) goto error;
452 [ # # ]: 0 : if ((p=(char *)strchr(result,'\n')) != NULL)
453 : : {
454 [ # # ]: 0 : if (strip_nl)
455 : 0 : *p='\0';
456 : : }
457 : : else
458 [ # # ]: 0 : if (!read_till_nl(tty_in))
459 : : goto error;
460 [ # # ]: 0 : if (UI_set_result(ui, uis, result) >= 0)
461 : 0 : ok=1;
462 : :
463 : : error:
464 [ # # ]: 0 : if (intr_signal == SIGINT)
465 : 0 : ok=-1;
466 [ # # ]: 0 : if (!echo) fprintf(tty_out,"\n");
467 [ # # ][ # # ]: 0 : if (ps >= 2 && !echo && !echo_console(ui))
[ # # ]
468 : 0 : ok=0;
469 : :
470 [ # # ]: 0 : if (ps >= 1)
471 : 0 : popsig();
472 : : #else
473 : : ok=1;
474 : : #endif
475 : :
476 : 0 : OPENSSL_cleanse(result,BUFSIZ);
477 : 0 : return ok;
478 : : }
479 : :
480 : :
481 : : /* Internal functions to open, handle and close a channel to the console. */
482 : 0 : static int open_console(UI *ui)
483 : : {
484 : 0 : CRYPTO_w_lock(CRYPTO_LOCK_UI);
485 : 0 : is_a_tty = 1;
486 : :
487 : : #if defined(OPENSSL_SYS_MACINTOSH_CLASSIC) || defined(OPENSSL_SYS_VXWORKS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS)
488 : : tty_in=stdin;
489 : : tty_out=stderr;
490 : : #else
491 : : # ifdef OPENSSL_SYS_MSDOS
492 : : # define DEV_TTY "con"
493 : : # else
494 : : # define DEV_TTY "/dev/tty"
495 : : # endif
496 [ # # ]: 0 : if ((tty_in=fopen(DEV_TTY,"r")) == NULL)
497 : 0 : tty_in=stdin;
498 [ # # ]: 0 : if ((tty_out=fopen(DEV_TTY,"w")) == NULL)
499 : 0 : tty_out=stderr;
500 : : #endif
501 : :
502 : : #if defined(TTY_get) && !defined(OPENSSL_SYS_VMS)
503 [ # # ]: 0 : if (TTY_get(fileno(tty_in),&tty_orig) == -1)
504 : : {
505 : : #ifdef ENOTTY
506 [ # # ]: 0 : if (errno == ENOTTY)
507 : 0 : is_a_tty=0;
508 : : else
509 : : #endif
510 : : #ifdef EINVAL
511 : : /* Ariel Glenn ariel@columbia.edu reports that solaris
512 : : * can return EINVAL instead. This should be ok */
513 [ # # ]: 0 : if (errno == EINVAL)
514 : 0 : is_a_tty=0;
515 : : else
516 : : #endif
517 : : return 0;
518 : : }
519 : : #endif
520 : : #ifdef OPENSSL_SYS_VMS
521 : : status = sys$assign(&terminal,&channel,0,0);
522 : : if (status != SS$_NORMAL)
523 : : return 0;
524 : : status=sys$qiow(0,channel,IO$_SENSEMODE,&iosb,0,0,tty_orig,12,0,0,0,0);
525 : : if ((status != SS$_NORMAL) || (iosb.iosb$w_value != SS$_NORMAL))
526 : : return 0;
527 : : #endif
528 : : return 1;
529 : : }
530 : :
531 : 0 : static int noecho_console(UI *ui)
532 : : {
533 : : #ifdef TTY_FLAGS
534 : : memcpy(&(tty_new),&(tty_orig),sizeof(tty_orig));
535 : 0 : tty_new.TTY_FLAGS &= ~ECHO;
536 : : #endif
537 : :
538 : : #if defined(TTY_set) && !defined(OPENSSL_SYS_VMS)
539 [ # # ][ # # ]: 0 : if (is_a_tty && (TTY_set(fileno(tty_in),&tty_new) == -1))
540 : : return 0;
541 : : #endif
542 : : #ifdef OPENSSL_SYS_VMS
543 : : tty_new[0] = tty_orig[0];
544 : : tty_new[1] = tty_orig[1] | TT$M_NOECHO;
545 : : tty_new[2] = tty_orig[2];
546 : : status = sys$qiow(0,channel,IO$_SETMODE,&iosb,0,0,tty_new,12,0,0,0,0);
547 : : if ((status != SS$_NORMAL) || (iosb.iosb$w_value != SS$_NORMAL))
548 : : return 0;
549 : : #endif
550 : : return 1;
551 : : }
552 : :
553 : 0 : static int echo_console(UI *ui)
554 : : {
555 : : #if defined(TTY_set) && !defined(OPENSSL_SYS_VMS)
556 : : memcpy(&(tty_new),&(tty_orig),sizeof(tty_orig));
557 : 0 : tty_new.TTY_FLAGS |= ECHO;
558 : : #endif
559 : :
560 : : #if defined(TTY_set) && !defined(OPENSSL_SYS_VMS)
561 [ # # ][ # # ]: 0 : if (is_a_tty && (TTY_set(fileno(tty_in),&tty_new) == -1))
562 : : return 0;
563 : : #endif
564 : : #ifdef OPENSSL_SYS_VMS
565 : : tty_new[0] = tty_orig[0];
566 : : tty_new[1] = tty_orig[1] & ~TT$M_NOECHO;
567 : : tty_new[2] = tty_orig[2];
568 : : status = sys$qiow(0,channel,IO$_SETMODE,&iosb,0,0,tty_new,12,0,0,0,0);
569 : : if ((status != SS$_NORMAL) || (iosb.iosb$w_value != SS$_NORMAL))
570 : : return 0;
571 : : #endif
572 : : return 1;
573 : : }
574 : :
575 : 0 : static int close_console(UI *ui)
576 : : {
577 [ # # ]: 0 : if (tty_in != stdin) fclose(tty_in);
578 [ # # ]: 0 : if (tty_out != stderr) fclose(tty_out);
579 : : #ifdef OPENSSL_SYS_VMS
580 : : status = sys$dassgn(channel);
581 : : #endif
582 : 0 : CRYPTO_w_unlock(CRYPTO_LOCK_UI);
583 : :
584 : 0 : return 1;
585 : : }
586 : :
587 : :
588 : : #if !defined(OPENSSL_SYS_WIN16) && !defined(OPENSSL_SYS_WINCE)
589 : : /* Internal functions to handle signals and act on them */
590 : 0 : static void pushsig(void)
591 : : {
592 : : #ifndef OPENSSL_SYS_WIN32
593 : : int i;
594 : : #endif
595 : : #ifdef SIGACTION
596 : : struct sigaction sa;
597 : :
598 : : memset(&sa,0,sizeof sa);
599 : 0 : sa.sa_handler=recsig;
600 : : #endif
601 : :
602 : : #ifdef OPENSSL_SYS_WIN32
603 : : savsig[SIGABRT]=signal(SIGABRT,recsig);
604 : : savsig[SIGFPE]=signal(SIGFPE,recsig);
605 : : savsig[SIGILL]=signal(SIGILL,recsig);
606 : : savsig[SIGINT]=signal(SIGINT,recsig);
607 : : savsig[SIGSEGV]=signal(SIGSEGV,recsig);
608 : : savsig[SIGTERM]=signal(SIGTERM,recsig);
609 : : #else
610 [ # # ]: 0 : for (i=1; i<NX509_SIG; i++)
611 : : {
612 : : #ifdef SIGUSR1
613 [ # # ]: 0 : if (i == SIGUSR1)
614 : 0 : continue;
615 : : #endif
616 : : #ifdef SIGUSR2
617 [ # # ]: 0 : if (i == SIGUSR2)
618 : 0 : continue;
619 : : #endif
620 : : #ifdef SIGKILL
621 [ # # ]: 0 : if (i == SIGKILL) /* We can't make any action on that. */
622 : 0 : continue;
623 : : #endif
624 : : #ifdef SIGACTION
625 : 0 : sigaction(i,&sa,&savsig[i]);
626 : : #else
627 : : savsig[i]=signal(i,recsig);
628 : : #endif
629 : : }
630 : : #endif
631 : :
632 : : #ifdef SIGWINCH
633 : 0 : signal(SIGWINCH,SIG_DFL);
634 : : #endif
635 : 0 : }
636 : :
637 : 0 : static void popsig(void)
638 : : {
639 : : #ifdef OPENSSL_SYS_WIN32
640 : : signal(SIGABRT,savsig[SIGABRT]);
641 : : signal(SIGFPE,savsig[SIGFPE]);
642 : : signal(SIGILL,savsig[SIGILL]);
643 : : signal(SIGINT,savsig[SIGINT]);
644 : : signal(SIGSEGV,savsig[SIGSEGV]);
645 : : signal(SIGTERM,savsig[SIGTERM]);
646 : : #else
647 : : int i;
648 [ # # ]: 0 : for (i=1; i<NX509_SIG; i++)
649 : : {
650 : : #ifdef SIGUSR1
651 [ # # ]: 0 : if (i == SIGUSR1)
652 : 0 : continue;
653 : : #endif
654 : : #ifdef SIGUSR2
655 [ # # ]: 0 : if (i == SIGUSR2)
656 : 0 : continue;
657 : : #endif
658 : : #ifdef SIGACTION
659 : 0 : sigaction(i,&savsig[i],NULL);
660 : : #else
661 : : signal(i,savsig[i]);
662 : : #endif
663 : : }
664 : : #endif
665 : 0 : }
666 : :
667 : 0 : static void recsig(int i)
668 : : {
669 : 0 : intr_signal=i;
670 : 0 : }
671 : : #endif
672 : :
673 : : /* Internal functions specific for Windows */
674 : : #if defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_WIN16) && !defined(OPENSSL_SYS_WINCE)
675 : : static int noecho_fgets(char *buf, int size, FILE *tty)
676 : : {
677 : : int i;
678 : : char *p;
679 : :
680 : : p=buf;
681 : : for (;;)
682 : : {
683 : : if (size == 0)
684 : : {
685 : : *p='\0';
686 : : break;
687 : : }
688 : : size--;
689 : : #ifdef WIN16TTY
690 : : i=_inchar();
691 : : #elif defined(_WIN32)
692 : : i=_getch();
693 : : #else
694 : : i=getch();
695 : : #endif
696 : : if (i == '\r') i='\n';
697 : : *(p++)=i;
698 : : if (i == '\n')
699 : : {
700 : : *p='\0';
701 : : break;
702 : : }
703 : : }
704 : : #ifdef WIN_CONSOLE_BUG
705 : : /* Win95 has several evil console bugs: one of these is that the
706 : : * last character read using getch() is passed to the next read: this is
707 : : * usually a CR so this can be trouble. No STDIO fix seems to work but
708 : : * flushing the console appears to do the trick.
709 : : */
710 : : {
711 : : HANDLE inh;
712 : : inh = GetStdHandle(STD_INPUT_HANDLE);
713 : : FlushConsoleInputBuffer(inh);
714 : : }
715 : : #endif
716 : : return(strlen(buf));
717 : : }
718 : : #endif
|