1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* crypto/des/read_pwd.c */
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * All rights reserved.
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This package is an SSL implementation written
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * by Eric Young (eay@cryptsoft.com).
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The implementation was written so as to conform with Netscapes SSL.
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This library is free for commercial and non-commercial use as long as
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the following conditions are aheared to.  The following conditions
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * apply to all code found in this distribution, be it the RC4, RSA,
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * included with this distribution is covered by the same copyright terms
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright remains Eric Young's, and as such any Copyright notices in
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the code are not to be removed.
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If this package is used in a product, Eric Young should be given attribution
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * as the author of the parts of the library used.
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This can be in the form of a textual message at program startup or
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * in documentation (online or textual) provided with the package.
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met:
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the copyright
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer.
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    documentation and/or other materials provided with the distribution.
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this software
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    must display the following acknowledgement:
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes cryptographic software written by
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *     Eric Young (eay@cryptsoft.com)"
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    The word 'cryptographic' can be left out if the rouines from the library
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    being used are not cryptographic related :-).
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. If you include any Windows specific code (or a derivative thereof) from
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    the apps directory (application code) you must include an acknowledgement:
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SUCH DAMAGE.
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The licence and distribution terms for any publically available version or
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * derivative of this code cannot be changed.  i.e. this code cannot simply be
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * copied and put under another distribution licence
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * [including the GNU Public Licence.]
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/e_os2.h>
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_WIN32)
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_UNISTD
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# include OPENSSL_UNISTD
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# include <unistd.h>
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* If unistd.h defines _POSIX_VERSION, we conclude that we
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are on a POSIX system and have sigaction and termios. */
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(_POSIX_VERSION)
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# define SIGACTION
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# if !defined(TERMIOS) && !defined(TERMIO) && !defined(SGTTY)
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# define TERMIOS
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# endif
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* #define SIGACTION */ /* Define this if you have sigaction() */
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef WIN16TTY
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef OPENSSL_SYS_WIN16
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef _WINDOWS
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <graph.h>
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* 06-Apr-92 Luke Brennan    Support for VMS */
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "des_locl.h"
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "cryptlib.h"
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <signal.h>
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h>
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <string.h>
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <setjmp.h>
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <errno.h>
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_VMS			/* prototypes for sys$whatever */
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <starlet.h>
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef __DECC
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#pragma message disable DOLLARID
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef WIN_CONSOLE_BUG
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <windows.h>
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_SYS_WINCE
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <wincon.h>
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* There are 5 types of terminal interface supported,
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * TERMIO, TERMIOS, VMS, MSDOS and SGTTY
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(__sgi) && !defined(TERMIOS)
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define TERMIOS
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef  TERMIO
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef  SGTTY
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(linux) && !defined(TERMIO)
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef  TERMIOS
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define TERMIO
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef  SGTTY
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef _LIBC
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef  TERMIOS
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define TERMIO
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef  SGTTY
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if !defined(TERMIO) && !defined(TERMIOS) && !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_MSDOS) && !defined(MAC_OS_pre_X) && !defined(MAC_OS_GUSI_SOURCE)
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef  TERMIOS
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef  TERMIO
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SGTTY
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_VXWORKS)
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef TERMIOS
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef TERMIO
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef SGTTY
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef TERMIOS
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <termios.h>
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define TTY_STRUCT		struct termios
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define TTY_FLAGS		c_lflag
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define	TTY_get(tty,data)	tcgetattr(tty,data)
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define TTY_set(tty,data)	tcsetattr(tty,TCSANOW,data)
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef TERMIO
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <termio.h>
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define TTY_STRUCT		struct termio
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define TTY_FLAGS		c_lflag
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define TTY_get(tty,data)	ioctl(tty,TCGETA,data)
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define TTY_set(tty,data)	ioctl(tty,TCSETA,data)
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef SGTTY
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <sgtty.h>
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define TTY_STRUCT		struct sgttyb
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define TTY_FLAGS		sg_flags
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define TTY_get(tty,data)	ioctl(tty,TIOCGETP,data)
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define TTY_set(tty,data)	ioctl(tty,TIOCSETP,data)
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if !defined(_LIBC) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VMS) && !defined(MAC_OS_pre_X)
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <sys/ioctl.h>
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_MSDOS) && !defined(__CYGWIN32__) && !defined(OPENSSL_SYS_WINCE)
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <conio.h>
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define fgets(a,b,c) noecho_fgets(a,b,c)
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_VMS
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <ssdef.h>
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <iodef.h>
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <ttdef.h>
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <descrip.h>
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstruct IOSB {
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	short iosb$w_value;
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	short iosb$w_count;
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	long  iosb$l_info;
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	};
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(MAC_OS_pre_X) || defined(MAC_OS_GUSI_SOURCE)
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This one needs work. As a matter of fact the code is unoperational
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * and this is only a trick to get it compiled.
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *					<appro@fy.chalmers.se>
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define TTY_STRUCT int
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef NX509_SIG
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define NX509_SIG 32
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void read_till_nl(FILE *);
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void recsig(int);
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void pushsig(void);
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void popsig(void);
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_WIN16)
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int noecho_fgets(char *buf, int size, FILE *tty);
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef SIGACTION
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project static struct sigaction savsig[NX509_SIG];
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  static void (*savsig[NX509_SIG])(int );
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic jmp_buf save;
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint des_read_pw_string(char *buf, int length, const char *prompt,
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	     int verify)
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char buff[BUFSIZ];
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret;
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret=des_read_pw(buf,buff,(length>BUFSIZ)?BUFSIZ:length,prompt,verify);
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_cleanse(buff,BUFSIZ);
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ret);
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_WINCE
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint des_read_pw(char *buf, char *buff, int size, const char *prompt, int verify)
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memset(buf,0,size);
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memset(buff,0,size);
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(0);
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#elif defined(OPENSSL_SYS_WIN16)
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint des_read_pw(char *buf, char *buff, int size, char *prompt, int verify)
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memset(buf,0,size);
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memset(buff,0,size);
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(0);
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else /* !OPENSSL_SYS_WINCE && !OPENSSL_SYS_WIN16 */
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void read_till_nl(FILE *in)
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SIZE 4
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char buf[SIZE+1];
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	do	{
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		fgets(buf,SIZE,in);
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		} while (strchr(buf,'\n') == NULL);
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* return 0 if ok, 1 (or -1) otherwise */
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint des_read_pw(char *buf, char *buff, int size, const char *prompt,
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	     int verify)
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_VMS
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct IOSB iosb;
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$DESCRIPTOR(terminal,"TT");
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	long tty_orig[3], tty_new[3];
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	long status;
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned short channel = 0;
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if !defined(OPENSSL_SYS_MSDOS) || defined(__DJGPP__)
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	TTY_STRUCT tty_orig,tty_new;
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int number;
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ok;
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* statics are simply to avoid warnings about longjmp clobbering
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	   things */
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static int ps;
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int is_a_tty;
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static FILE *tty;
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *p;
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (setjmp(save))
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ok=0;
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto error;
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	number=5;
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ok=0;
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ps=0;
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	is_a_tty=1;
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	tty=NULL;
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_MSDOS
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((tty=fopen("con","r")) == NULL)
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		tty=stdin;
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#elif defined(MAC_OS_pre_X) || defined(OPENSSL_SYS_VXWORKS)
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	tty=stdin;
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_SYS_MPE
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((tty=fopen("/dev/tty","r")) == NULL)
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		tty=stdin;
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(TTY_get) && !defined(OPENSSL_SYS_VMS)
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (TTY_get(fileno(tty),&tty_orig) == -1)
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef ENOTTY
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (errno == ENOTTY)
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			is_a_tty=0;
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef EINVAL
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* Ariel Glenn ariel@columbia.edu reports that solaris
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * can return EINVAL instead.  This should be ok */
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (errno == EINVAL)
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			is_a_tty=0;
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(-1);
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memcpy(&(tty_new),&(tty_orig),sizeof(tty_orig));
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_VMS
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	status = sys$assign(&terminal,&channel,0,0);
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (status != SS$_NORMAL)
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(-1);
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	status=sys$qiow(0,channel,IO$_SENSEMODE,&iosb,0,0,tty_orig,12,0,0,0,0);
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((status != SS$_NORMAL) || (iosb.iosb$w_value != SS$_NORMAL))
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(-1);
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pushsig();
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ps=1;
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef TTY_FLAGS
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	tty_new.TTY_FLAGS &= ~ECHO;
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(TTY_set) && !defined(OPENSSL_SYS_VMS)
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (is_a_tty && (TTY_set(fileno(tty),&tty_new) == -1))
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_MPE
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		; /* MPE lies -- echo really has been disabled */
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(-1);
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_VMS
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	tty_new[0] = tty_orig[0];
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	tty_new[1] = tty_orig[1] | TT$M_NOECHO;
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	tty_new[2] = tty_orig[2];
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	status = sys$qiow(0,channel,IO$_SETMODE,&iosb,0,0,tty_new,12,0,0,0,0);
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((status != SS$_NORMAL) || (iosb.iosb$w_value != SS$_NORMAL))
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(-1);
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ps=2;
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	while ((!ok) && (number--))
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		fputs(prompt,stderr);
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		fflush(stderr);
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		buf[0]='\0';
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		fgets(buf,size,tty);
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (feof(tty)) goto error;
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (ferror(tty)) goto error;
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((p=(char *)strchr(buf,'\n')) != NULL)
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			*p='\0';
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else	read_till_nl(tty);
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (verify)
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fprintf(stderr,"\nVerifying password - %s",prompt);
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fflush(stderr);
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			buff[0]='\0';
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fgets(buff,size,tty);
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (feof(tty)) goto error;
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ((p=(char *)strchr(buff,'\n')) != NULL)
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*p='\0';
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else	read_till_nl(tty);
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (strcmp(buf,buff) != 0)
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				fprintf(stderr,"\nVerify failure");
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				fflush(stderr);
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				/* continue; */
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ok=1;
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecterror:
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	fprintf(stderr,"\n");
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0
396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	perror("fgets(tty)");
397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* What can we do if there is an error? */
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(TTY_set) && !defined(OPENSSL_SYS_VMS)
400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ps >= 2) TTY_set(fileno(tty),&tty_orig);
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_VMS
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ps >= 2)
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		status = sys$qiow(0,channel,IO$_SETMODE,&iosb,0,0
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			,tty_orig,12,0,0,0,0);
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ps >= 1) popsig();
409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (stdin != tty) fclose(tty);
410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_VMS
411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	status = sys$dassgn(channel);
412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(!ok);
414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void pushsig(void)
417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef SIGACTION
420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct sigaction sa;
421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memset(&sa,0,sizeof sa);
423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sa.sa_handler=recsig;
424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i=1; i<NX509_SIG; i++)
427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef SIGUSR1
429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (i == SIGUSR1)
430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			continue;
431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef SIGUSR2
433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (i == SIGUSR2)
434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			continue;
435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef SIGACTION
437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sigaction(i,&sa,&savsig[i]);
438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		savsig[i]=signal(i,recsig);
440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef SIGWINCH
444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	signal(SIGWINCH,SIG_DFL);
445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void popsig(void)
449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i=1; i<NX509_SIG; i++)
453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef SIGUSR1
455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (i == SIGUSR1)
456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			continue;
457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef SIGUSR2
459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (i == SIGUSR2)
460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			continue;
461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef SIGACTION
463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sigaction(i,&savsig[i],NULL);
464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		signal(i,savsig[i]);
466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void recsig(int i)
471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	longjmp(save,1);
473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef LINT
474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i=i;
475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_MSDOS
479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int noecho_fgets(char *buf, int size, FILE *tty)
480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *p;
483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p=buf;
485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (;;)
486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (size == 0)
488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			*p='\0';
490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			break;
491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		size--;
493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef WIN16TTY
494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		i=_inchar();
495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		i=getch();
497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (i == '\r') i='\n';
499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*(p++)=i;
500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (i == '\n')
501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			*p='\0';
503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			break;
504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef WIN_CONSOLE_BUG
507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Win95 has several evil console bugs: one of these is that the
508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * last character read using getch() is passed to the next read: this is
509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * usually a CR so this can be trouble. No STDIO fix seems to work but
510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * flushing the console appears to do the trick.
511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			HANDLE inh;
514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			inh = GetStdHandle(STD_INPUT_HANDLE);
515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			FlushConsoleInputBuffer(inh);
516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(strlen(buf));
519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif /* !OPENSSL_SYS_WINCE && !WIN16 */
522