X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/8e41b68e8f975c02a5d9281be780ba5d1a385107..9b49704959f4b7ecb482f3d1f87ba2735e1d7ed1:/main.c diff --git a/main.c b/main.c index d30350d1..e9675f96 100644 --- a/main.c +++ b/main.c @@ -37,7 +37,6 @@ extern int am_daemon; extern int inc_recurse; extern int blocking_io; extern int remove_source_files; -extern int daemon_over_rsh; extern int need_messages_from_generator; extern int kluge_around_eof; extern int do_stats; @@ -71,10 +70,12 @@ extern char *shell_cmd; extern char *batch_name; extern char *password_file; extern char curr_dir[MAXPATHLEN]; +extern struct file_list *cur_flist; extern struct filter_list_struct server_filter_list; int local_server = 0; int new_root_dir = 0; +int daemon_over_rsh = 0; mode_t orig_umask = 0; int batch_gen_fd = -1; @@ -695,8 +696,8 @@ static int do_recv(int f_in, int f_out, char *local_name) copy_links = copy_dirlinks = 0; #ifdef SUPPORT_HARD_LINKS - if (preserve_hard_links) - match_hard_links(); + if (preserve_hard_links && !inc_recurse) + match_hard_links(cur_flist); #endif if (fd_pair(error_pipe) < 0) { @@ -1092,16 +1093,9 @@ static int start_client(int argc, char *argv[]) "--files-from hostname is not the same as the transfer hostname\n"); exit_cleanup(RERR_SYNTAX); } - if (rsync_port) { - if (!shell_cmd) { - return start_socket_client(shell_machine, - shell_path, - argc, argv); - } - daemon_over_rsh = 1; - } - am_sender = 0; + if (rsync_port) + daemon_over_rsh = shell_cmd ? 1 : -1; } else { /* source is local, check dest arg */ am_sender = 1; @@ -1128,14 +1122,8 @@ static int start_client(int argc, char *argv[]) } shell_machine = NULL; shell_path = p; - } else if (rsync_port) { - if (!shell_cmd) { - return start_socket_client(shell_machine, - shell_path, - argc, argv); - } - daemon_over_rsh = 1; - } + } else if (rsync_port) + daemon_over_rsh = shell_cmd ? 1 : -1; } } else { /* read_batch */ local_server = 1; @@ -1146,6 +1134,15 @@ static int start_client(int argc, char *argv[]) } } + /* for remote source, only single dest arg can remain ... */ + if (!am_sender && argc > 1) { + usage(FERROR); + exit_cleanup(RERR_SYNTAX); + } + + if (daemon_over_rsh < 0) + return start_socket_client(shell_machine, shell_path, argc, argv); + if (password_file && !daemon_over_rsh) { rprintf(FERROR, "The --password-file option may only be " "used when accessing an rsync daemon.\n"); @@ -1169,12 +1166,6 @@ static int start_client(int argc, char *argv[]) shell_path ? shell_path : ""); } - /* for remote source, only single dest arg can remain ... */ - if (!am_sender && argc > 1) { - usage(FERROR); - exit_cleanup(RERR_SYNTAX); - } - /* ... or no dest at all */ if (!am_sender && argc == 0) list_only |= 1;