int builtin_command(char **args, int *resultp) /* * purpose: run a builtin command * returns: 1 if args[0] is builtin, 0 if not * details: test args[0] against all known builtins. Call functions */ { int rv = 0; if ( strcmp(args[0],"set") == 0 ){ /* 'set' command? */ VLlist(); *resultp = 0; rv = 1; } else if ( strchr(args[0], '=') != NULL ){ /* assignment cmd */ *resultp = assign(args[0]); if ( *resultp != -1 ) /* x-y=123 not ok */ rv = 1; } else if ( strcmp(args[0], "export") == 0 ){ if ( args[1] != NULL && okname(args[1]) ) *resultp = VLexport(args[1]); else *resultp = 1; rv = 1; } return rv; }
int builtin_command(char **args) { int rv = 0; int exit_val; if (strcmp(args[0], "set") == 0) { VLlist(); rv = 1; } else if (strchr(args[0], '=') != NULL) { rv = assign(args[0]); } else if (strcmp(args[0], "export") == 0) { if ((args[1] != NULL) && okname(args[1])) VLexport(args[1]); rv = 1; } else if (strcmp(args[0], "exit") == 0) { exit_val = 0; if (args[1] == NULL || is_numeric(args[1])) { if (args[1] != NULL) exit_val = atoi(args[1]); exit(exit_val); } } return rv; }
void tolocal(int argc, char *argv[]) { int i, len, tos; 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, "malloc"); (void)snprintf(bp, len, "exec %s%s%s %s %s", _PATH_CP, iamrecursive ? " -PR" : "", pflag ? " -p" : "", argv[i], argv[argc - 1]); if (susystem(bp, userid)) ++errs; (void)free(bp); continue; } *src++ = 0; if (*src == 0) src = period; if ((host = strchr(argv[i], '@')) == NULL) { host = argv[i]; suser = pwd->pw_name; } else { *host++ = 0; suser = argv[i]; if (*suser == '\0') suser = pwd->pw_name; else if (!okname(suser)) { ++errs; continue; } } len = strlen(src) + CMDNEEDS + 20; if ((bp = malloc(len)) == NULL) err(1, "malloc"); (void)snprintf(bp, len, "%s -f %s", cmd, src); rem = rcmd_af(&host, port, pwd->pw_name, suser, bp, 0, family); (void)free(bp); if (rem < 0) { ++errs; continue; } (void)seteuid(userid); if (family == PF_INET) { tos = IPTOS_THROUGHPUT; if (setsockopt(rem, IPPROTO_IP, IP_TOS, &tos, sizeof(int)) < 0) warn("TOS (ignored)"); } sink(1, argv + argc - 1); (void)seteuid(0); (void)close(rem); rem = -1; } }
rmtgetconn() #endif { static struct servent *sp = 0; static struct passwd *pwd = 0; char *tuser, *host, *device; uint_t size; if (sp == 0) { sp = getservbyname("shell", "tcp"); if (sp == 0) { print(dgettext(domainname, "shell/tcp: unknown service\n")); Exit(1); } pwd = getpwuid(getuid()); if (pwd == 0) { print(dgettext(domainname, "Cannot find password entry for uid %d\n"), getuid()); Exit(1); } } /* Was strrchr(), be consistent with dump */ host = strchr(rmtpeer, '@'); if (host) { tuser = rmtpeer; *host++ = 0; rmtpeer = host; if (!okname(tuser)) Exit(1); } else { host = rmtpeer; tuser = pwd->pw_name; } /* Was strrchr() - be consistent with dump and restore */ device = strchr(host, ':'); if (device) *device = 0; /* throw away device name */ /* * myrcmd() replaces the contents of rmtpeer with a pointer * to a static copy of the canonical host name. However, * since we never refer to rmtpeer again (other than to * overwrite it in the next rmthost() invocation), we don't * really care. */ /* LINTED sp->s_port is an int, even though port numbers are 1..65535 */ rmtape = myrcmd(&rmtpeer, (ushort_t)sp->s_port, pwd->pw_name, tuser, "/etc/rmt"); if (rmtape < 0) { if (*myrcmd_stderr) print("%s", myrcmd_stderr); } else { size = ntrec * tp_bsize; while (size > tp_bsize && setsockopt(rmtape, SOL_SOCKET, SO_SNDBUF, (char *)&size, sizeof (size)) < 0) size -= tp_bsize; } }
int builtin_command(char ** args,int *resultp) { int rv = 0; if(strcmp(args[0],"set")==0) { VLlist(); *resultp; rv = 1; } else if (strchr(args[0],'=')!=NULL) { *resultp = assign(args[0]); if(*resultp != -1) rv = 1; } else if (strcmp(args[0],"export") == 0) { if(args[1] != NULL && okname(args[1])) { *resultp = VLexport(args[1]); } else *resultp = 1; rv =1; } return rv; }
void rmtgetconn(void) { char *cp; const char *rmt; static struct servent *sp = NULL; static struct passwd *pwd = NULL; char *tuser; int size; int throughput; int on; if (sp == NULL) { sp = getservbyname("shell", "tcp"); if (sp == NULL) { msg("shell/tcp: unknown service\n"); exit(X_STARTUP); } pwd = getpwuid(getuid()); if (pwd == NULL) { msg("who are you?\n"); exit(X_STARTUP); } } if ((cp = strchr(rmtpeer, '@')) != NULL) { tuser = rmtpeer; *cp = '\0'; if (!okname(tuser)) exit(X_STARTUP); rmtpeer = ++cp; } else tuser = pwd->pw_name; if ((rmt = getenv("RMT")) == NULL) rmt = _PATH_RMT; msg("%s", ""); rmtape = rcmd(&rmtpeer, (u_short)sp->s_port, pwd->pw_name, tuser, rmt, &errfd); if (rmtape < 0) { msg("login to %s as %s failed.\n", rmtpeer, tuser); return; } (void)fprintf(stderr, "Connection to %s established.\n", rmtpeer); size = ntrec * TP_BSIZE; if (size > 60 * 1024) /* XXX */ size = 60 * 1024; /* Leave some space for rmt request/response protocol */ size += 2 * 1024; while (size > TP_BSIZE && setsockopt(rmtape, SOL_SOCKET, SO_SNDBUF, &size, sizeof (size)) < 0) size -= TP_BSIZE; (void)setsockopt(rmtape, SOL_SOCKET, SO_RCVBUF, &size, sizeof (size)); throughput = IPTOS_THROUGHPUT; if (setsockopt(rmtape, IPPROTO_IP, IP_TOS, &throughput, sizeof(throughput)) < 0) perror("IP_TOS:IPTOS_THROUGHPUT setsockopt"); on = 1; if (setsockopt(rmtape, IPPROTO_TCP, TCP_NODELAY, &on, sizeof (on)) < 0) perror("TCP_NODELAY setsockopt"); }
static void tolocal(int argc, char **argv) { char *bp, *host = NULL, *suser = NULL; const char *src = NULL; arglist alist; int i, r, sport = -1; memset(&alist, '\0', sizeof(alist)); alist.list = NULL; for (i = 0; i < argc - 1; i++) { free(suser); free(host); free(__UNCONST(src)); r = parse_scp_uri(argv[i], &suser, &host, &sport, &src); if (r == -1) { fmprintf(stderr, "%s: invalid uri\n", argv[i]); ++errs; continue; } if (r != 0) parse_user_host_path(argv[i], &suser, &host, &src); if (suser != NULL && !okname(suser)) { ++errs; continue; } if (!host) { /* Local to local. */ freeargs(&alist); addargs(&alist, "%s", _PATH_CP); if (iamrecursive) addargs(&alist, "-r"); if (pflag) addargs(&alist, "-p"); addargs(&alist, "--"); addargs(&alist, "%s", argv[i]); addargs(&alist, "%s", argv[argc-1]); if (do_local_cmd(&alist)) ++errs; continue; } /* Remote to local. */ xasprintf(&bp, "%s -f %s%s", cmd, *src == '-' ? "-- " : "", src); if (do_cmd(host, suser, sport, bp, &remin, &remout) < 0) { free(bp); ++errs; continue; } free(bp); sink(1, argv + argc - 1); (void) close(remin); remin = remout = -1; } free(suser); free(host); free(__UNCONST(src)); }
int assign(char *str) { char *cp; int rv; cp = strchr(str,'='); *cp = '\0'; rv = (okname (str)?VLstore(str,cp+1):-1); *cp = '='; return rv; }
void rmtgetconn(void) { char *cp; static struct servent *sp = NULL; static struct passwd *pwd = NULL; #ifdef notdef static int on = 1; #endif char *tuser; int size; int maxseg; if (sp == NULL) { sp = getservbyname("shell", "tcp"); if (sp == NULL) errx(1, "shell/tcp: unknown service"); pwd = getpwuid(getuid()); if (pwd == NULL) errx(1, "who are you?"); } if ((cp = strchr(rmtpeer, '@')) != NULL) { tuser = rmtpeer; *cp = '\0'; if (!okname(tuser)) exit(1); rmtpeer = ++cp; } else tuser = pwd->pw_name; rmtape = rcmd(&rmtpeer, (u_short)sp->s_port, pwd->pw_name, tuser, _PATH_RMT, NULL); if (rmtape == -1) exit(1); /* rcmd already printed error message */ size = TP_BSIZE; if (size > 60 * 1024) /* XXX */ size = 60 * 1024; /* Leave some space for rmt request/response protocol */ size += 2 * 1024; while (size > TP_BSIZE && setsockopt(rmtape, SOL_SOCKET, SO_SNDBUF, &size, sizeof (size)) < 0) size -= TP_BSIZE; (void)setsockopt(rmtape, SOL_SOCKET, SO_RCVBUF, &size, sizeof (size)); maxseg = 1024; (void)setsockopt(rmtape, IPPROTO_TCP, TCP_MAXSEG, &maxseg, sizeof (maxseg)); #ifdef notdef if (setsockopt(rmtape, IPPROTO_TCP, TCP_NODELAY, &on, sizeof (on)) < 0) perror("TCP_NODELAY setsockopt"); #endif }
/* * === FUNCTION ====================================================================== * Name: assign * Description: execute name = val And ensure that name is legal * ===================================================================================== */ static int assign (char *str) { int rv; char * cp; cp = strchr(str,'='); *cp = '\0'; rv = okname(str)?VLstore(str,cp+1):-1; return rv; } /* ----- end of function assign ----- */
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 rmtgetconn(void) { char *cp; static struct servent *sp = NULL; static struct passwd *pwd = NULL; static int on = 1; char *tuser, *name; int size; int maxseg; if (sp == NULL) { sp = getservbyname("shell", "tcp"); if (sp == NULL) errx(X_STARTUP, "shell/tcp: unknown service"); pwd = getpwuid(getuid()); if (pwd == NULL) errx(X_STARTUP, "who are you?"); } if ((name = strdup(pwd->pw_name)) == NULL) err(X_STARTUP, "malloc"); if ((cp = strchr(rmtpeer, '@')) != NULL) { tuser = rmtpeer; *cp = '\0'; if (!okname(tuser)) exit(X_STARTUP); rmtpeer = ++cp; } else tuser = name; rmtape = rcmd(&rmtpeer, sp->s_port, name, tuser, _PATH_RMT, NULL); (void)free(name); if (rmtape < 0) return; size = ntrec * TP_BSIZE; if (size > 60 * 1024) /* XXX */ size = 60 * 1024; /* Leave some space for rmt request/response protocol */ size += 2 * 1024; while (size > TP_BSIZE && setsockopt(rmtape, SOL_SOCKET, SO_SNDBUF, &size, sizeof(size)) < 0) size -= TP_BSIZE; (void)setsockopt(rmtape, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size)); maxseg = 1024; (void)setsockopt(rmtape, IPPROTO_TCP, TCP_MAXSEG, &maxseg, sizeof(maxseg)); (void) setsockopt(rmtape, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on)); }
int assign(char* str) { char *ptr; int rv; ptr = strchr(str, '='); *ptr = '\0'; if (okname(str)) rv = VLstore(str, ptr + 1); *ptr = '='; return rv; }
void tolocal(int argc, char **argv) { int i; char *bp, *host, *src, *suser; for (i = 0; i < argc - 1; i++) { int ret; if (!(src = colon(argv[i]))) { /* Local to local. */ ret = asprintf(&bp, "exec %s%s%s %s %s", _PATH_CP, iamrecursive ? " -PR" : "", pflag ? " -p" : "", argv[i], argv[argc - 1]); if (ret == -1) err (1, "malloc"); if (susystem(bp)) ++errs; free(bp); continue; } *src++ = 0; if (*src == 0) src = "."; if ((host = strchr(argv[i], '@')) == NULL) { host = argv[i]; suser = pwd->pw_name; } else { *host++ = 0; suser = argv[i]; if (*suser == '\0') suser = pwd->pw_name; else if (!okname(suser)) continue; } ret = asprintf(&bp, "%s -f %s", cmd, src); if (ret == -1) err (1, "malloc"); if (do_cmd(host, suser, bp, &remin, &remout) < 0) { free(bp); ++errs; continue; } free(bp); sink(1, argv + argc - 1); close(remin); remin = remout = -1; } }
int assign(char *str) /* * purpose: execute name=val AND ensure that name is legal * returns: -1 for illegal lval, or result of VLstore * warning: modifies the string, but retores it to normal */ { char *cp; int rv ; cp = strchr(str,'='); *cp = '\0'; rv = ( okname(str) ? VLstore(str,cp+1) : -1 ); *cp = '='; return rv; }
/* * === FUNCTION ====================================================================== * Name: builtin_command * Description: 1 for build in command, 0 for not * ===================================================================================== */ int builtin_command (char **args, int * resultp) { int rv = 0; if (strcmp(args[0],"set") == 0) { VLlist(); *resultp = 0; rv = 1; }else if (strchr(args[0],'=') != NULL) { *resultp = assign(args[0]); if (*resultp != -1) rv =1; }else if (strcmp(args[0],"export") == 0) { if (args[1]!=NULL&&okname(args[1])) *resultp = VLexport(args[1]); else *resultp = 1; rv = 1; }else if (strcmp(args[0],"cd") == 0) { if (args[1]!= NULL ) { *resultp = VLstore("PWD",args[1]); rv = 1; } }else if (strcmp(args[0],"exit") == 0) { rv = 1; } else if (findCharFromArgv("&",args) == 0) { /* implement '&' char processing, which put the porcess running in back groud */ } return rv; } /* ----- end of function builtin_command ----- */
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); } } }
void toremote(char *targ, int argc, char *argv[]) { int i, tos; char *bp, *host, *src, *suser, *thost, *tuser; *targ++ = 0; if (*targ == 0) targ = period; if ((thost = strchr(argv[argc - 1], '@'))) { /* 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; } for (i = 0; i < argc - 1; i++) { src = colon(argv[i]); if (src) { /* remote to remote */ *src++ = 0; if (*src == 0) src = period; host = strchr(argv[i], '@'); if (host) { *host++ = 0; suser = argv[i]; if (*suser == '\0') suser = pwd->pw_name; else if (!okname(suser)) { ++errs; continue; } if (asprintf(&bp, "%s %s -l %s -n %s %s '%s%s%s:%s'", _PATH_RSH, host, suser, cmd, src, tuser ? tuser : "", tuser ? "@" : "", thost, targ) == -1) err(1, "asprintf"); } else if (asprintf(&bp, "exec %s %s -n %s %s '%s%s%s:%s'", _PATH_RSH, argv[i], cmd, src, tuser ? tuser : "", tuser ? "@" : "", thost, targ) == -1) err(1, "asprintf"); (void)susystem(bp, userid); (void)free(bp); } else { /* local to remote */ if (rem == -1) { if (asprintf(&bp, "%s -t %s", cmd, targ) == -1) err(1, "asprintf"); host = thost; rem = rcmd_af(&host, port, pwd->pw_name, tuser ? tuser : pwd->pw_name, bp, 0, family); if (rem < 0) exit(1); if (family == PF_INET) { tos = IPTOS_THROUGHPUT; if (setsockopt(rem, IPPROTO_IP, IP_TOS, &tos, sizeof(int)) < 0) warn("TOS (ignored)"); } if (response() < 0) exit(1); (void)free(bp); (void)setuid(userid); } source(1, argv+i); } } }
void toremote(char *targ, int argc, char **argv) { char *bp, *host, *src, *suser, *thost, *tuser, *arg; arglist alist; int i; u_int j; memset(&alist, '\0', sizeof(alist)); alist.list = NULL; *targ++ = 0; if (*targ == 0) targ = "."; arg = xstrdup(argv[argc - 1]); if ((thost = strrchr(arg, '@'))) { /* user@host */ *thost++ = 0; tuser = arg; if (*tuser == '\0') tuser = NULL; } else { thost = arg; tuser = NULL; } if (tuser != NULL && !okname(tuser)) { free(arg); return; } for (i = 0; i < argc - 1; i++) { src = colon(argv[i]); if (src && throughlocal) { /* extended remote to remote */ *src++ = 0; if (*src == 0) src = "."; host = strrchr(argv[i], '@'); if (host) { *host++ = 0; host = cleanhostname(host); suser = argv[i]; if (*suser == '\0') suser = pwd->pw_name; else if (!okname(suser)) continue; } else { host = cleanhostname(argv[i]); suser = NULL; } xasprintf(&bp, "%s -f %s%s", cmd, *src == '-' ? "-- " : "", src); if (do_cmd(host, suser, bp, &remin, &remout) < 0) exit(1); free(bp); host = cleanhostname(thost); xasprintf(&bp, "%s -t %s%s", cmd, *targ == '-' ? "-- " : "", targ); if (do_cmd2(host, tuser, bp, remin, remout) < 0) exit(1); free(bp); (void) close(remin); (void) close(remout); remin = remout = -1; } else if (src) { /* standard remote to remote */ freeargs(&alist); addargs(&alist, "%s", ssh_program); addargs(&alist, "-x"); addargs(&alist, "-oClearAllForwardings=yes"); addargs(&alist, "-n"); for (j = 0; j < remote_remote_args.num; j++) { addargs(&alist, "%s", remote_remote_args.list[j]); } *src++ = 0; if (*src == 0) src = "."; host = strrchr(argv[i], '@'); if (host) { *host++ = 0; host = cleanhostname(host); suser = argv[i]; if (*suser == '\0') suser = pwd->pw_name; else if (!okname(suser)) continue; addargs(&alist, "-l"); addargs(&alist, "%s", suser); } else { host = cleanhostname(argv[i]); } addargs(&alist, "--"); addargs(&alist, "%s", host); addargs(&alist, "%s", cmd); addargs(&alist, "%s", src); addargs(&alist, "%s%s%s:%s", tuser ? tuser : "", tuser ? "@" : "", thost, targ); if (do_local_cmd(&alist) != 0) errs = 1; } else { /* local to remote */ if (remin == -1) { xasprintf(&bp, "%s -t %s%s", cmd, *targ == '-' ? "-- " : "", targ); host = cleanhostname(thost); if (do_cmd(host, tuser, bp, &remin, &remout) < 0) exit(1); if (response() < 0) exit(1); free(bp); } source(1, argv + i); } } free(arg); }
void toremote(char *targ, int argc, char **argv) { int i, len; char *bp, *host, *src, *suser, *thost, *tuser, *arg; arglist alist; memset(&alist, '\0', sizeof(alist)); alist.list = NULL; *targ++ = 0; if (*targ == 0) targ = "."; arg = xstrdup(argv[argc - 1]); if ((thost = strrchr(arg, '@'))) { /* user@host */ *thost++ = 0; tuser = arg; if (*tuser == '\0') tuser = NULL; } else { thost = arg; tuser = NULL; } if (tuser != NULL && !okname(tuser)) { xfree(arg); return; } for (i = 0; i < argc - 1; i++) { src = colon(argv[i]); if (src) { /* remote to remote */ freeargs(&alist); addargs(&alist, "%s", ssh_program); if (verbose_mode) addargs(&alist, "-v"); #if 0 // Disabled since dbclient won't understand them // and scp works fine without them. addargs(&alist, "-x"); addargs(&alist, "-oClearAllForwardings yes"); addargs(&alist, "-n"); #endif *src++ = 0; if (*src == 0) src = "."; host = strrchr(argv[i], '@'); if (host) { *host++ = 0; host = cleanhostname(host); suser = argv[i]; if (*suser == '\0') suser = pwd->pw_name; else if (!okname(suser)) continue; addargs(&alist, "-l"); addargs(&alist, "%s", suser); } else { host = cleanhostname(argv[i]); } addargs(&alist, "%s", host); addargs(&alist, "%s", cmd); addargs(&alist, "%s", src); addargs(&alist, "%s%s%s:%s", tuser ? tuser : "", tuser ? "@" : "", thost, targ); if (do_local_cmd(&alist) != 0) errs = 1; } else { /* local to remote */ if (remin == -1) { len = strlen(targ) + CMDNEEDS + 20; bp = xmalloc(len); (void) snprintf(bp, len, "%s -t %s", cmd, targ); host = cleanhostname(thost); if (do_cmd(host, tuser, bp, &remin, &remout, argc) < 0) exit(1); if (response() < 0) exit(1); (void) xfree(bp); } source(1, argv + i); } } }
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, len, tos; char *bp, *host, *src, *suser, *thost, *tuser; *targ++ = 0; if (*targ == 0) targ = "."; if ((thost = strchr(argv[argc - 1], '@'))) { /* 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; } for (i = 0; i < argc - 1; i++) { src = colon(argv[i]); if (src) { /* remote to remote */ *src++ = 0; if (*src == 0) src = "."; 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; suser = argv[i]; if (*suser == '\0') suser = pwd->pw_name; else if (!okname(suser)) 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 (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, userid); (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; #ifdef KERBEROS if (use_kerberos) rem = kerberos(&host, bp, pwd->pw_name, tuser ? tuser : pwd->pw_name); else #endif rem = rcmd(&host, port, pwd->pw_name, tuser ? tuser : pwd->pw_name, bp, 0); if (rem < 0) exit(1); tos = IPTOS_THROUGHPUT; if (setsockopt(rem, IPPROTO_IP, IP_TOS, &tos, sizeof(int)) < 0) warn("TOS (ignored)"); if (response() < 0) exit(1); (void)free(bp); (void)setuid(userid); } source(1, argv+i); } } }
void toremote(int argc, char **argv) { char *suser = NULL, *host = NULL; const char *src = NULL; char *bp, *tuser, *thost; const char *targ; int sport = -1, tport = -1; arglist alist; int i, r; u_int j; memset(&alist, '\0', sizeof(alist)); alist.list = NULL; /* Parse target */ r = parse_scp_uri(argv[argc - 1], &tuser, &thost, &tport, &targ); if (r == -1) { fmprintf(stderr, "%s: invalid uri\n", argv[argc - 1]); ++errs; goto out; } if (r != 0) { if (parse_user_host_path(argv[argc - 1], &tuser, &thost, &targ) == -1) { fmprintf(stderr, "%s: invalid target\n", argv[argc - 1]); ++errs; goto out; } } if (tuser != NULL && !okname(tuser)) { ++errs; goto out; } /* Parse source files */ for (i = 0; i < argc - 1; i++) { free(suser); free(host); free(__UNCONST(src)); r = parse_scp_uri(argv[i], &suser, &host, &sport, &src); if (r == -1) { fmprintf(stderr, "%s: invalid uri\n", argv[i]); ++errs; continue; } if (r != 0) { parse_user_host_path(argv[i], &suser, &host, &src); } if (suser != NULL && !okname(suser)) { ++errs; continue; } if (host && throughlocal) { /* extended remote to remote */ xasprintf(&bp, "%s -f %s%s", cmd, *src == '-' ? "-- " : "", src); if (do_cmd(host, suser, sport, bp, &remin, &remout) < 0) exit(1); free(bp); xasprintf(&bp, "%s -t %s%s", cmd, *targ == '-' ? "-- " : "", targ); if (do_cmd2(thost, tuser, tport, bp, remin, remout) < 0) exit(1); free(bp); (void) close(remin); (void) close(remout); remin = remout = -1; } else if (host) { /* standard remote to remote */ if (tport != -1 && tport != SSH_DEFAULT_PORT) { /* This would require the remote support URIs */ fatal("target port not supported with two " "remote hosts without the -3 option"); } freeargs(&alist); addargs(&alist, "%s", ssh_program); addargs(&alist, "-x"); addargs(&alist, "-oClearAllForwardings=yes"); addargs(&alist, "-n"); for (j = 0; j < remote_remote_args.num; j++) { addargs(&alist, "%s", remote_remote_args.list[j]); } if (sport != -1) { addargs(&alist, "-p"); addargs(&alist, "%d", sport); } if (suser) { addargs(&alist, "-l"); addargs(&alist, "%s", suser); } addargs(&alist, "--"); addargs(&alist, "%s", host); addargs(&alist, "%s", cmd); addargs(&alist, "%s", src); addargs(&alist, "%s%s%s:%s", tuser ? tuser : "", tuser ? "@" : "", thost, targ); if (do_local_cmd(&alist) != 0) errs = 1; } else { /* local to remote */ if (remin == -1) { xasprintf(&bp, "%s -t %s%s", cmd, *targ == '-' ? "-- " : "", targ); if (do_cmd(thost, tuser, tport, bp, &remin, &remout) < 0) exit(1); if (response() < 0) exit(1); free(bp); } source(1, argv + i); } } out: free(tuser); free(thost); free(__UNCONST(targ)); free(suser); free(host); free(__UNCONST(src)); }
/* * Create a connection to the rdist server on the machine rhost. * Return 0 if the connection fails or 1 if it succeeds. */ static int makeconn(char *rhost) { char *ruser, *cp; static char *cur_host = NULL; extern char *locuser; extern int64_t min_freefiles, min_freespace; extern char *remotemsglist; char tuser[BUFSIZ], buf[BUFSIZ]; u_char respbuff[BUFSIZ]; int n; debugmsg(DM_CALL, "makeconn(%s)", rhost); /* * See if we're already connected to this host */ if (cur_host != NULL && rem_w >= 0) { if (strcmp(cur_host, rhost) == 0) return(1); closeconn(); } /* * Determine remote user and current host names */ cur_host = rhost; cp = strchr(rhost, '@'); if (cp != NULL) { char c = *cp; *cp = CNULL; (void) strlcpy((char *)tuser, rhost, sizeof(tuser)); *cp = c; rhost = cp + 1; ruser = tuser; if (*ruser == CNULL) ruser = locuser; else if (!okname(ruser)) return(0); } else ruser = locuser; if (!IS_ON(options, DO_QUIET)) message(MT_VERBOSE, "updating host %s", rhost); (void) snprintf(buf, sizeof(buf), "%.*s -S", (int)(sizeof(buf)-5), path_rdistd); if ((rem_r = rem_w = remotecmd(rhost, locuser, ruser, buf)) < 0) return(0); /* * First thing received should be S_VERSION */ respbuff[0] = '\0'; n = remline(respbuff, sizeof(respbuff), TRUE); if (n <= 0 || respbuff[0] != S_VERSION) { if (n > 0) error("Unexpected input from server: \"%s\".", respbuff); else error("No input from server."); closeconn(); return(0); } /* * For future compatibility we check to see if the server * sent it's version number to us. If it did, we use it, * otherwise, we send our version number to the server and let * it decide if it can handle our protocol version. */ if (respbuff[1] == CNULL) { /* * The server wants us to send it our version number */ (void) sendcmd(S_VERSION, "%d", VERSION); if (response() < 0) return(0); } else { /* * The server sent it's version number to us */ proto_version = atoi(&respbuff[1]); if (proto_version != VERSION) { fatalerr( "Server version (%d) is not the same as local version (%d).", proto_version, VERSION); return(0); } } /* * Send config commands */ if (host[0]) { (void) sendcmd(C_SETCONFIG, "%c%s", SC_HOSTNAME, host); if (response() < 0) return(0); } if (min_freespace) { (void) sendcmd(C_SETCONFIG, "%c%lld", SC_FREESPACE, min_freespace); if (response() < 0) return(0); } if (min_freefiles) { (void) sendcmd(C_SETCONFIG, "%c%lld", SC_FREEFILES, min_freefiles); if (response() < 0) return(0); } if (remotemsglist) { (void) sendcmd(C_SETCONFIG, "%c%s", SC_LOGGING, remotemsglist); if (response() < 0) return(0); } if (strcmp(defowner, "bin") != 0) { (void) sendcmd(C_SETCONFIG, "%c%s", SC_DEFOWNER, defowner); if (response() < 0) return(0); } if (strcmp(defgroup, "bin") != 0) { (void) sendcmd(C_SETCONFIG, "%c%s", SC_DEFGROUP, defgroup); if (response() < 0) return(0); } return(1); }