Make sure that config.h.in is up-to-date before allowing the
[rsync/rsync.git] / receiver.c
index 7efd3d2..ee8e015 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (C) 1996-2000 Andrew Tridgell
  * Copyright (C) 1996 Paul Mackerras
- * Copyright (C) 2003-2008 Wayne Davison
+ * Copyright (C) 2003-2009 Wayne Davison
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -285,11 +285,10 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r,
                goto report_write_error;
 
 #ifdef HAVE_FTRUNCATE
-       if (inplace && fd != -1) {
-               if (ftruncate(fd, offset) < 0) {
-                       rsyserr(FWARNING, errno, "ftruncate failed on %s",
-                               full_fname(fname));
-               }
+       if (inplace && fd != -1
+        && ftruncate(fd, offset) < 0) {
+               rsyserr(FERROR_XFER, errno, "ftruncate failed on %s",
+                       full_fname(fname));
        }
 #endif
 
@@ -332,7 +331,7 @@ static void handle_delayed_updates(char *local_name)
                struct file_struct *file = cur_flist->files[ndx];
                fname = local_name ? local_name : f_name(file, NULL);
                if ((partialptr = partial_dir_fname(fname)) != NULL) {
-                       if (make_backups > 0 && !make_backup(fname))
+                       if (make_backups > 0 && !make_backup(fname, False))
                                continue;
                        if (DEBUG_GTE(RECV, 1)) {
                                rprintf(FINFO, "renaming %s to %s\n",
@@ -362,7 +361,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);
 }
 
@@ -385,18 +384,25 @@ static int we_want_redo(int desired_ndx)
        return 0;
 }
 
-static int gen_wants_ndx(int desired_ndx)
+static int gen_wants_ndx(int desired_ndx, int flist_num)
 {
        static int next_ndx = -1;
-       static BOOL got_eof = 0;
+       static int done_cnt = 0;
+       static BOOL got_eof = False;
 
        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;
                }
@@ -454,13 +460,17 @@ int recv_files(int f_in, char *local_name)
                                end_progress(0);
                        }
                        if (inc_recurse && first_flist) {
-                               if (read_batch)
-                                       gen_wants_ndx(first_flist->used + first_flist->ndx_start);
+                               if (read_batch) {
+                                       ndx = first_flist->used + first_flist->ndx_start;
+                                       gen_wants_ndx(ndx, first_flist->flist_num);
+                               }
                                flist_free(first_flist);
                                if (first_flist)
                                        continue;
-                       } else if (read_batch && first_flist)
-                               gen_wants_ndx(first_flist->used);
+                       } else if (read_batch && first_flist) {
+                               ndx = first_flist->used;
+                               gen_wants_ndx(ndx, first_flist->flist_num);
+                       }
                        if (++phase > max_phase)
                                break;
                        if (DEBUG_GTE(RECV, 1))
@@ -552,6 +562,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, cur_flist->flist_num);
+                       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)
@@ -565,18 +590,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) {
@@ -829,11 +842,6 @@ int recv_files(int f_in, char *local_name)
        if (phase == 2 && delay_updates) /* for protocol_version < 29 */
                handle_delayed_updates(local_name);
 
-       if (read_batch) {
-               read_int(batch_gen_fd); /* Discard -1 */
-               read_del_stats(batch_gen_fd);
-       }
-
        if (DEBUG_GTE(RECV, 1))
                rprintf(FINFO,"recv_files finished\n");