|
Lines 118-123
killchild(int signo)
Link Here
|
| 118 |
exit(1); |
118 |
exit(1); |
| 119 |
} |
119 |
} |
| 120 |
|
120 |
|
|
|
121 |
static int |
| 122 |
do_local_cmd(arglist *a) |
| 123 |
{ |
| 124 |
u_int i; |
| 125 |
int status; |
| 126 |
pid_t pid; |
| 127 |
|
| 128 |
if (a->num == 0) |
| 129 |
fatal("do_local_cmd: no arguments"); |
| 130 |
|
| 131 |
if (verbose_mode) { |
| 132 |
fprintf(stderr, "Executing:"); |
| 133 |
for (i = 0; i < a->num; i++) |
| 134 |
fprintf(stderr, " %s", a->list[i]); |
| 135 |
fprintf(stderr, "\n"); |
| 136 |
} |
| 137 |
if ((pid = fork()) == -1) |
| 138 |
fatal("do_local_cmd: fork: %s", strerror(errno)); |
| 139 |
|
| 140 |
if (pid == 0) { |
| 141 |
execvp(a->list[0], a->list); |
| 142 |
perror(a->list[0]); |
| 143 |
exit(1); |
| 144 |
} |
| 145 |
|
| 146 |
do_cmd_pid = pid; |
| 147 |
signal(SIGTERM, killchild); |
| 148 |
signal(SIGINT, killchild); |
| 149 |
signal(SIGHUP, killchild); |
| 150 |
|
| 151 |
while (waitpid(pid, &status, 0) == -1) |
| 152 |
if (errno != EINTR) |
| 153 |
fatal("do_local_cmd: waitpid: %s", strerror(errno)); |
| 154 |
|
| 155 |
do_cmd_pid = -1; |
| 156 |
|
| 157 |
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) |
| 158 |
return (-1); |
| 159 |
|
| 160 |
return (0); |
| 161 |
} |
| 162 |
|
| 121 |
/* |
163 |
/* |
| 122 |
* This function executes the given command as the specified user on the |
164 |
* This function executes the given command as the specified user on the |
| 123 |
* given host. This returns < 0 if execution fails, and >= 0 otherwise. This |
165 |
* given host. This returns < 0 if execution fails, and >= 0 otherwise. This |
|
Lines 162-168
do_cmd(char *host, char *remuser, char *
Link Here
|
| 162 |
close(pin[0]); |
204 |
close(pin[0]); |
| 163 |
close(pout[1]); |
205 |
close(pout[1]); |
| 164 |
|
206 |
|
| 165 |
args.list[0] = ssh_program; |
207 |
replacearg(&args, 0, "%s", ssh_program); |
| 166 |
if (remuser != NULL) |
208 |
if (remuser != NULL) |
| 167 |
addargs(&args, "-l%s", remuser); |
209 |
addargs(&args, "-l%s", remuser); |
| 168 |
addargs(&args, "%s", host); |
210 |
addargs(&args, "%s", host); |
|
Lines 224-231
main(int argc, char **argv)
Link Here
|
| 224 |
|
266 |
|
| 225 |
__progname = ssh_get_progname(argv[0]); |
267 |
__progname = ssh_get_progname(argv[0]); |
| 226 |
|
268 |
|
|
|
269 |
memset(&args, '\0', sizeof(args)); |
| 227 |
args.list = NULL; |
270 |
args.list = NULL; |
| 228 |
addargs(&args, "ssh"); /* overwritten with ssh_program */ |
271 |
addargs(&args, "%s", ssh_program); |
| 229 |
addargs(&args, "-x"); |
272 |
addargs(&args, "-x"); |
| 230 |
addargs(&args, "-oForwardAgent no"); |
273 |
addargs(&args, "-oForwardAgent no"); |
| 231 |
addargs(&args, "-oClearAllForwardings yes"); |
274 |
addargs(&args, "-oClearAllForwardings yes"); |
|
Lines 364-369
toremote(char *targ, int argc, char **ar
Link Here
|
| 364 |
{ |
407 |
{ |
| 365 |
int i, len; |
408 |
int i, len; |
| 366 |
char *bp, *host, *src, *suser, *thost, *tuser, *arg; |
409 |
char *bp, *host, *src, *suser, *thost, *tuser, *arg; |
|
|
410 |
arglist alist; |
| 411 |
|
| 412 |
memset(&alist, '\0', sizeof(alist)); |
| 413 |
alist.list = NULL; |
| 367 |
|
414 |
|
| 368 |
*targ++ = 0; |
415 |
*targ++ = 0; |
| 369 |
if (*targ == 0) |
416 |
if (*targ == 0) |
|
Lines 381-400
toremote(char *targ, int argc, char **ar
Link Here
|
| 381 |
tuser = NULL; |
428 |
tuser = NULL; |
| 382 |
} |
429 |
} |
| 383 |
|
430 |
|
|
|
431 |
if (tuser != NULL && !okname(tuser)) { |
| 432 |
xfree(arg); |
| 433 |
return; |
| 434 |
} |
| 435 |
|
| 384 |
for (i = 0; i < argc - 1; i++) { |
436 |
for (i = 0; i < argc - 1; i++) { |
| 385 |
src = colon(argv[i]); |
437 |
src = colon(argv[i]); |
| 386 |
if (src) { /* remote to remote */ |
438 |
if (src) { /* remote to remote */ |
| 387 |
static char *ssh_options = |
439 |
freeargs(&alist); |
| 388 |
"-x -o'ClearAllForwardings yes'"; |
440 |
addargs(&alist, "%s", ssh_program); |
|
|
441 |
if (verbose_mode) |
| 442 |
addargs(&alist, "-v"); |
| 443 |
addargs(&alist, "-x"); |
| 444 |
addargs(&alist, "-oClearAllForwardings yes"); |
| 445 |
addargs(&alist, "-n"); |
| 446 |
|
| 389 |
*src++ = 0; |
447 |
*src++ = 0; |
| 390 |
if (*src == 0) |
448 |
if (*src == 0) |
| 391 |
src = "."; |
449 |
src = "."; |
| 392 |
host = strrchr(argv[i], '@'); |
450 |
host = strrchr(argv[i], '@'); |
| 393 |
len = strlen(ssh_program) + strlen(argv[i]) + |
451 |
|
| 394 |
strlen(src) + (tuser ? strlen(tuser) : 0) + |
|
|
| 395 |
strlen(thost) + strlen(targ) + |
| 396 |
strlen(ssh_options) + CMDNEEDS + 20; |
| 397 |
bp = xmalloc(len); |
| 398 |
if (host) { |
452 |
if (host) { |
| 399 |
*host++ = 0; |
453 |
*host++ = 0; |
| 400 |
host = cleanhostname(host); |
454 |
host = cleanhostname(host); |
|
Lines 405-434
toremote(char *targ, int argc, char **ar
Link Here
|
| 405 |
xfree(bp); |
459 |
xfree(bp); |
| 406 |
continue; |
460 |
continue; |
| 407 |
} |
461 |
} |
| 408 |
if (tuser && !okname(tuser)) { |
462 |
addargs(&alist, "-l"); |
| 409 |
xfree(bp); |
463 |
addargs(&alist, "%s", suser); |
| 410 |
continue; |
|
|
| 411 |
} |
| 412 |
snprintf(bp, len, |
| 413 |
"%s%s %s -n " |
| 414 |
"-l %s %s %s %s '%s%s%s:%s'", |
| 415 |
ssh_program, verbose_mode ? " -v" : "", |
| 416 |
ssh_options, suser, host, cmd, src, |
| 417 |
tuser ? tuser : "", tuser ? "@" : "", |
| 418 |
thost, targ); |
| 419 |
} else { |
464 |
} else { |
| 420 |
host = cleanhostname(argv[i]); |
465 |
host = cleanhostname(argv[i]); |
| 421 |
snprintf(bp, len, |
|
|
| 422 |
"exec %s%s %s -n %s " |
| 423 |
"%s %s '%s%s%s:%s'", |
| 424 |
ssh_program, verbose_mode ? " -v" : "", |
| 425 |
ssh_options, host, cmd, src, |
| 426 |
tuser ? tuser : "", tuser ? "@" : "", |
| 427 |
thost, targ); |
| 428 |
} |
466 |
} |
| 429 |
if (verbose_mode) |
467 |
addargs(&alist, "%s", host); |
| 430 |
fprintf(stderr, "Executing: %s\n", bp); |
468 |
addargs(&alist, "%s", cmd); |
| 431 |
if (system(bp) != 0) |
469 |
addargs(&alist, "%s", src); |
|
|
470 |
addargs(&alist, "%s%s%s:%s", |
| 471 |
tuser ? tuser : "", tuser ? "@" : "", |
| 472 |
thost, targ); |
| 473 |
if (do_local_cmd(&alist) != 0) |
| 432 |
errs = 1; |
474 |
errs = 1; |
| 433 |
(void) xfree(bp); |
475 |
(void) xfree(bp); |
| 434 |
} else { /* local to remote */ |
476 |
} else { /* local to remote */ |
|
Lines 454-473
tolocal(int argc, char **argv)
Link Here
|
| 454 |
{ |
496 |
{ |
| 455 |
int i, len; |
497 |
int i, len; |
| 456 |
char *bp, *host, *src, *suser; |
498 |
char *bp, *host, *src, *suser; |
|
|
499 |
arglist alist; |
| 500 |
|
| 501 |
memset(&alist, '\0', sizeof(alist)); |
| 502 |
alist.list = NULL; |
| 457 |
|
503 |
|
| 458 |
for (i = 0; i < argc - 1; i++) { |
504 |
for (i = 0; i < argc - 1; i++) { |
| 459 |
if (!(src = colon(argv[i]))) { /* Local to local. */ |
505 |
if (!(src = colon(argv[i]))) { /* Local to local. */ |
| 460 |
len = strlen(_PATH_CP) + strlen(argv[i]) + |
506 |
freeargs(&alist); |
| 461 |
strlen(argv[argc - 1]) + 20; |
507 |
addargs(&alist, "%s", _PATH_CP); |
| 462 |
bp = xmalloc(len); |
508 |
if (iamrecursive) |
| 463 |
(void) snprintf(bp, len, "exec %s%s%s %s %s", _PATH_CP, |
509 |
addargs(&alist, "-r"); |
| 464 |
iamrecursive ? " -r" : "", pflag ? " -p" : "", |
510 |
if (pflag) |
| 465 |
argv[i], argv[argc - 1]); |
511 |
addargs(&alist, "-p"); |
| 466 |
if (verbose_mode) |
512 |
addargs(&alist, "%s", argv[i]); |
| 467 |
fprintf(stderr, "Executing: %s\n", bp); |
513 |
addargs(&alist, "%s", argv[argc-1]); |
| 468 |
if (system(bp)) |
514 |
if (do_local_cmd(&alist)) |
| 469 |
++errs; |
515 |
++errs; |
| 470 |
(void) xfree(bp); |
|
|
| 471 |
continue; |
516 |
continue; |
| 472 |
} |
517 |
} |
| 473 |
*src++ = 0; |
518 |
*src++ = 0; |