Use 0-length MSG_DATA when MSG_NOOP is not available
[rsync.git] / receiver.c
index e298e8f3f4e688ace86d5a95b6fd6458590e8054..39c5e490dc96f80c9e2b139957b1881b39157027 100644 (file)
@@ -360,7 +360,7 @@ static void no_batched_update(int ndx, BOOL is_redo)
        rprintf(FERROR_XFER, "(No batched update for%s \"%s\")\n",
                is_redo ? " resend of" : "", f_name(file, NULL));
 
-       if (inc_recurse)
+       if (inc_recurse && !dry_run)
                send_msg_int(MSG_NO_SEND, ndx);
 }
 
@@ -386,15 +386,23 @@ static int we_want_redo(int desired_ndx)
 static int gen_wants_ndx(int desired_ndx)
 {
        static int next_ndx = -1;
-       static BOOL got_eof = 0;
+       static int done_cnt = 0;
+       static BOOL got_eof = False;
+       int flist_num = first_flist->flist_num;
 
        if (got_eof)
                return 0;
 
        while (next_ndx < desired_ndx) {
+               if (inc_recurse && flist_num <= done_cnt)
+                       return 0;
                if (next_ndx >= 0)
                        no_batched_update(next_ndx, False);
                if ((next_ndx = read_int(batch_gen_fd)) < 0) {
+                       if (inc_recurse) {
+                               done_cnt++;
+                               continue;
+                       }
                        got_eof = True;
                        return 0;
                }
@@ -475,14 +483,14 @@ int recv_files(int f_in, char *local_name)
                        rprintf(FINFO, "recv_files(%s)\n", fname);
 
 #ifdef SUPPORT_XATTRS
-               if (iflags & ITEM_REPORT_XATTR && !dry_run)
+               if (iflags & ITEM_REPORT_XATTR && do_xfers)
                        recv_xattr_request(file, f_in);
 #endif
 
                if (!(iflags & ITEM_TRANSFER)) {
                        maybe_log_item(file, iflags, itemizing, xname);
 #ifdef SUPPORT_XATTRS
-                       if (preserve_xattrs && iflags & ITEM_REPORT_XATTR && !dry_run)
+                       if (preserve_xattrs && iflags & ITEM_REPORT_XATTR && do_xfers)
                                set_file_attrs(fname, file, NULL, fname, 0);
 #endif
                        continue;
@@ -529,6 +537,21 @@ int recv_files(int f_in, char *local_name)
                        exit_cleanup(RERR_PROTOCOL);
                }
 
+               if (read_batch) {
+                       int wanted = redoing
+                                  ? we_want_redo(ndx)
+                                  : gen_wants_ndx(ndx);
+                       if (!wanted) {
+                               rprintf(FINFO,
+                                       "(Skipping batched update for%s \"%s\")\n",
+                                       redoing ? " resend of" : "",
+                                       fname);
+                               discard_receive_data(f_in, F_LENGTH(file));
+                               file->flags |= FLAG_FILE_SENT;
+                               continue;
+                       }
+               }
+
                if (!do_xfers) { /* log the transfer */
                        log_item(FCLIENT, file, &stats, iflags, NULL);
                        if (read_batch)
@@ -542,18 +565,6 @@ int recv_files(int f_in, char *local_name)
                        continue;
                }
 
-               if (read_batch) {
-                       if (!(redoing ? we_want_redo(ndx) : gen_wants_ndx(ndx))) {
-                               rprintf(FINFO,
-                                       "(Skipping batched update for%s \"%s\")\n",
-                                       redoing ? " resend of" : "",
-                                       fname);
-                               discard_receive_data(f_in, F_LENGTH(file));
-                               file->flags |= FLAG_FILE_SENT;
-                               continue;
-                       }
-               }
-
                partialptr = partial_dir ? partial_dir_fname(fname) : fname;
 
                if (protocol_version >= 29) {