X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/d04e9c51b4bc8e0fc1c7065553dcd3ac73a0ae40..d17e1dd2dae6bfd9e2e147a0dd3039848dd43abc:/main.c diff --git a/main.c b/main.c index 25cd1064..1b07eee0 100644 --- a/main.c +++ b/main.c @@ -171,7 +171,7 @@ static void show_malloc_stats(void) mi = mallinfo(); - rprintf(FINFO, RSYNC_NAME "[%d] (%s%s%s) heap statistics:\n", + rprintf(FINFO, "\n" RSYNC_NAME "[%d] (%s%s%s) heap statistics:\n", getpid(), am_server ? "server " : "", am_daemon ? "daemon " : "", @@ -205,8 +205,9 @@ static pid_t do_cmd(char *cmd,char *machine,char *user,char *path,int *f_in,int extern int read_batch; if (!read_batch && !local_server) { + char *rsh_env = getenv(RSYNC_RSH_ENV); if (!cmd) - cmd = getenv(RSYNC_RSH_ENV); + cmd = rsh_env; if (!cmd) cmd = RSYNC_RSH; cmd = strdup(cmd); @@ -218,7 +219,7 @@ static pid_t do_cmd(char *cmd,char *machine,char *user,char *path,int *f_in,int } /* check to see if we've already been given '-l user' in - the remote-shell command */ + * the remote-shell command */ for (i = 0; i < argc-1; i++) { if (!strcmp(args[i], "-l") && args[i+1][0] != '-') dash_l_set = 1; @@ -241,11 +242,17 @@ static pid_t do_cmd(char *cmd,char *machine,char *user,char *path,int *f_in,int args[argc++] = rsync_path; - if ((blocking_io == -1) && (strcmp(cmd, RSYNC_RSH) == 0)) - blocking_io = 1; + 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); - } args[argc++] = "."; @@ -298,8 +305,8 @@ static char *get_local_name(struct file_list *flist,char *name) if (do_stat(name,&st) == 0) { if (S_ISDIR(st.st_mode)) { if (!push_dir(name, 0)) { - rprintf(FERROR,"push_dir %s : %s (1)\n", - name,strerror(errno)); + rprintf(FERROR, "push_dir %s failed: %s (1)\n", + full_fname(name), strerror(errno)); exit_cleanup(RERR_FILESELECT); } return NULL; @@ -315,8 +322,8 @@ static char *get_local_name(struct file_list *flist,char *name) return name; if (do_mkdir(name,0777 & ~orig_umask) != 0) { - rprintf(FERROR, RSYNC_NAME ": mkdir %s: %s\n", - name, strerror(errno)); + rprintf(FERROR, "mkdir %s failed: %s\n", + full_fname(name), strerror(errno)); exit_cleanup(RERR_FILEIO); } else { if (verbose > 0) @@ -324,8 +331,8 @@ static char *get_local_name(struct file_list *flist,char *name) } if (!push_dir(name, 0)) { - rprintf(FERROR, RSYNC_NAME ": push_dir %s: %s\n", - name, strerror(errno)); + rprintf(FERROR, "push_dir %s failed: %s (2)\n", + full_fname(name), strerror(errno)); exit_cleanup(RERR_FILESELECT); } @@ -347,7 +354,8 @@ static void do_server_sender(int f_in, int f_out, int argc,char *argv[]) rprintf(FINFO,"server_sender starting pid=%d\n",(int)getpid()); if (!relative_paths && !push_dir(dir, 0)) { - rprintf(FERROR,"push_dir %s: %s (3)\n",dir,strerror(errno)); + rprintf(FERROR, "push_dir %s failed: %s (3)\n", + full_fname(dir), strerror(errno)); exit_cleanup(RERR_FILESELECT); } argc--; @@ -372,13 +380,15 @@ static void do_server_sender(int f_in, int f_out, int argc,char *argv[]) exit_cleanup(0); } + io_start_buffering_in(f_in); + io_start_buffering_out(f_out); send_files(flist,f_out,f_in); io_flush(); report(f_out); if (protocol_version >= 24) { /* final goodbye message */ - read_int(f_in); - } + read_int(f_in); + } io_flush(); exit_cleanup(0); } @@ -436,8 +446,8 @@ static int do_recv(int f_in,int f_out,struct file_list *flist,char *local_name) close(recv_pipe[1]); io_flush(); /* finally we go to sleep until our parent kills us - with a USR2 signal. We sleep for a short time as on - some OSes a signal won't interrupt a sleep! */ + * with a USR2 signal. We sleep for a short time as on + * some OSes a signal won't interrupt a sleep! */ while (msleep(20)) ; } @@ -446,7 +456,7 @@ static int do_recv(int f_in,int f_out,struct file_list *flist,char *local_name) close(error_pipe[1]); if (f_in != f_out) close(f_in); - io_start_buffering(f_out); + io_start_buffering_out(f_out); io_set_error_fd(error_pipe[0]); @@ -494,12 +504,13 @@ static void do_server_recv(int f_in, int f_out, int argc,char *argv[]) argc--; argv++; if (!am_daemon && !push_dir(dir, 0)) { - rprintf(FERROR,"push_dir %s : %s (4)\n", - dir,strerror(errno)); + rprintf(FERROR, "push_dir %s failed: %s (4)\n", + full_fname(dir), strerror(errno)); exit_cleanup(RERR_FILESELECT); } } + io_start_buffering_in(f_in); if (delete_mode && !delete_excluded) recv_exclude_list(f_in); @@ -598,18 +609,22 @@ int client_run(int f_in, int f_out, pid_t pid, int argc, char *argv[]) extern int cvs_exclude; extern int delete_mode; extern int delete_excluded; + io_start_buffering_out(f_out); if (cvs_exclude) add_cvs_excludes(); if (delete_mode && !delete_excluded) send_exclude_list(f_out); if (remote_filesfrom_file) filesfrom_fd = f_in; - if (!read_batch) /* dw -- don't write to pipe */ + if (!read_batch) /* don't write to pipe */ flist = send_file_list(f_out,argc,argv); if (verbose > 3) rprintf(FINFO,"file list sent\n"); + io_flush(); + io_start_buffering_out(f_out); send_files(flist,f_out,f_in); + io_flush(); if (protocol_version >= 24) { /* final goodbye message */ read_int(f_in); @@ -621,6 +636,7 @@ int client_run(int f_in, int f_out, pid_t pid, int argc, char *argv[]) wait_process(pid, &status); } report(-1); + io_flush(); exit_cleanup(status); } @@ -855,7 +871,7 @@ static int start_client(int argc, char *argv[]) &f_in,&f_out); /* if we're running an rsync server on the remote host over a - remote shell command, we need to do the RSYNCD protocol first */ + * remote shell command, we need to do the RSYNCD protocol first */ if (daemon_over_rsh) { int tmpret; tmpret = start_inband_exchange(shell_user, shell_path, @@ -897,14 +913,14 @@ static RETSIGTYPE sigchld_handler(UNUSED(int val)) * zombie children, maybe that's why he did it. */ while ((pid = waitpid(-1, &status, WNOHANG)) > 0) { - /* save the child's exit status */ - for (cnt = 0; cnt < MAXCHILDPROCS; cnt++) { - if (pid_stat_table[cnt].pid == 0) { - pid_stat_table[cnt].pid = pid; - pid_stat_table[cnt].status = status; - break; - } - } + /* save the child's exit status */ + for (cnt = 0; cnt < MAXCHILDPROCS; cnt++) { + if (pid_stat_table[cnt].pid == 0) { + pid_stat_table[cnt].pid = pid; + pid_stat_table[cnt].status = status; + break; + } + } } #endif } @@ -995,7 +1011,7 @@ int main(int argc,char *argv[]) } /* we set a 0 umask so that correct file permissions can be - carried across */ + * carried across */ orig_umask = (int)umask(0); if (!parse_arguments(&argc, (const char ***) &argv, 1)) { @@ -1014,9 +1030,9 @@ int main(int argc,char *argv[]) signal(SIGPIPE, SIG_IGN); /* Initialize push_dir here because on some old systems getcwd - (implemented by forking "pwd" and reading its output) doesn't - work when there are other child processes. Also, on all systems - that implement getcwd that way "pwd" can't be found after chroot. */ + * (implemented by forking "pwd" and reading its output) doesn't + * work when there are other child processes. Also, on all systems + * that implement getcwd that way "pwd" can't be found after chroot. */ push_dir(NULL,0); if (write_batch && !am_server) {