version 1.1.1.1, 2009/06/07 22:19:17 |
version 1.1.1.2, 2010/11/21 17:05:54 |
|
|
/* $NetBSD$ */ |
/* $NetBSD$ */ |
/* $OpenBSD: scp.c,v 1.164 2008/10/10 04:55:16 stevesk Exp $ */ |
/* $OpenBSD: scp.c,v 1.166 2010/07/01 13:06:59 millert Exp $ */ |
/* |
/* |
* scp - secure remote copy. This is basically patched BSD rcp which |
* scp - secure remote copy. This is basically patched BSD rcp which |
* uses ssh to do the data transfer (instead of using rcmd). |
* uses ssh to do the data transfer (instead of using rcmd). |
Line 141 killchild(int signo) |
|
Line 141 killchild(int signo) |
|
exit(1); |
exit(1); |
} |
} |
|
|
|
static void |
|
suspchild(int signo) |
|
{ |
|
int status; |
|
|
|
if (do_cmd_pid > 1) { |
|
kill(do_cmd_pid, signo); |
|
while (waitpid(do_cmd_pid, &status, WUNTRACED) == -1 && |
|
errno == EINTR) |
|
; |
|
kill(getpid(), SIGSTOP); |
|
} |
|
} |
|
|
static int |
static int |
do_local_cmd(arglist *a) |
do_local_cmd(arglist *a) |
{ |
{ |
Line 217 do_cmd(char *host, char *remuser, char * |
|
Line 231 do_cmd(char *host, char *remuser, char * |
|
close(reserved[0]); |
close(reserved[0]); |
close(reserved[1]); |
close(reserved[1]); |
|
|
|
signal(SIGTSTP, suspchild); |
|
signal(SIGTTIN, suspchild); |
|
signal(SIGTTOU, suspchild); |
|
|
/* Fork a child to execute the command on the remote host using ssh. */ |
/* Fork a child to execute the command on the remote host using ssh. */ |
do_cmd_pid = fork(); |
do_cmd_pid = fork(); |
if (do_cmd_pid == 0) { |
if (do_cmd_pid == 0) { |
Line 229 do_cmd(char *host, char *remuser, char * |
|
Line 247 do_cmd(char *host, char *remuser, char * |
|
close(pout[1]); |
close(pout[1]); |
|
|
replacearg(&args, 0, "%s", ssh_program); |
replacearg(&args, 0, "%s", ssh_program); |
if (remuser != NULL) |
if (remuser != NULL) { |
addargs(&args, "-l%s", remuser); |
addargs(&args, "-l"); |
|
addargs(&args, "%s", remuser); |
|
} |
|
addargs(&args, "--"); |
addargs(&args, "%s", host); |
addargs(&args, "%s", host); |
addargs(&args, "%s", cmd); |
addargs(&args, "%s", cmd); |
|
|
Line 319 main(int argc, char **argv) |
|
Line 340 main(int argc, char **argv) |
|
case 'c': |
case 'c': |
case 'i': |
case 'i': |
case 'F': |
case 'F': |
addargs(&args, "-%c%s", ch, optarg); |
addargs(&args, "-%c", ch); |
|
addargs(&args, "%s", optarg); |
break; |
break; |
case 'P': |
case 'P': |
addargs(&args, "-p%s", optarg); |
addargs(&args, "-p"); |
|
addargs(&args, "%s", optarg); |
break; |
break; |
case 'B': |
case 'B': |
addargs(&args, "-oBatchmode yes"); |
addargs(&args, "-oBatchmode yes"); |
Line 527 toremote(char *targ, int argc, char **ar |
|
Line 550 toremote(char *targ, int argc, char **ar |
|
} else { |
} else { |
host = cleanhostname(argv[i]); |
host = cleanhostname(argv[i]); |
} |
} |
|
addargs(&alist, "--"); |
addargs(&alist, "%s", host); |
addargs(&alist, "%s", host); |
addargs(&alist, "%s", cmd); |
addargs(&alist, "%s", cmd); |
addargs(&alist, "%s", src); |
addargs(&alist, "%s", src); |
Line 537 toremote(char *targ, int argc, char **ar |
|
Line 561 toremote(char *targ, int argc, char **ar |
|
errs = 1; |
errs = 1; |
} else { /* local to remote */ |
} else { /* local to remote */ |
if (remin == -1) { |
if (remin == -1) { |
xasprintf(&bp, "%s -t %s", cmd, targ); |
xasprintf(&bp, "%s -t -- %s", cmd, targ); |
host = cleanhostname(thost); |
host = cleanhostname(thost); |
if (do_cmd(host, tuser, bp, &remin, |
if (do_cmd(host, tuser, bp, &remin, |
&remout) < 0) |
&remout) < 0) |
Line 570 tolocal(int argc, char **argv) |
|
Line 594 tolocal(int argc, char **argv) |
|
addargs(&alist, "-r"); |
addargs(&alist, "-r"); |
if (pflag) |
if (pflag) |
addargs(&alist, "-p"); |
addargs(&alist, "-p"); |
|
addargs(&alist, "--"); |
addargs(&alist, "%s", argv[i]); |
addargs(&alist, "%s", argv[i]); |
addargs(&alist, "%s", argv[argc-1]); |
addargs(&alist, "%s", argv[argc-1]); |
if (do_local_cmd(&alist)) |
if (do_local_cmd(&alist)) |
Line 589 tolocal(int argc, char **argv) |
|
Line 614 tolocal(int argc, char **argv) |
|
suser = pwd->pw_name; |
suser = pwd->pw_name; |
} |
} |
host = cleanhostname(host); |
host = cleanhostname(host); |
xasprintf(&bp, "%s -f %s", cmd, src); |
xasprintf(&bp, "%s -f -- %s", cmd, src); |
if (do_cmd(host, suser, bp, &remin, &remout) < 0) { |
if (do_cmd(host, suser, bp, &remin, &remout) < 0) { |
(void) xfree(bp); |
(void) xfree(bp); |
++errs; |
++errs; |