void tolocal(int argc, char *argv[]) { int i; size_t len; char *bp, *host, *src, *suser; for (i = 0; i < argc - 1; i++) { if (!(src = colon(argv[i]))) { /* Local to local. */ len = strlen(_PATH_CP) + strlen(argv[i]) + strlen(argv[argc - 1]) + 20; if (!(bp = malloc(len))) err(1, NULL); (void)snprintf(bp, len, "exec %s%s%s %s %s", _PATH_CP, iamrecursive ? " -r" : "", pflag ? " -p" : "", argv[i], argv[argc - 1]); if (susystem(bp)) ++errs; (void)free(bp); continue; } *src++ = 0; if (*src == 0) src = dot; if ((host = strchr(argv[i], '@')) == NULL) { host = argv[i]; suser = pwname; } else { *host++ = 0; suser = argv[i]; if (*suser == '\0') suser = pwname; else if (!okname(suser)) continue; } host = unbracket(host); len = strlen(src) + CMDNEEDS + 20; if ((bp = malloc(len)) == NULL) err(1, NULL); (void)snprintf(bp, len, "%s -f %s", cmd, src); rem = rcmd_af(&host, port, pwname, suser, bp, NULL, family); (void)free(bp); if (rem < 0) { ++errs; continue; } sink(1, argv + argc - 1); (void)close(rem); rem = -1; } }
void toremote(char *targ, int argc, char **argv) { int i; char *bp, *host, *src, *suser, *thost, *tuser; *targ++ = 0; if (*targ == 0) targ = "."; if ((thost = strchr(argv[argc - 1], '@')) != NULL) { /* user@host */ *thost++ = 0; tuser = argv[argc - 1]; if (*tuser == '\0') tuser = NULL; else if (!okname(tuser)) exit(1); } else { thost = argv[argc - 1]; tuser = NULL; } thost = unbracket(thost); for (i = 0; i < argc - 1; i++) { src = colon(argv[i]); if (src) { /* remote to remote */ int ret; *src++ = 0; if (*src == 0) src = "."; host = strchr(argv[i], '@'); if (host) { *host++ = '\0'; host = unbracket(host); suser = argv[i]; if (*suser == '\0') suser = pwd->pw_name; else if (!okname(suser)) continue; ret = asprintf(&bp, "%s%s %s -l %s -n %s %s '%s%s%s:%s'", _PATH_RSH, eflag ? " -e" : "", host, suser, cmd, src, tuser ? tuser : "", tuser ? "@" : "", thost, targ); } else { host = unbracket(argv[i]); ret = asprintf(&bp, "exec %s%s %s -n %s %s '%s%s%s:%s'", _PATH_RSH, eflag ? " -e" : "", host, cmd, src, tuser ? tuser : "", tuser ? "@" : "", thost, targ); } if (ret == -1) err (1, "malloc"); susystem(bp); free(bp); } else { /* local to remote */ if (remin == -1) { if (asprintf(&bp, "%s -t %s", cmd, targ) == -1) err (1, "malloc"); host = thost; if (do_cmd(host, tuser, bp, &remin, &remout) < 0) exit(1); if (response() < 0) exit(1); free(bp); } source(1, argv+i); } } }
void toremote(char *targ, int argc, char *argv[]) { int i; size_t len; char *bp, *host, *src, *suser, *thost, *tuser; *targ++ = 0; if (*targ == 0) targ = dot; if ((thost = strchr(argv[argc - 1], '@')) != NULL) { /* user@host */ *thost++ = 0; tuser = argv[argc - 1]; if (*tuser == '\0') tuser = NULL; else if (!okname(tuser)) exit(1); } else { thost = argv[argc - 1]; tuser = NULL; } thost = unbracket(thost); for (i = 0; i < argc - 1; i++) { src = colon(argv[i]); if (src) { /* remote to remote */ *src++ = 0; if (*src == 0) src = dot; host = strchr(argv[i], '@'); len = strlen(_PATH_RSH) + strlen(argv[i]) + strlen(src) + (tuser ? strlen(tuser) : 0) + strlen(thost) + strlen(targ) + CMDNEEDS + 20; if (!(bp = malloc(len))) err(1, NULL); if (host) { *host++ = 0; host = unbracket(host); suser = argv[i]; if (*suser == '\0') suser = pwname; else if (!okname(suser)) { (void)free(bp); continue; } (void)snprintf(bp, len, "%s %s -l %s -n %s %s '%s%s%s:%s'", _PATH_RSH, host, suser, cmd, src, tuser ? tuser : "", tuser ? "@" : "", thost, targ); } else { host = unbracket(argv[i]); (void)snprintf(bp, len, "exec %s %s -n %s %s '%s%s%s:%s'", _PATH_RSH, argv[i], cmd, src, tuser ? tuser : "", tuser ? "@" : "", thost, targ); } (void)susystem(bp); (void)free(bp); } else { /* local to remote */ if (rem == -1) { len = strlen(targ) + CMDNEEDS + 20; if (!(bp = malloc(len))) err(1, NULL); (void)snprintf(bp, len, "%s -t %s", cmd, targ); host = thost; rem = rcmd_af(&host, port, pwname, tuser ? tuser : pwname, bp, NULL, family); if (rem < 0) exit(1); if (response() < 0) exit(1); (void)free(bp); } source(1, argv+i); } } }