summaryrefslogtreecommitdiff
path: root/scp.c
diff options
context:
space:
mode:
authorDamien Miller <djm@mindrot.org>2010-07-02 13:37:33 +1000
committerDamien Miller <djm@mindrot.org>2010-07-02 13:37:33 +1000
commit0979b40934a59615d8fa1535103d51f11c04bad2 (patch)
treec7422f717e95bf6355d428f08a9c057689040947 /scp.c
parentd59dab83536d4a539e795ff5ce2be6b952d57e24 (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.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/scp.c b/scp.c
index 09efb82ac..e07de42f7 100644
--- a/scp.c
+++ b/scp.c
@@ -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
159static void
160suspchild(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
159static int 173static int
160do_local_cmd(arglist *a) 174do_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) {