X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/92d021488ec06524f7ed6a527c39f2753f4a9fd2..73b9b90a0b548d1177d2bf004c800ae6d9926a1f:/main.c diff --git a/main.c b/main.c index 59550013..de5bc489 100644 --- a/main.c +++ b/main.c @@ -70,10 +70,10 @@ extern int sock_f_out; extern int filesfrom_fd; extern int connect_timeout; extern int send_msgs_to_gen; +extern dev_t filesystem_dev; extern pid_t cleanup_child_pid; extern size_t bwlimit_writemax; extern unsigned int module_dirlen; -extern BOOL we_send_keepalive_messages; extern BOOL flist_receiving_enabled; extern BOOL shutting_down; extern struct stats stats; @@ -131,7 +131,7 @@ static void show_malloc_stats(void); pid_t wait_process(pid_t pid, int *status_ptr, int flags) { pid_t waited_pid; - + do { waited_pid = waitpid(pid, status_ptr, flags); } while (waited_pid == -1 && errno == EINTR); @@ -494,7 +494,11 @@ static pid_t do_cmd(char *cmd, char *machine, char *user, char **remote_argv, in rprintf(FERROR, "internal: args[] overflowed in do_cmd()\n"); exit_cleanup(RERR_SYNTAX); } - args[argc++] = *remote_argv++; + if (**remote_argv == '-') { + if (asprintf(args + argc++, "./%s", *remote_argv++) < 0) + out_of_memory("do_cmd"); + } else + args[argc++] = *remote_argv++; remote_argc--; } } @@ -577,6 +581,10 @@ static char *get_local_name(struct file_list *flist, char *dest_path) if (!dest_path || list_only) return NULL; + /* Treat an empty string as a copy into the current directory. */ + if (!*dest_path) + dest_path = "."; + if (daemon_filter_list.head) { char *slash = strrchr(dest_path, '/'); if (slash && (slash[1] == '\0' || (slash[1] == '.' && slash[2] == '\0'))) @@ -603,6 +611,7 @@ static char *get_local_name(struct file_list *flist, char *dest_path) full_fname(dest_path)); exit_cleanup(RERR_FILESELECT); } + filesystem_dev = st.st_dev; /* ensures --force works right w/-x */ return NULL; } if (file_total > 1) { @@ -640,7 +649,7 @@ static char *get_local_name(struct file_list *flist, char *dest_path) exit_cleanup(RERR_SYNTAX); } - if (mkdir_defmode(dest_path) != 0) { + if (do_mkdir(dest_path, ACCESSPERMS) != 0) { rsyserr(FERROR, errno, "mkdir %s failed", full_fname(dest_path)); exit_cleanup(RERR_FILEIO); @@ -765,8 +774,6 @@ static void do_server_sender(int f_in, int f_out, int argc, char *argv[]) struct file_list *flist; char *dir = argv[0]; - we_send_keepalive_messages = io_timeout != 0 && protocol_version < 31; - if (DEBUG_GTE(SEND, 1)) { rprintf(FINFO, "server_sender starting pid=%ld\n", (long)getpid()); @@ -907,7 +914,6 @@ static int do_recv(int f_in, int f_out, char *local_name) } am_generator = 1; - we_send_keepalive_messages = io_timeout != 0; flist_receiving_enabled = True; io_end_multiplex_in(MPLX_SWITCHING); @@ -1112,7 +1118,6 @@ int client_run(int f_in, int f_out, pid_t pid, int argc, char *argv[]) if (am_sender) { keep_dirlinks = 0; /* Must be disabled on the sender. */ - we_send_keepalive_messages = io_timeout != 0 && protocol_version < 31; if (always_checksum && (log_format_has(stdout_format, 'C') @@ -1526,9 +1531,10 @@ int main(int argc,char *argv[]) exit_cleanup(RERR_SYNTAX); } - /* we set a 0 umask so that correct file permissions can be - * carried across */ - orig_umask = umask(0); + /* Get the umask for use in permission calculations. We no longer set + * it to zero; that is ugly and pointless now that all the callers that + * relied on it have been reeducated to work with default ACLs. */ + umask(orig_umask = umask(0)); #if defined CONFIG_LOCALE && defined HAVE_SETLOCALE setlocale(LC_CTYPE, "");