Fix --remove-source-files sanity check w/--copy-links the right way.
[rsync.git] / sender.c
index ebc8839f53672af09c904369d5c234428de957e8..9b432ed9f8b5575d0a68df5e40b5769cc269acd4 100644 (file)
--- a/sender.c
+++ b/sender.c
@@ -3,7 +3,7 @@
  *
  * Copyright (C) 1996 Andrew Tridgell
  * Copyright (C) 1996 Paul Mackerras
- * Copyright (C) 2003-2009 Wayne Davison
+ * Copyright (C) 2003-2018 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
@@ -29,8 +29,10 @@ extern int inc_recurse;
 extern int log_before_transfer;
 extern int stdout_format_has_i;
 extern int logfile_format_has_i;
+extern int want_xattr_optim;
 extern int csum_length;
 extern int append_mode;
+extern int copy_links;
 extern int io_error;
 extern int flist_eof;
 extern int allowed_lull;
@@ -137,7 +139,7 @@ void successful_send(int ndx)
                return;
        f_name(file, fname);
 
-       if (do_lstat(fname, &st) < 0) {
+       if ((copy_links ? do_stat(fname, &st) : do_lstat(fname, &st)) < 0) {
                failed_op = "re-lstat";
                goto failed;
        }
@@ -147,7 +149,7 @@ void successful_send(int ndx)
         || (NSEC_BUMP(file) && (uint32)st.ST_MTIME_NSEC != F_MOD_NSEC(file))
 #endif
        ) {
-               rprintf(FERROR, "ERROR: Skipping sender remove for changed file: %s\n", fname);
+               rprintf(FERROR_XFER, "ERROR: Skipping sender remove for changed file: %s\n", fname);
                return;
        }
 
@@ -157,7 +159,7 @@ void successful_send(int ndx)
                if (errno == ENOENT)
                        rprintf(FINFO, "sender file already removed: %s\n", fname);
                else
-                       rsyserr(FERROR, errno, "sender failed to %s %s", failed_op, fname);
+                       rsyserr(FERROR_XFER, errno, "sender failed to %s %s", failed_op, fname);
        } else {
                if (INFO_GTE(REMOVE, 1))
                        rprintf(FINFO, "sender removed %s\n", fname);
@@ -178,7 +180,7 @@ static void write_ndx_and_attrs(int f_out, int ndx, int iflags,
                write_vstring(f_out, buf, len);
 #ifdef SUPPORT_XATTRS
        if (preserve_xattrs && iflags & ITEM_REPORT_XATTR && do_xfers
-        && (protocol_version < 31 || !BITS_SET(iflags, ITEM_XNAME_FOLLOWS|ITEM_LOCAL_CHANGE)))
+        && !(want_xattr_optim && BITS_SET(iflags, ITEM_XNAME_FOLLOWS|ITEM_LOCAL_CHANGE)))
                send_xattr_request(fname, file, f_out);
 #endif
 }
@@ -260,7 +262,7 @@ void send_files(int f_in, int f_out)
 
 #ifdef SUPPORT_XATTRS
                if (preserve_xattrs && iflags & ITEM_REPORT_XATTR && do_xfers
-                && (protocol_version < 31 || !BITS_SET(iflags, ITEM_XNAME_FOLLOWS|ITEM_LOCAL_CHANGE)))
+                && !(want_xattr_optim && BITS_SET(iflags, ITEM_XNAME_FOLLOWS|ITEM_LOCAL_CHANGE)))
                        recv_xattr_request(file, f_in);
 #endif
 
@@ -318,8 +320,7 @@ void send_files(int f_in, int f_out)
                stats.xferred_files++;
                stats.total_transferred_size += F_LENGTH(file);
 
-               if (!log_before_transfer)
-                       remember_initial_stats();
+               remember_initial_stats();
 
                if (!do_xfers) { /* log the transfer */
                        log_item(FCLIENT, file, iflags, NULL);