Fix --remove-source-files sanity check w/--copy-links the right way.
[rsync.git] / compat.c
index 45073d3d5d30374cf31b4127f67468ef5b4843bd..8d755c677b8cfcc492dab1a7dcf6df9d555c4c31 100644 (file)
--- a/compat.c
+++ b/compat.c
@@ -3,7 +3,7 @@
  *
  * Copyright (C) Andrew Tridgell 1996
  * Copyright (C) Paul Mackerras 1996
- * Copyright (C) 2004-2009 Wayne Davison
+ * Copyright (C) 2004-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
@@ -26,6 +26,8 @@ int file_extra_cnt = 0; /* count of file-list extras that everyone gets */
 int inc_recurse = 0;
 int compat_flags = 0;
 int use_safe_inc_flist = 0;
+int want_xattr_optim = 0;
+int proper_seed_order = 0;
 
 extern int am_server;
 extern int am_sender;
@@ -76,6 +78,8 @@ int filesfrom_convert = 0;
 #define CF_SYMLINK_TIMES (1<<1)
 #define CF_SYMLINK_ICONV (1<<2)
 #define CF_SAFE_FLIST   (1<<3)
+#define CF_AVOID_XATTR_OPTIM (1<<4)
+#define CF_CHKSUM_SEED_FIX (1<<5)
 
 static const char *client_info;
 
@@ -267,11 +271,17 @@ void setup_protocol(int f_out,int f_in)
 #endif
                        if (local_server || strchr(client_info, 'f') != NULL)
                                compat_flags |= CF_SAFE_FLIST;
+                       if (local_server || strchr(client_info, 'x') != NULL)
+                               compat_flags |= CF_AVOID_XATTR_OPTIM;
+                       if (local_server || strchr(client_info, 'C') != NULL)
+                               compat_flags |= CF_CHKSUM_SEED_FIX;
                        write_byte(f_out, compat_flags);
                } else
                        compat_flags = read_byte(f_in);
                /* The inc_recurse var MUST be set to 0 or 1. */
                inc_recurse = compat_flags & CF_INC_RECURSE ? 1 : 0;
+               want_xattr_optim = protocol_version >= 31 && !(compat_flags & CF_AVOID_XATTR_OPTIM);
+               proper_seed_order = compat_flags & CF_CHKSUM_SEED_FIX ? 1 : 0;
                if (am_sender) {
                        receiver_symlink_times = am_server
                            ? strchr(client_info, 'L') != NULL
@@ -323,9 +333,11 @@ void setup_protocol(int f_out,int f_in)
 
        if (am_server) {
                if (!checksum_seed)
-                       checksum_seed = time(NULL);
+                       checksum_seed = time(NULL) ^ (getpid() << 6);
                write_int(f_out, checksum_seed);
        } else {
                checksum_seed = read_int(f_in);
        }
+
+       init_flist();
 }