|
Lines 185-190
Link Here
|
| 185 |
return 0; |
185 |
return 0; |
| 186 |
} |
186 |
} |
| 187 |
|
187 |
|
|
|
188 |
int |
| 189 |
do_spawnwait(arglist *alist) |
| 190 |
{ |
| 191 |
int status; |
| 192 |
|
| 193 |
if (verbose_mode) { |
| 194 |
int i; |
| 195 |
|
| 196 |
fprintf(stderr, "Executing:"); |
| 197 |
for (i = 0; alist->list[i] != NULL; i++) { |
| 198 |
fprintf(stderr, " %s", alist->list[i]); |
| 199 |
} |
| 200 |
fprintf(stderr, "\n"); |
| 201 |
} |
| 202 |
/* Fork a child to execute the command. */ |
| 203 |
do_cmd_pid = fork(); |
| 204 |
if (do_cmd_pid == 0) { |
| 205 |
/* Child. */ |
| 206 |
|
| 207 |
execvp(alist->list[0], alist->list); |
| 208 |
perror(alist->list[0]); |
| 209 |
exit(1); |
| 210 |
} else if (do_cmd_pid == -1) { |
| 211 |
fatal("fork: %s", strerror(errno)); |
| 212 |
} |
| 213 |
signal(SIGTERM, killchild); |
| 214 |
signal(SIGINT, killchild); |
| 215 |
signal(SIGHUP, killchild); |
| 216 |
|
| 217 |
while (waitpid(do_cmd_pid, &status, 0) != do_cmd_pid) { |
| 218 |
if (errno != EINTR) { |
| 219 |
fatal("waitpid: %s", strerror(errno)); |
| 220 |
} |
| 221 |
} |
| 222 |
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) |
| 223 |
return 1; |
| 224 |
|
| 225 |
return 0; |
| 226 |
} |
| 227 |
|
| 188 |
typedef struct { |
228 |
typedef struct { |
| 189 |
size_t cnt; |
229 |
size_t cnt; |
| 190 |
char *buf; |
230 |
char *buf; |
|
Lines 360-369
Link Here
|
| 360 |
} |
400 |
} |
| 361 |
|
401 |
|
| 362 |
void |
402 |
void |
|
|
403 |
clearargs(arglist *alist) |
| 404 |
{ |
| 405 |
int i = alist->num; |
| 406 |
while (i > 0) { |
| 407 |
i--; |
| 408 |
if (alist->list[i]) { |
| 409 |
xfree(alist->list[i]); |
| 410 |
alist->list[i] = NULL; |
| 411 |
} |
| 412 |
} |
| 413 |
alist->num = 0; |
| 414 |
} |
| 415 |
|
| 416 |
void |
| 363 |
toremote(char *targ, int argc, char **argv) |
417 |
toremote(char *targ, int argc, char **argv) |
| 364 |
{ |
418 |
{ |
| 365 |
int i, len; |
419 |
int i, len; |
| 366 |
char *bp, *host, *src, *suser, *thost, *tuser, *arg; |
420 |
char *bp, *host, *src, *suser, *thost, *tuser, *arg; |
|
|
421 |
arglist alist; |
| 422 |
memset(&alist, 0, sizeof(alist)); |
| 423 |
|
| 367 |
|
424 |
|
| 368 |
*targ++ = 0; |
425 |
*targ++ = 0; |
| 369 |
if (*targ == 0) |
426 |
if (*targ == 0) |
|
Lines 381-400
Link Here
|
| 381 |
tuser = NULL; |
438 |
tuser = NULL; |
| 382 |
} |
439 |
} |
| 383 |
|
440 |
|
|
|
441 |
if (tuser && !okname(tuser)) { |
| 442 |
xfree(arg); |
| 443 |
return; |
| 444 |
} |
| 445 |
|
| 384 |
for (i = 0; i < argc - 1; i++) { |
446 |
for (i = 0; i < argc - 1; i++) { |
| 385 |
src = colon(argv[i]); |
447 |
src = colon(argv[i]); |
| 386 |
if (src) { /* remote to remote */ |
448 |
if (src) { /* remote to remote */ |
| 387 |
static char *ssh_options = |
449 |
clearargs(&alist); |
| 388 |
"-x -o'ClearAllForwardings yes'"; |
450 |
addargs(&alist, "%s", ssh_program); |
|
|
451 |
if (verbose_mode) |
| 452 |
addargs(&alist, "-v"); |
| 453 |
addargs(&alist, "-x"); |
| 454 |
addargs(&alist, "-oClearAllForwardings yes"); |
| 455 |
addargs(&alist, "-n"); |
| 389 |
*src++ = 0; |
456 |
*src++ = 0; |
| 390 |
if (*src == 0) |
457 |
if (*src == 0) |
| 391 |
src = "."; |
458 |
src = "."; |
| 392 |
host = strrchr(argv[i], '@'); |
459 |
host = strrchr(argv[i], '@'); |
| 393 |
len = strlen(ssh_program) + strlen(argv[i]) + |
460 |
|
| 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) { |
461 |
if (host) { |
| 399 |
*host++ = 0; |
462 |
*host++ = 0; |
| 400 |
host = cleanhostname(host); |
463 |
host = cleanhostname(host); |
|
Lines 402-436
Link Here
|
| 402 |
if (*suser == '\0') |
465 |
if (*suser == '\0') |
| 403 |
suser = pwd->pw_name; |
466 |
suser = pwd->pw_name; |
| 404 |
else if (!okname(suser)) { |
467 |
else if (!okname(suser)) { |
| 405 |
xfree(bp); |
|
|
| 406 |
continue; |
| 407 |
} |
| 408 |
if (tuser && !okname(tuser)) { |
| 409 |
xfree(bp); |
| 410 |
continue; |
468 |
continue; |
| 411 |
} |
469 |
} |
| 412 |
snprintf(bp, len, |
470 |
addargs(&alist, "-l"); |
| 413 |
"%s%s %s -n " |
471 |
addargs(&alist, "%s", suser); |
| 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 { |
472 |
} else { |
| 420 |
host = cleanhostname(argv[i]); |
473 |
host = cleanhostname(argv[i]); |
| 421 |
snprintf(bp, len, |
474 |
} |
| 422 |
"exec %s%s %s -n %s " |
475 |
|
| 423 |
"%s %s '%s%s%s:%s'", |
476 |
addargs(&alist, "%s", host); |
| 424 |
ssh_program, verbose_mode ? " -v" : "", |
477 |
addargs(&alist, "%s", cmd); |
| 425 |
ssh_options, host, cmd, src, |
478 |
addargs(&alist, "%s", src); |
|
|
479 |
addargs(&alist, "%s%s%s:%s", |
| 426 |
tuser ? tuser : "", tuser ? "@" : "", |
480 |
tuser ? tuser : "", tuser ? "@" : "", |
| 427 |
thost, targ); |
481 |
thost, targ); |
| 428 |
} |
482 |
if (do_spawnwait(&alist) != 0) |
| 429 |
if (verbose_mode) |
|
|
| 430 |
fprintf(stderr, "Executing: %s\n", bp); |
| 431 |
if (system(bp) != 0) |
| 432 |
errs = 1; |
483 |
errs = 1; |
| 433 |
(void) xfree(bp); |
|
|
| 434 |
} else { /* local to remote */ |
484 |
} else { /* local to remote */ |
| 435 |
if (remin == -1) { |
485 |
if (remin == -1) { |
| 436 |
len = strlen(targ) + CMDNEEDS + 20; |
486 |
len = strlen(targ) + CMDNEEDS + 20; |
|
Lines 454-473
Link Here
|
| 454 |
{ |
504 |
{ |
| 455 |
int i, len; |
505 |
int i, len; |
| 456 |
char *bp, *host, *src, *suser; |
506 |
char *bp, *host, *src, *suser; |
|
|
507 |
arglist alist; |
| 508 |
memset(&alist, 0, sizeof(alist)); |
| 457 |
|
509 |
|
| 458 |
for (i = 0; i < argc - 1; i++) { |
510 |
for (i = 0; i < argc - 1; i++) { |
| 459 |
if (!(src = colon(argv[i]))) { /* Local to local. */ |
511 |
if (!(src = colon(argv[i]))) { /* Local to local. */ |
| 460 |
len = strlen(_PATH_CP) + strlen(argv[i]) + |
512 |
clearargs(&alist); |
| 461 |
strlen(argv[argc - 1]) + 20; |
513 |
addargs(&alist, "%s", _PATH_CP); |
| 462 |
bp = xmalloc(len); |
514 |
if (iamrecursive) |
| 463 |
(void) snprintf(bp, len, "exec %s%s%s %s %s", _PATH_CP, |
515 |
addargs(&alist, "-r"); |
| 464 |
iamrecursive ? " -r" : "", pflag ? " -p" : "", |
516 |
if (pflag) |
| 465 |
argv[i], argv[argc - 1]); |
517 |
addargs(&alist, "-p"); |
| 466 |
if (verbose_mode) |
518 |
addargs(&alist, "%s", argv[i]); |
| 467 |
fprintf(stderr, "Executing: %s\n", bp); |
519 |
addargs(&alist, "%s", argv[argc-1]); |
| 468 |
if (system(bp)) |
520 |
if (do_spawnwait(&alist)) |
| 469 |
++errs; |
521 |
++errs; |
| 470 |
(void) xfree(bp); |
|
|
| 471 |
continue; |
522 |
continue; |
| 472 |
} |
523 |
} |
| 473 |
*src++ = 0; |
524 |
*src++ = 0; |