When rsync encountered an empty file list, it behaved differently
[rsync/rsync.git] / main.c
diff --git a/main.c b/main.c
index 0c5fc57..4cc1d3c 100644 (file)
--- a/main.c
+++ b/main.c
@@ -163,7 +163,9 @@ static void handle_stats(int f)
 
        /* this is the client */
 
-       if (!am_sender) {
+       if (f < 0 && !am_sender) /* e.g. when we got an empty file list. */
+               ; 
+       else if (!am_sender) {
                /* Read the first two in opposite order because the meaning of
                 * read/write swaps when switching from sender to receiver. */
                total_written = read_longint(f);
@@ -173,7 +175,7 @@ static void handle_stats(int f)
                        stats.flist_buildtime = read_longint(f);
                        stats.flist_xfertime = read_longint(f);
                }
-       } else if (write_batch) {
+       } else if (write_batch && !am_server) {
                /* The --read-batch process is going to be a client
                 * receiver, so we need to give it the stats. */
                write_longint(batch_fd, total_read);
@@ -594,7 +596,7 @@ static int do_recv(int f_in,int f_out,struct file_list *flist,char *local_name)
 
        am_generator = 1;
        close_multiplexing_in();
-       if (write_batch)
+       if (write_batch && !am_server)
                stop_write_batch();
 
        close(error_pipe[1]);
@@ -767,7 +769,7 @@ int client_run(int f_in, int f_out, pid_t pid, int argc, char *argv[])
                if (filesfrom_host)
                        filesfrom_fd = f_in;
 
-               if (write_batch)
+               if (write_batch && !am_server)
                        start_write_batch(f_out);
                flist = send_file_list(f_out, argc, argv);
                set_msg_fd_in(-1);
@@ -805,20 +807,19 @@ int client_run(int f_in, int f_out, pid_t pid, int argc, char *argv[])
                filesfrom_fd = -1;
        }
 
-       if (write_batch)
+       if (write_batch && !am_server)
                start_write_batch(f_in);
        flist = recv_file_list(f_in);
-       if (!flist || flist->count == 0) {
-               rprintf(FINFO, "client: nothing to do: "
-                       "perhaps you need to specify some filenames or "
-                       "the --recursive option?\n");
-               exit_cleanup(0);
-       }
        the_file_list = flist;
 
-       local_name = get_local_name(flist,argv[0]);
+       if (flist && flist->count > 0) {
+               local_name = get_local_name(flist, argv[0]);
 
-       status2 = do_recv(f_in,f_out,flist,local_name);
+               status2 = do_recv(f_in, f_out, flist, local_name);
+       } else {
+               handle_stats(-1);
+               output_summary();
+       }
 
        if (pid != -1) {
                if (verbose > 3)
@@ -1130,7 +1131,7 @@ int main(int argc,char *argv[])
 
        init_flist();
 
-       if (write_batch || read_batch) {
+       if ((write_batch || read_batch) && !am_server) {
                if (write_batch)
                        write_batch_shell_file(orig_argc, orig_argv, argc);
 
@@ -1149,6 +1150,8 @@ int main(int argc,char *argv[])
                if (read_batch)
                        read_stream_flags(batch_fd);
        }
+       if (write_batch < 0)
+               dry_run = 1;
 
        if (am_daemon && !am_server)
                return daemon_main();