From: Andrew Tridgell Date: Sun, 5 Apr 1998 06:07:37 +0000 (+0000) Subject: in local->local mode don't use exec to start the "remote" rsync, X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/commitdiff_plain/366345fe05a44b2d08aedb1c8e4b6d7ce1aedeeb in local->local mode don't use exec to start the "remote" rsync, instead just fork() --- diff --git a/main.c b/main.c index 33496cc3..41d8a6b0 100644 --- a/main.c +++ b/main.c @@ -61,7 +61,7 @@ int io_error = 0; extern int csum_length; int am_server = 0; -static int sender; +int am_sender; int recurse = 0; static void usage(FILE *f); @@ -73,7 +73,7 @@ static void report(int f) if (!verbose) return; - if (am_server && sender) { + if (am_server && am_sender) { write_longint(f,read_total()); write_longint(f,write_total()); write_longint(f,total_size); @@ -81,7 +81,7 @@ static void report(int f) return; } - if (sender) { + if (am_sender) { in = read_total(); out = write_total(); tsize = total_size; @@ -115,7 +115,7 @@ static void server_options(char **args,int *argc) args[ac++] = "--server"; - if (!sender) + if (!am_sender) args[ac++] = "--sender"; x = 1; @@ -202,65 +202,70 @@ static void server_options(char **args,int *argc) static int do_cmd(char *cmd,char *machine,char *user,char *path,int *f_in,int *f_out) { - char *args[100]; - int i,argc=0, ret; - char *tok,*dir=NULL; - - if (!local_server) { - if (!cmd) - cmd = getenv(RSYNC_RSH_ENV); - if (!cmd) - cmd = RSYNC_RSH; - cmd = strdup(cmd); - if (!cmd) - goto oom; - - for (tok=strtok(cmd," ");tok;tok=strtok(NULL," ")) { - args[argc++] = tok; - } + char *args[100]; + int i,argc=0, ret; + char *tok,*dir=NULL; + + if (!local_server) { + if (!cmd) + cmd = getenv(RSYNC_RSH_ENV); + if (!cmd) + cmd = RSYNC_RSH; + cmd = strdup(cmd); + if (!cmd) + goto oom; + + for (tok=strtok(cmd," ");tok;tok=strtok(NULL," ")) { + args[argc++] = tok; + } #if HAVE_REMSH - /* remsh (on HPUX) takes the arguments the other way around */ - args[argc++] = machine; - if (user) { - args[argc++] = "-l"; - args[argc++] = user; - } + /* remsh (on HPUX) takes the arguments the other way around */ + args[argc++] = machine; + if (user) { + args[argc++] = "-l"; + args[argc++] = user; + } #else - if (user) { - args[argc++] = "-l"; - args[argc++] = user; - } - args[argc++] = machine; + if (user) { + args[argc++] = "-l"; + args[argc++] = user; + } + args[argc++] = machine; #endif - } - args[argc++] = rsync_path; + args[argc++] = rsync_path; - server_options(args,&argc); + server_options(args,&argc); + } - args[argc++] = "."; + args[argc++] = "."; - if (path && *path) - args[argc++] = path; + if (path && *path) + args[argc++] = path; - args[argc] = NULL; + args[argc] = NULL; - if (verbose > 3) { - fprintf(FINFO,"cmd="); - for (i=0;i 3) { + fprintf(FINFO,"cmd="); + for (i=0;i 3) fprintf(FINFO,"parent=%d child=%d sender=%d recurse=%d\n", - (int)getpid(),pid,sender,recurse); + (int)getpid(),pid,am_sender,recurse); - if (sender) { + if (am_sender) { if (cvs_exclude) add_cvs_excludes(); if (delete_mode) diff --git a/util.c b/util.c index 013d62ad..1a041a3f 100644 --- a/util.c +++ b/util.c @@ -159,6 +159,57 @@ int piped_child(char **command,int *f_in,int *f_out) return pid; } +int local_child(int argc, char **argv,int *f_in,int *f_out) +{ + int pid; + int to_child_pipe[2]; + int from_child_pipe[2]; + + if (pipe(to_child_pipe) < 0 || + pipe(from_child_pipe) < 0) { + fprintf(FERROR,"pipe: %s\n",strerror(errno)); + exit_cleanup(1); + } + + + pid = do_fork(); + if (pid < 0) { + fprintf(FERROR,"fork: %s\n",strerror(errno)); + exit_cleanup(1); + } + + if (pid == 0) { + extern int am_sender; + extern int am_server; + + am_sender = !am_sender; + am_server = 1; + + if (dup2(to_child_pipe[0], STDIN_FILENO) < 0 || + close(to_child_pipe[1]) < 0 || + close(from_child_pipe[0]) < 0 || + dup2(from_child_pipe[1], STDOUT_FILENO) < 0) { + fprintf(FERROR,"Failed to dup/close : %s\n",strerror(errno)); + exit_cleanup(1); + } + if (to_child_pipe[0] != STDIN_FILENO) close(to_child_pipe[0]); + if (from_child_pipe[1] != STDOUT_FILENO) close(from_child_pipe[1]); + start_server(argc, argv); + } + + if (close(from_child_pipe[1]) < 0 || + close(to_child_pipe[0]) < 0) { + fprintf(FERROR,"Failed to close : %s\n",strerror(errno)); + exit_cleanup(1); + } + + *f_in = from_child_pipe[0]; + *f_out = to_child_pipe[1]; + + return pid; +} + + void out_of_memory(char *str) {