diff options
author | Damien Miller <djm@mindrot.org> | 2010-07-02 13:37:33 +1000 |
---|---|---|
committer | Damien Miller <djm@mindrot.org> | 2010-07-02 13:37:33 +1000 |
commit | 0979b40934a59615d8fa1535103d51f11c04bad2 (patch) | |
tree | c7422f717e95bf6355d428f08a9c057689040947 /scp.c | |
parent | d59dab83536d4a539e795ff5ce2be6b952d57e24 (diff) |
- millert@cvs.openbsd.org 2010/07/01 13:06:59
[scp.c]
Fix a longstanding problem where if you suspend scp at the
password/passphrase prompt the terminal mode is not restored.
OK djm@
Diffstat (limited to 'scp.c')
-rw-r--r-- | scp.c | 20 |
1 files changed, 19 insertions, 1 deletions
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: scp.c,v 1.165 2009/12/20 07:28:36 guenther Exp $ */ | 1 | /* $OpenBSD: scp.c,v 1.166 2010/07/01 13:06:59 millert Exp $ */ |
2 | /* | 2 | /* |
3 | * scp - secure remote copy. This is basically patched BSD rcp which | 3 | * scp - secure remote copy. This is basically patched BSD rcp which |
4 | * uses ssh to do the data transfer (instead of using rcmd). | 4 | * uses ssh to do the data transfer (instead of using rcmd). |
@@ -156,6 +156,20 @@ killchild(int signo) | |||
156 | exit(1); | 156 | exit(1); |
157 | } | 157 | } |
158 | 158 | ||
159 | static void | ||
160 | suspchild(int signo) | ||
161 | { | ||
162 | int status; | ||
163 | |||
164 | if (do_cmd_pid > 1) { | ||
165 | kill(do_cmd_pid, signo); | ||
166 | while (waitpid(do_cmd_pid, &status, WUNTRACED) == -1 && | ||
167 | errno == EINTR) | ||
168 | ; | ||
169 | kill(getpid(), SIGSTOP); | ||
170 | } | ||
171 | } | ||
172 | |||
159 | static int | 173 | static int |
160 | do_local_cmd(arglist *a) | 174 | do_local_cmd(arglist *a) |
161 | { | 175 | { |
@@ -232,6 +246,10 @@ do_cmd(char *host, char *remuser, char *cmd, int *fdin, int *fdout) | |||
232 | close(reserved[0]); | 246 | close(reserved[0]); |
233 | close(reserved[1]); | 247 | close(reserved[1]); |
234 | 248 | ||
249 | signal(SIGTSTP, suspchild); | ||
250 | signal(SIGTTIN, suspchild); | ||
251 | signal(SIGTTOU, suspchild); | ||
252 | |||
235 | /* Fork a child to execute the command on the remote host using ssh. */ | 253 | /* Fork a child to execute the command on the remote host using ssh. */ |
236 | do_cmd_pid = fork(); | 254 | do_cmd_pid = fork(); |
237 | if (do_cmd_pid == 0) { | 255 | if (do_cmd_pid == 0) { |