X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/d04e9c51b4bc8e0fc1c7065553dcd3ac73a0ae40..ab304c268c7d3bece093eb65b0dcf1fd579988ae:/main.c diff --git a/main.c b/main.c index 25cd1064..a7cf981a 100644 --- a/main.c +++ b/main.c @@ -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,21 @@ 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 = getenv(RSYNC_RSH_IO_ENV); + if (rsh_env && cp && strcmp(cmd, rsh_env) == 0) + blocking_io = *cp == 'b' || *cp == 'B'; + else { + 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 +309,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 +326,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 +335,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 +358,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--; @@ -436,8 +448,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)) ; } @@ -494,8 +506,8 @@ 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); } } @@ -855,7 +867,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 +909,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 +1007,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 +1026,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) {