diff options
author | Colin Watson <cjwatson@debian.org> | 2010-08-23 22:56:08 +0100 |
---|---|---|
committer | Colin Watson <cjwatson@debian.org> | 2010-08-23 22:56:08 +0100 |
commit | 31e30b835fd9695d3b6647cab4867001b092e28f (patch) | |
tree | 138e715c25661825457c7280cd66e3f4853d474c /scp.c | |
parent | 78eedc2c60ff4718200f9271d8ee4f437da3a0c5 (diff) | |
parent | 43094ebf14c9b16f1ea398bc5b65a7335e947288 (diff) |
merge 5.6p1
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) { |