X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/f6b8d591f77056e1b0bf103c28af4432d6332234..8dd99390f59826f37d3e6d485cfbd0d150623078:/main.c diff --git a/main.c b/main.c index 29ee6ada..f1c2d092 100644 --- a/main.c +++ b/main.c @@ -31,6 +31,7 @@ extern int am_server; extern int am_sender; extern int am_daemon; extern int verbose; +extern int protocol_version; /* there's probably never more than at most 2 outstanding child processes, * but set it higher just in case. @@ -82,7 +83,6 @@ static void report(int f) { time_t t = time(NULL); extern int do_stats; - extern int remote_version; int send_stats; if (do_stats && verbose > 1) { @@ -96,7 +96,7 @@ static void report(int f) if (f == -1 || !am_sender) return; } - send_stats = verbose || (remote_version >= 20); + send_stats = verbose || protocol_version >= 20; if (am_server) { if (am_sender && send_stats) { int64 w; @@ -241,8 +241,15 @@ 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 == -1) { + char *cp = strrchr(cmd, '/'); + if (cp) + cp++; + else + cp = cmd; + if (strcmp(cp, "rsh") == 0 || strcmp(cp, "remsh") == 0) + blocking_io = 1; + } server_options(args,&argc); @@ -285,7 +292,7 @@ oom: static char *get_local_name(struct file_list *flist,char *name) { STRUCT_STAT st; - int len; + int e; extern int orig_umask; if (verbose > 2) @@ -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; @@ -311,13 +318,12 @@ static char *get_local_name(struct file_list *flist,char *name) return name; } - len = strlen(name); - if ((len <= 1 || name[len-1] != '/') && flist->count <= 1) + if (flist->count <= 1 && ((e = strlen(name)) <= 1 || name[e-1] != '/')) 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) @@ -325,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); } @@ -343,13 +349,13 @@ static void do_server_sender(int f_in, int f_out, int argc,char *argv[]) char *dir = argv[0]; extern int relative_paths; extern int recurse; - extern int remote_version; if (verbose > 2) 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--; @@ -377,7 +383,7 @@ static void do_server_sender(int f_in, int f_out, int argc,char *argv[]) send_files(flist,f_out,f_in); io_flush(); report(f_out); - if (remote_version >= 24) { + if (protocol_version >= 24) { /* final goodbye message */ read_int(f_in); } @@ -396,7 +402,6 @@ static int do_recv(int f_in,int f_out,struct file_list *flist,char *local_name) extern int delete_after; extern int recurse; extern int delete_mode; - extern int remote_version; if (preserve_hard_links) init_hard_links(flist); @@ -457,7 +462,7 @@ static int do_recv(int f_in,int f_out,struct file_list *flist,char *local_name) read_int(recv_pipe[0]); close(recv_pipe[0]); - if (remote_version >= 24) { + if (protocol_version >= 24) { /* send a final goodbye message */ write_int(f_out, -1); } @@ -497,8 +502,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); } } @@ -547,7 +552,6 @@ int child_main(int argc, char *argv[]) void start_server(int f_in, int f_out, int argc, char *argv[]) { extern int cvs_exclude; - extern int remote_version; extern int read_batch; setup_protocol(f_out, f_in); @@ -555,7 +559,7 @@ void start_server(int f_in, int f_out, int argc, char *argv[]) set_nonblocking(f_in); set_nonblocking(f_out); - if (remote_version >= 23) + if (protocol_version >= 23) io_start_multiplex_out(f_out); if (am_sender) { @@ -581,7 +585,6 @@ int client_run(int f_in, int f_out, pid_t pid, int argc, char *argv[]) struct file_list *flist = NULL; int status = 0, status2 = 0; char *local_name = NULL; - extern int remote_version; extern pid_t cleanup_child_pid; extern int write_batch; extern int read_batch; @@ -596,7 +599,7 @@ int client_run(int f_in, int f_out, pid_t pid, int argc, char *argv[]) setup_protocol(f_out,f_in); - if (remote_version >= 23) + if (protocol_version >= 23) io_start_multiplex_in(f_in); if (am_sender) { @@ -615,7 +618,7 @@ int client_run(int f_in, int f_out, pid_t pid, int argc, char *argv[]) rprintf(FINFO,"file list sent\n"); send_files(flist,f_out,f_in); - if (remote_version >= 24) { + if (protocol_version >= 24) { /* final goodbye message */ read_int(f_in); } @@ -878,17 +881,20 @@ static int start_client(int argc, char *argv[]) } -static RETSIGTYPE sigusr1_handler(int UNUSED(val)) { +static RETSIGTYPE sigusr1_handler(UNUSED(int val)) +{ exit_cleanup(RERR_SIGNAL); } -static RETSIGTYPE sigusr2_handler(int UNUSED(val)) { +static RETSIGTYPE sigusr2_handler(UNUSED(int val)) +{ extern int log_got_error; if (log_got_error) _exit(RERR_PARTIAL); _exit(0); } -static RETSIGTYPE sigchld_handler(int UNUSED(val)) { +static RETSIGTYPE sigchld_handler(UNUSED(int val)) +{ #ifdef WNOHANG int cnt, status; pid_t pid; @@ -946,7 +952,7 @@ const char *get_panic_action(void) * should just look at the environment variable, but I'm a bit leery * of a signal sending us into a busy loop. **/ -static RETSIGTYPE rsync_panic_handler(int UNUSED(whatsig)) +static RETSIGTYPE rsync_panic_handler(UNUSED(int whatsig)) { char cmd_buf[300]; int ret; @@ -1057,6 +1063,5 @@ int main(int argc,char *argv[]) else exit_cleanup(ret); - exit(ret); - /* NOTREACHED */ + return ret; }