/* Start the remote process (server) with bi-directional pipe. */ pid_t do_cmd(const char *cmd) { char *args[100]; int i,argc=0; pid_t ret; char *tok,*dir=NULL; int f_in, f_out; if (!cmd) { g_warning("No command in do_cmd. Sorry, can't recover."); return 0; } cmd = g_strdup(cmd); for (tok=strtok((char *)cmd," "); tok; tok=strtok(NULL," ")) { args[argc++] = tok; } args[argc] = NULL; if(int_option(kOption_verbose) & VERBOSE_FLOW_PLUS) { fprintf(stderr,"cmd="); for (i=0;i<argc;i++) fprintf(stderr,"%s ",args[i]); fprintf(stderr,"\n"); } ret = piped_child(args, &f_in, &f_out); io_register_fd_pair(f_in, f_out); if (dir) free(dir); return ret; }
int run_piped (int *tofdp, int *fromfdp) { run_add_arg (NULL); return piped_child (run_argv, tofdp, fromfdp, false); }
/* Start the remote shell. cmd may be NULL to use the default. */ static pid_t do_cmd(char *cmd, char *machine, char *user, char *path, int *f_in, int *f_out) { int i, argc = 0; char *args[MAX_ARGS]; pid_t ret; char *tok, *dir = NULL; int dash_l_set = 0; if (!read_batch && !local_server) { char *rsh_env = getenv(RSYNC_RSH_ENV); if (!cmd) cmd = rsh_env; if (!cmd) cmd = RSYNC_RSH; cmd = strdup(cmd); if (!cmd) goto oom; for (tok = strtok(cmd, " "); tok; tok = strtok(NULL, " ")) { /* Comparison leaves rooms for server_options(). */ if (argc >= MAX_ARGS - MAX_SERVER_ARGS) { rprintf(FERROR, "internal: args[] overflowed in do_cmd()\n"); exit_cleanup(RERR_SYNTAX); } args[argc++] = tok; } /* check to see if we've already been given '-l user' in * the remote-shell command */ for (i = 0; i < argc-1; i++) { if (!strcmp(args[i], "-l") && args[i+1][0] != '-') dash_l_set = 1; } #ifdef HAVE_REMSH /* remsh (on HPUX) takes the arguments the other way around */ args[argc++] = machine; if (user && !(daemon_over_rsh && dash_l_set)) { args[argc++] = "-l"; args[argc++] = user; } #else if (user && !(daemon_over_rsh && dash_l_set)) { args[argc++] = "-l"; args[argc++] = user; } args[argc++] = machine; #endif args[argc++] = rsync_path; if (blocking_io < 0) { char *cp; if ((cp = strrchr(cmd, '/')) != NULL) cp++; else cp = cmd; if (strcmp(cp, "rsh") == 0 || strcmp(cp, "remsh") == 0) blocking_io = 1; } server_options(args,&argc); if (argc >= MAX_ARGS - 2) { rprintf(FERROR, "internal: args[] overflowed in do_cmd()\n"); exit_cleanup(RERR_SYNTAX); } } args[argc++] = "."; if (!daemon_over_rsh && path && *path) args[argc++] = path; args[argc] = NULL; if (verbose > 3) { rprintf(FINFO,"cmd="); for (i = 0; i < argc; i++) rprintf(FINFO, "%s ", safe_fname(args[i])); rprintf(FINFO,"\n"); } if (read_batch) { int from_gen_pipe[2]; if (fd_pair(from_gen_pipe) < 0) { rsyserr(FERROR, errno, "pipe"); exit_cleanup(RERR_IPC); } batch_gen_fd = from_gen_pipe[0]; *f_out = from_gen_pipe[1]; *f_in = batch_fd; ret = -1; /* no child pid */ } else if (local_server) { /* If the user didn't request --[no-]whole-file, force * it on, but only if we're not batch processing. */ if (whole_file < 0 && !write_batch) whole_file = 1; ret = local_child(argc, args, f_in, f_out, child_main); } else ret = piped_child(args,f_in,f_out); if (dir) free(dir); return ret; oom: out_of_memory("do_cmd"); return 0; /* not reached */ }