diff options
Diffstat (limited to 'readpass.c')
-rw-r--r-- | readpass.c | 82 |
1 files changed, 9 insertions, 73 deletions
diff --git a/readpass.c b/readpass.c index c38292f15..f3a7dcbed 100644 --- a/readpass.c +++ b/readpass.c | |||
@@ -32,88 +32,24 @@ | |||
32 | */ | 32 | */ |
33 | 33 | ||
34 | #include "includes.h" | 34 | #include "includes.h" |
35 | RCSID("$OpenBSD: readpass.c,v 1.11 2000/06/20 01:39:44 markus Exp $"); | 35 | RCSID("$OpenBSD: readpass.c,v 1.12 2000/10/11 20:14:39 markus Exp $"); |
36 | 36 | ||
37 | #include "xmalloc.h" | 37 | #include "xmalloc.h" |
38 | #include "ssh.h" | 38 | #include "ssh.h" |
39 | 39 | #include "cli.h" | |
40 | volatile int intr; | ||
41 | |||
42 | void | ||
43 | intcatch() | ||
44 | { | ||
45 | intr = 1; | ||
46 | } | ||
47 | 40 | ||
48 | /* | 41 | /* |
49 | * Reads a passphrase from /dev/tty with echo turned off. Returns the | 42 | * Reads a passphrase from /dev/tty with echo turned off. Returns the |
50 | * passphrase (allocated with xmalloc), being very careful to ensure that | 43 | * passphrase (allocated with xmalloc), being very careful to ensure that |
51 | * no other userland buffer is storing the password. | 44 | * no other userland buffer is storing the password. |
52 | */ | 45 | */ |
46 | /* | ||
47 | * Note: the funcationallity of this routing has been moved to | ||
48 | * cli_read_passphrase(). This routing remains to maintain | ||
49 | * compatibility with existing code. | ||
50 | */ | ||
53 | char * | 51 | char * |
54 | read_passphrase(const char *prompt, int from_stdin) | 52 | read_passphrase(char *prompt, int from_stdin) |
55 | { | 53 | { |
56 | char buf[1024], *p, ch; | 54 | return cli_read_passphrase(prompt, from_stdin, 0); |
57 | struct termios tio, saved_tio; | ||
58 | sigset_t oset, nset; | ||
59 | struct sigaction sa, osa; | ||
60 | int input, output, echo = 0; | ||
61 | |||
62 | if (from_stdin) { | ||
63 | input = STDIN_FILENO; | ||
64 | output = STDERR_FILENO; | ||
65 | } else | ||
66 | input = output = open("/dev/tty", O_RDWR); | ||
67 | |||
68 | if (input == -1) | ||
69 | fatal("You have no controlling tty. Cannot read passphrase.\n"); | ||
70 | |||
71 | /* block signals, get terminal modes and turn off echo */ | ||
72 | sigemptyset(&nset); | ||
73 | sigaddset(&nset, SIGTSTP); | ||
74 | (void) sigprocmask(SIG_BLOCK, &nset, &oset); | ||
75 | memset(&sa, 0, sizeof(sa)); | ||
76 | sa.sa_handler = intcatch; | ||
77 | (void) sigaction(SIGINT, &sa, &osa); | ||
78 | |||
79 | intr = 0; | ||
80 | |||
81 | if (tcgetattr(input, &saved_tio) == 0 && (saved_tio.c_lflag & ECHO)) { | ||
82 | echo = 1; | ||
83 | tio = saved_tio; | ||
84 | tio.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL); | ||
85 | (void) tcsetattr(input, TCSANOW, &tio); | ||
86 | } | ||
87 | |||
88 | fflush(stdout); | ||
89 | |||
90 | (void)write(output, prompt, strlen(prompt)); | ||
91 | for (p = buf; read(input, &ch, 1) == 1 && ch != '\n';) { | ||
92 | if (intr) | ||
93 | break; | ||
94 | if (p < buf + sizeof(buf) - 1) | ||
95 | *p++ = ch; | ||
96 | } | ||
97 | *p = '\0'; | ||
98 | if (!intr) | ||
99 | (void)write(output, "\n", 1); | ||
100 | |||
101 | /* restore terminal modes and allow signals */ | ||
102 | if (echo) | ||
103 | tcsetattr(input, TCSANOW, &saved_tio); | ||
104 | (void) sigprocmask(SIG_SETMASK, &oset, NULL); | ||
105 | (void) sigaction(SIGINT, &osa, NULL); | ||
106 | |||
107 | if (intr) { | ||
108 | kill(getpid(), SIGINT); | ||
109 | sigemptyset(&nset); | ||
110 | /* XXX tty has not neccessarily drained by now? */ | ||
111 | sigsuspend(&nset); | ||
112 | } | ||
113 | |||
114 | if (!from_stdin) | ||
115 | (void)close(input); | ||
116 | p = xstrdup(buf); | ||
117 | memset(buf, 0, sizeof(buf)); | ||
118 | return (p); | ||
119 | } | 55 | } |