diff options
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 | { |
@@ -240,6 +254,10 @@ do_cmd(char *host, char *remuser, char *cmd, int *fdin, int *fdout) | |||
240 | close(reserved[0]); | 254 | close(reserved[0]); |
241 | close(reserved[1]); | 255 | close(reserved[1]); |
242 | 256 | ||
257 | signal(SIGTSTP, suspchild); | ||
258 | signal(SIGTTIN, suspchild); | ||
259 | signal(SIGTTOU, suspchild); | ||
260 | |||
243 | /* Fork a child to execute the command on the remote host using ssh. */ | 261 | /* Fork a child to execute the command on the remote host using ssh. */ |
244 | do_cmd_pid = fork(); | 262 | do_cmd_pid = fork(); |
245 | if (do_cmd_pid == 0) { | 263 | if (do_cmd_pid == 0) { |