Added logic to the receiving side to ensure that the --delete-during
[rsync/rsync.git] / rsync.c
diff --git a/rsync.c b/rsync.c
index e1c061c..21f5288 100644 (file)
--- a/rsync.c
+++ b/rsync.c
@@ -48,6 +48,8 @@ extern int flist_eof;
 extern int msgs2stderr;
 extern int keep_dirlinks;
 extern int make_backups;
+extern int delete_during;
+extern int check_for_io_err;
 extern struct file_list *cur_flist, *first_flist, *dir_flist;
 extern struct chmod_mode_struct *daemon_chmod_modes;
 #ifdef ICONV_OPTION
@@ -252,8 +254,15 @@ int read_ndx_and_attrs(int f_in, int *iflag_ptr, uchar *type_ptr,
        while (1) {
                ndx = read_ndx(f_in);
 
-               if (ndx >= 0)
+               if (ndx >= 0) {
+                       if (check_for_io_err) {
+                               /* Let generator know there was no I/O error. */
+                               send_msg_int(MSG_IO_ERROR, 0);
+                               check_for_io_err = 0;
+                       }
                        break;
+               }
+               check_for_io_err = 0;
                if (ndx == NDX_DONE)
                        return ndx;
                if (!inc_recurse || am_sender)
@@ -287,6 +296,10 @@ int read_ndx_and_attrs(int f_in, int *iflag_ptr, uchar *type_ptr,
                stop_flist_forward();
                if (!msgs2stderr)
                        negate_output_levels(); /* restore info/debug output */
+               /* If the sender is going to send us an MSG_IO_ERROR value, it
+                * will always be the very next message following a file list. */
+               if (delete_during)
+                       check_for_io_err = 1;
        }
 
        iflags = protocol_version >= 29 ? read_shortint(f_in)