X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/9a54a640f74dcaeb03ef99799a5320b3eb77f7ec..b9cc2d4c868df195878f22dd1c5e9f9d21451971:/main.c diff --git a/main.c b/main.c index 66412916..16b283cd 100644 --- a/main.c +++ b/main.c @@ -70,6 +70,7 @@ 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; @@ -130,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); @@ -493,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--; } } @@ -576,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'))) @@ -602,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) { @@ -639,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); @@ -1303,6 +1313,9 @@ static int start_client(int argc, char *argv[]) remote_argc = argc = 1; } + if (!rsync_port && remote_argc && !**remote_argv) /* Turn an empty arg into a dot dir. */ + *remote_argv = "."; + if (am_sender) { char *dummy_host; int dummy_port = rsync_port; @@ -1338,6 +1351,8 @@ static int start_client(int argc, char *argv[]) rprintf(FERROR, "All source args must use the same port number.\n"); exit_cleanup(RERR_SYNTAX); } + if (!rsync_port && !*arg) /* Turn an empty arg into a dot dir. */ + arg = "."; remote_argv[i] = arg; } }