<pre style='margin:0'>
Ryan Schmidt (ryandesign) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/03e314c0800c3c4daff3bd9dd4430e7b93cdf9e6">https://github.com/macports/macports-ports/commit/03e314c0800c3c4daff3bd9dd4430e7b93cdf9e6</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'>     new 03e314c0800 rsync: Update to 3.2.3
</span>03e314c0800 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit 03e314c0800c3c4daff3bd9dd4430e7b93cdf9e6
</span>Author: Ryan Schmidt <ryandesign@macports.org>
AuthorDate: Tue Sep 1 12:28:51 2020 -0500

<span style='display:block; white-space:pre;color:#404040;'>    rsync: Update to 3.2.3
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Remove patchfile crtimes.diff which has been included upstream.
</span>---
 net/rsync/Portfile                  |  17 +-
 net/rsync/files/crtimes.diff        | 763 ------------------------------------
 net/rsync/files/fileflags.diff      | 275 ++++++-------
 net/rsync/files/rsyncd.conf.example |   2 +-
 4 files changed, 135 insertions(+), 922 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/net/rsync/Portfile b/net/rsync/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index b02999bddd6..6155a01ffb4 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/net/rsync/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/net/rsync/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3,11 +3,11 @@
</span> PortSystem          1.0
 
 name                rsync
<span style='display:block; white-space:pre;background:#ffe0e0;'>-version             3.2.2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+version             3.2.3
</span> revision            0
<span style='display:block; white-space:pre;background:#ffe0e0;'>-checksums           rmd160  0de1f851925437e08d794db341189ead54e36620 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    sha256  644bd3841779507665211fd7db8359c8a10670c57e305b4aab61b4e40037afa8 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    size    1057001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+checksums           rmd160  6eea543c7034f1ef4997f72011d4fcdda2a960da \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    sha256  becc3c504ceea499f4167a260040ccf4d9f2ef9499ad5683c179a697146ce50e \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    size    1069784
</span> 
 categories          net
 license             {GPL-3+ OpenSSLException}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -32,15 +32,14 @@ depends_lib         port:popt \
</span> 
 patch.pre_args      -p1
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# These patches come from
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# https://download.samba.org/pub/rsync/src/rsync-patches-3.2.2.tar.gz
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# and need to be updated with each release.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# This patch comes from
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# https://download.samba.org/pub/rsync/src/rsync-patches-3.2.3.tar.gz
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# and needs to be updated with each release.
</span> # We used to use hfs-compression.diff but it has been deliberately
 # disabled by its developers as of 3.1.3 because it needs to be reworked
 # to account for changes that occurred in rsync's rsync_xal_get function:
 # https://trac.macports.org/ticket/60792#comment:2
<span style='display:block; white-space:pre;background:#ffe0e0;'>-patchfiles          fileflags.diff \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    crtimes.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+patchfiles          fileflags.diff
</span> 
 # This patch adds "advanced error-logging for ACL unpack errors". It
 # is unknown where the patch came from or whether it has been suggested
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/net/rsync/files/crtimes.diff b/net/rsync/files/crtimes.diff
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index e8dc668f17d..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/net/rsync/files/crtimes.diff
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,763 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-This patch adds a --crtimes (-N) option that will preserve
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-create times on OS X.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-To use this patch, run these commands for a successful build:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    patch -p1 <patches/fileflags.diff
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    patch -p1 <patches/crtimes.diff
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    ./configure                         (optional if already run)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    make
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-based-on: patch/master/fileflags
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/compat.c b/compat.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/compat.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/compat.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -44,6 +44,7 @@ extern int protect_args;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int preserve_uid;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int preserve_gid;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int preserve_atimes;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+extern int preserve_crtimes;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int preserve_acls;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int preserve_xattrs;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int preserve_fileflags;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -77,7 +78,7 @@ int inplace_partial = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int do_negotiated_strings = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- /* These index values are for the file-list's extra-attribute array. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--int pathname_ndx, depth_ndx, atimes_ndx, uid_ndx, gid_ndx, fileflags_ndx, acls_ndx, xattrs_ndx, unsort_ndx;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+int pathname_ndx, depth_ndx, atimes_ndx, crtimes_ndx, uid_ndx, gid_ndx, fileflags_ndx, acls_ndx, xattrs_ndx, unsort_ndx;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int receiver_symlink_times = 0; /* receiver can set the time on a symlink */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int sender_symlink_iconv = 0;     /* sender should convert symlink content */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -555,6 +556,8 @@ void setup_protocol(int f_out,int f_in)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    * aligned for direct int64-pointer memory access. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   if (preserve_atimes)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           atimes_ndx = (file_extra_cnt += EXTRA64_CNT);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  if (preserve_crtimes)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          crtimes_ndx = (file_extra_cnt += EXTRA64_CNT);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   if (am_sender) /* This is most likely in the in64 union as well. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           pathname_ndx = (file_extra_cnt += PTR_EXTRA_CNT);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -718,6 +721,10 @@ void setup_protocol(int f_out,int f_in)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           want_xattr_optim = protocol_version >= 31 && !(compat_flags & CF_AVOID_XATTR_OPTIM);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           proper_seed_order = compat_flags & CF_CHKSUM_SEED_FIX ? 1 : 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           xfer_flags_as_varint = compat_flags & CF_VARINT_FLIST_FLAGS ? 1 : 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          if (!xfer_flags_as_varint && preserve_crtimes) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  fprintf(stderr, "Both rsync versions must be at least 3.2.0 for --crtimes.\n");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  exit_cleanup(RERR_PROTOCOL);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           if (!xfer_flags_as_varint && preserve_fileflags) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   fprintf(stderr, "Both rsync versions must be at least 3.2.0 for --fileflags.\n");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   exit_cleanup(RERR_PROTOCOL);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/flist.c b/flist.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/flist.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/flist.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -57,6 +57,7 @@ extern int delete_during;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int missing_args;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int eol_nulls;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int atimes_ndx;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+extern int crtimes_ndx;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int relative_paths;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int implied_dirs;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int ignore_perishable;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -378,6 +379,9 @@ static void send_file_entry(int f, const char *fname, struct file_struct *file,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                       int ndx, int first_ndx)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   static time_t modtime, atime;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef SUPPORT_CRTIMES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  static time_t crtime;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   static mode_t mode;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifdef SUPPORT_FILEFLAGS
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   static uint32 fileflags;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -494,6 +498,13 @@ static void send_file_entry(int f, const char *fname, struct file_struct *file,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   atime = F_ATIME(file);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef SUPPORT_CRTIMES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  if (crtimes_ndx) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          crtime = F_CRTIME(file);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          if (crtime == modtime)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  xflags |= XMIT_CRTIME_EQ_MTIME;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifdef SUPPORT_HARD_LINKS
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   if (tmp_dev != -1) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -581,6 +592,10 @@ static void send_file_entry(int f, const char *fname, struct file_struct *file,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   if (xflags & XMIT_MOD_NSEC)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           write_varint(f, F_MOD_NSEC(file));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef SUPPORT_CRTIMES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  if (crtimes_ndx && !(xflags & XMIT_CRTIME_EQ_MTIME))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          write_varlong(f, crtime, 4);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   if (!(xflags & XMIT_SAME_MODE))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           write_int(f, to_wire_mode(mode));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifdef SUPPORT_FILEFLAGS
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -677,6 +692,9 @@ static void send_file_entry(int f, const char *fname, struct file_struct *file,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- static struct file_struct *recv_file_entry(int f, struct file_list *flist, int xflags)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   static int64 modtime, atime;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef SUPPORT_CRTIMES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  static time_t crtime;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   static mode_t mode;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifdef SUPPORT_FILEFLAGS
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   static uint32 fileflags;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -790,6 +808,10 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   mode = first->mode;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   if (atimes_ndx && !S_ISDIR(mode))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                           atime = F_ATIME(first);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef SUPPORT_CRTIMES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  if (crtimes_ndx)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                          crtime = F_CRTIME(first);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifdef SUPPORT_FILEFLAGS
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   if (preserve_fileflags)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                           fileflags = F_FFLAGS(first);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -830,6 +852,21 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           modtime_nsec = read_varint(f);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           modtime_nsec = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef SUPPORT_CRTIMES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  if (crtimes_ndx) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          if (xflags & XMIT_CRTIME_EQ_MTIME)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  crtime = modtime;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  crtime = read_varlong(f, 4);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#if SIZEOF_TIME_T < SIZEOF_INT64
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          if (!am_generator && (int64)(time_t)crtime != crtime) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  rprintf(FERROR_XFER,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                          "Create time value of %s truncated on receiver.\n",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                          lastname);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   if (!(xflags & XMIT_SAME_MODE))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           mode = from_wire_mode(read_int(f));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   if (atimes_ndx && !S_ISDIR(mode) && !(xflags & XMIT_SAME_ATIME)) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1019,6 +1056,10 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   if (atimes_ndx && !S_ISDIR(mode))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           F_ATIME(file) = atime;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef SUPPORT_CRTIMES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  if (crtimes_ndx)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          F_CRTIME(file) = crtime;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   if (unsort_ndx)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           F_NDX(file) = flist->used + flist->ndx_start;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1420,6 +1461,10 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           file->flags |= FLAG_OWNED_BY_US;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   if (atimes_ndx && !S_ISDIR(file->mode))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           F_ATIME(file) = st.st_atime;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef SUPPORT_CRTIMES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  if (crtimes_ndx)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          F_CRTIME(file) = get_create_time(fname);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   if (basename != thisname)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           file->dirname = lastdir;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/generator.c b/generator.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/generator.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/generator.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -41,6 +41,7 @@ extern int preserve_links;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int preserve_devices;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int write_devices;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int preserve_specials;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+extern int preserve_fileflags;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int preserve_hard_links;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int preserve_executability;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int preserve_fileflags;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -398,6 +399,19 @@ static inline int mtime_differs(STRUCT_STAT *stp, struct file_struct *file)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+static inline int any_time_differs(stat_x *sxp, struct file_struct *file, UNUSED(const char *fname))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  int differs = mtime_differs(&sxp->st, file);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef SUPPORT_CRTIMES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  if (!differs && crtimes_ndx) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          if (sxp->crtime == 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  sxp->crtime = get_create_time(fname);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          differs = !same_time(sxp->crtime, 0, F_CRTIME(file), 0);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  return differs;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- static inline int perms_differ(struct file_struct *file, stat_x *sxp)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   if (preserve_perms)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -452,7 +466,7 @@ int unchanged_attrs(const char *fname, struct file_struct *file, stat_x *sxp)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   if (S_ISLNK(file->mode)) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifdef CAN_SET_SYMLINK_TIMES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--          if (preserve_times & PRESERVE_LINK_TIMES && mtime_differs(&sxp->st, file))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          if (preserve_times & PRESERVE_LINK_TIMES && any_time_differs(sxp, file, fname))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   return 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifdef CAN_CHMOD_SYMLINK
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -472,7 +486,7 @@ int unchanged_attrs(const char *fname, struct file_struct *file, stat_x *sxp)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   return 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--          if (preserve_times && mtime_differs(&sxp->st, file))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          if (preserve_times && any_time_differs(sxp, file, fname))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   return 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           if (perms_differ(file, sxp))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   return 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -518,6 +532,14 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           if (atimes_ndx && !S_ISDIR(file->mode) && !S_ISLNK(file->mode)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            && !same_time(F_ATIME(file), 0, sxp->st.st_atime, 0))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   iflags |= ITEM_REPORT_ATIME;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef SUPPORT_CRTIMES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          if (crtimes_ndx) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  if (sxp->crtime == 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                          sxp->crtime = get_create_time(fnamecmp);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  if (!same_time(sxp->crtime, 0, F_CRTIME(file), 0))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                          iflags |= ITEM_REPORT_CRTIME;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #if !defined HAVE_LCHMOD && !defined HAVE_SETATTRLIST
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           if (S_ISLNK(file->mode)) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   ;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1142,6 +1164,7 @@ static void list_file_entry(struct file_struct *f)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   int size_width = human_readable ? 14 : 11;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   int mtime_width = 1 + strlen(mtime_str);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   int atime_width = atimes_ndx ? mtime_width : 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  int crtime_width = crtimes_ndx ? mtime_width : 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   if (!F_IS_ACTIVE(f)) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           /* this can happen if duplicate names were removed */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1152,10 +1175,11 @@ static void list_file_entry(struct file_struct *f)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   if (missing_args == 2 && f->mode == 0) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           rprintf(FINFO, "%-*s %s\n",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                  10 + 1 + size_width + mtime_width + atime_width, "*missing",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  10 + 1 + size_width + mtime_width + atime_width + crtime_width, "*missing",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   f_name(f, NULL));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           const char *atime_str = atimes_ndx && !S_ISDIR(f->mode) ? timestring(F_ATIME(f)) : "";
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          const char *crtime_str = crtimes_ndx ? timestring(F_CRTIME(f)) : "";
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           const char *arrow, *lnk;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           permstring(permbuf, f->mode);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1168,9 +1192,9 @@ static void list_file_entry(struct file_struct *f)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   arrow = lnk = "";
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--          rprintf(FINFO, "%s %*s %s%*s %s%s%s\n",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          rprintf(FINFO, "%s %*s %s%*s%*s %s%s%s\n",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   permbuf, size_width, human_num(F_LENGTH(f)),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                  timestring(f->modtime), atime_width, atime_str,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  timestring(f->modtime), atime_width, atime_str, crtime_width, crtime_str,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   f_name(f, NULL), arrow, lnk);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1266,6 +1290,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   return;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  sx.crtime = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   if (dry_run > 1 || (dry_missing_dir && is_below(file, dry_missing_dir))) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           int i;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/log.c b/log.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/log.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/log.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -721,7 +721,8 @@ static void log_formatted(enum logcode code, const char *format, const char *op,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   c[9] = !(iflags & ITEM_REPORT_ACL) ? '.' : 'a';
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   c[10] = !(iflags & ITEM_REPORT_XATTR) ? '.' : 'x';
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   c[11] = !(iflags & ITEM_REPORT_FFLAGS) ? '.' : 'f';
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                  c[12] = '\0';
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  c[12] = !(iflags & ITEM_REPORT_CRTIME) ? '.' : 'n';
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  c[13] = '\0';
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   if (iflags & (ITEM_IS_NEW|ITEM_MISSING_DATA)) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                           char ch = iflags & ITEM_IS_NEW ? '+' : '?';
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/options.c b/options.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/options.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/options.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -65,6 +65,7 @@ int preserve_uid = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int preserve_gid = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int preserve_times = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int preserve_atimes = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+int preserve_crtimes = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int update_only = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int open_noatime = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int cvs_exclude = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -671,6 +672,11 @@ static void print_info_flags(enum logcode f)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   "file-flags",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifndef SUPPORT_CRTIMES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          "no "
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  "crtimes",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   "*Optimizations",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifndef HAVE_SIMD
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -840,6 +846,9 @@ static struct poptOption long_options[] = {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   {"no-U",             0,  POPT_ARG_VAL,    &preserve_atimes, 0, 0, 0 },
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   {"open-noatime",     0,  POPT_ARG_VAL,    &open_noatime, 1, 0, 0 },
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   {"no-open-noatime",  0,  POPT_ARG_VAL,    &open_noatime, 0, 0, 0 },
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  {"crtimes",         'N', POPT_ARG_VAL,    &preserve_crtimes, 1, 0, 0 },
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  {"no-crtimes",       0,  POPT_ARG_VAL,    &preserve_crtimes, 0, 0, 0 },
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  {"no-N",             0,  POPT_ARG_VAL,    &preserve_crtimes, 0, 0, 0 },
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   {"omit-dir-times",  'O', POPT_ARG_VAL,    &omit_dir_times, 1, 0, 0 },
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   {"no-omit-dir-times",0,  POPT_ARG_VAL,    &omit_dir_times, 0, 0, 0 },
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   {"no-O",             0,  POPT_ARG_VAL,    &omit_dir_times, 0, 0, 0 },
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1221,6 +1230,9 @@ static void set_refuse_options(void)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   parse_one_refuse_match(0, "force-uchange", list_end);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   parse_one_refuse_match(0, "force-schange", list_end);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifndef SUPPORT_CRTIMES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  parse_one_refuse_match(0, "crtimes", list_end);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   /* Now we use the descrip values to actually mark the options for refusal. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   for (op = long_options; op != list_end; op++) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2564,6 +2576,10 @@ void server_options(char **args, int *argc_p)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           if (preserve_atimes > 1)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   argstr[x++] = 'U';
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef SUPPORT_CRTIMES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  if (preserve_crtimes)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          argstr[x++] = 'N';
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   if (preserve_perms)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           argstr[x++] = 'p';
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   else if (preserve_executability && am_sender)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/rsync.1.md b/rsync.1.md
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/rsync.1.md
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/rsync.1.md
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -373,6 +373,7 @@ detailed description below for a complete description.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- --times, -t              preserve modification times
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- --atimes, -U             preserve access (use) times
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- --open-noatime           avoid changing the atime on opened files
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+--crtimes, -N            preserve create times (newness)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- --omit-dir-times, -O     omit directories from --times
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- --omit-link-times, -J    omit symlinks from --times
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- --super                  receiver attempts super-user activities
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1368,6 +1369,11 @@ your home directory (remove the '=' for that).
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     mounted to avoid updating the atime on read access even without the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     O_NOATIME flag being set.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+0.  `--crtimes`, `-N,`
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    This tells rsync to set the create times (newness) of +the destination
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    files to the same value as the source files.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 0.  `--omit-dir-times`, `-O`
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     This tells rsync to omit directories when it is preserving modification
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2642,7 +2648,7 @@ your home directory (remove the '=' for that).
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     output of other verbose messages).
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     The "%i" escape has a cryptic output that is 11 letters long.  The general
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    format is like the string `YXcstpoguaxf`, where **Y** is replaced by the type
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    format is like the string `YXcstpoguaxfn`, where **Y** is replaced by the type
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     of update being done, **X** is replaced by the file-type, and the other
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     letters represent attributes that may be output if they are being modified.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2699,6 +2705,8 @@ your home directory (remove the '=' for that).
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-       happens when a symlink or directory is updated.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     - The `a` means that the ACL information changed.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     - The `x` means that the extended attribute information changed.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    - A `n` means the create time (newness) is different and is being updated
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+      to the sender's value (requires `--crtimes`).
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     One other output is possible: when deleting files, the "%i" will output the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     string "`*deleting`" for each item that is being removed (assuming that you
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/rsync.c b/rsync.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/rsync.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/rsync.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -618,6 +618,9 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           memcpy(&sx2.st, &sxp->st, sizeof (sx2.st));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   if (!atimes_ndx || S_ISDIR(sxp->st.st_mode))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           flags |= ATTRS_SKIP_ATIME;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  /* Don't set the creation date on the root folder of an HFS+ volume. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  if (sxp->st.st_ino == 2 && S_ISDIR(sxp->st.st_mode))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          flags |= ATTRS_SKIP_CRTIME;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   if (!(flags & ATTRS_SKIP_MTIME) && !same_mtime(file, &sxp->st, flags & ATTRS_ACCURATE_TIME)) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           sx2.st.st_mtime = file->modtime;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifdef ST_MTIME_NSEC
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -647,6 +650,16 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   file->flags |= FLAG_TIME_FAILED;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef SUPPORT_CRTIMES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  if (crtimes_ndx && !(flags & ATTRS_SKIP_CRTIME)) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          time_t file_crtime = F_CRTIME(file);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          if (sxp->crtime == 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  sxp->crtime = get_create_time(fname);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          if (!same_time(sxp->crtime, 0L, file_crtime, 0L)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           && set_create_time(fname, file_crtime) == 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  updated = 1;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifdef SUPPORT_ACLS
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   /* It's OK to call set_acl() now, even for a dir, as the generator
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -766,7 +779,7 @@ int finish_transfer(const char *fname, const char *fnametmp,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   /* Change permissions before putting the file into place. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   set_file_attrs(fnametmp, file, NULL, fnamecmp,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                  ATTRS_DELAY_IMMUTABLE
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                 | (ok_to_set_time ? ATTRS_ACCURATE_TIME : ATTRS_SKIP_MTIME | ATTRS_SKIP_ATIME));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                 | (ok_to_set_time ? ATTRS_ACCURATE_TIME : ATTRS_SKIP_MTIME | ATTRS_SKIP_ATIME | ATTRS_SKIP_CRTIME));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   /* move tmp file over real file */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   if (DEBUG_GTE(RECV, 1))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -795,7 +808,7 @@ int finish_transfer(const char *fname, const char *fnametmp,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   do_set_file_attrs:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   set_file_attrs(fnametmp, file, NULL, fnamecmp,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                 ok_to_set_time ? ATTRS_ACCURATE_TIME : ATTRS_SKIP_MTIME | ATTRS_SKIP_ATIME);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                 ok_to_set_time ? ATTRS_ACCURATE_TIME : ATTRS_SKIP_MTIME | ATTRS_SKIP_ATIME | ATTRS_SKIP_CRTIME);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   if (temp_copy_name) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           if (do_rename(fnametmp, fname) < 0) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/rsync.h b/rsync.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/rsync.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/rsync.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -70,7 +70,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- /* The following XMIT flags require an rsync that uses a varint for the flag values */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define XMIT_SAME_FLAGS (1<<16)     /* any protocol - restricted by command-line option */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#define XMIT_RESERVED_17 (1<<17)    /* reserved for future crtimes use */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define XMIT_CRTIME_EQ_MTIME (1<<17)        /* any protocol - restricted by command-line option */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- /* These flags are used in the live flist data. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -183,6 +183,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define ATTRS_ACCURATE_TIME       (1<<2)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define ATTRS_SKIP_ATIME  (1<<3)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define ATTRS_DELAY_IMMUTABLE     (1<<4)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define ATTRS_SKIP_CRTIME (1<<5)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define MSG_FLUSH 2
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define FULL_FLUSH        1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -211,6 +212,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define ITEM_REPORT_ACL (1<<7)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define ITEM_REPORT_XATTR (1<<8)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define ITEM_REPORT_FFLAGS (1<<9)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define ITEM_REPORT_CRTIME (1<<10)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define ITEM_BASIS_TYPE_FOLLOWS (1<<11)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define ITEM_XNAME_FOLLOWS (1<<12)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define ITEM_IS_NEW (1<<13)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -577,6 +579,10 @@ typedef unsigned int size_t;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define ST_FLAGS(st) NO_FFLAGS
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef HAVE_GETATTRLIST
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define SUPPORT_CRTIMES 1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- /* Find a variable that is either exactly 32-bits or longer.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  * If some code depends on 32-bit truncation, it will need to
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  * take special action in a "#if SIZEOF_INT32 > 4" section. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -786,6 +792,7 @@ struct file_struct {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int file_extra_cnt;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int inc_recurse;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int atimes_ndx;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+extern int crtimes_ndx;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int pathname_ndx;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int depth_ndx;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int uid_ndx;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -850,6 +857,7 @@ extern int xattrs_ndx;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define F_XATTR(f) REQ_EXTRA(f, xattrs_ndx)->num
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define F_NDX(f) REQ_EXTRA(f, unsort_ndx)->num
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define F_ATIME(f) REQ_EXTRA64(f, atimes_ndx)->num
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define F_CRTIME(f) REQ_EXTRA64(f, crtimes_ndx)->num
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- /* These items are per-entry optional: */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define F_HL_GNUM(f) OPT_EXTRA(f, START_BUMP(f))->num /* non-dirs */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1092,6 +1100,7 @@ typedef struct {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- typedef struct {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     STRUCT_STAT st;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    time_t crtime;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifdef SUPPORT_ACLS
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     struct rsync_acl *acc_acl; /* access ACL */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     struct rsync_acl *def_acl; /* default ACL */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/syscall.c b/syscall.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/syscall.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/syscall.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -55,6 +55,13 @@ extern int open_noatime;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#pragma pack(push, 4)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+struct create_time {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  uint32 length;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  struct timespec crtime;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+};
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#pragma pack(pop)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define RETURN_ERROR_IF(x,e) \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   do { \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           if (x) { \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -493,6 +500,40 @@ int do_setattrlist_times(const char *fname, STRUCT_STAT *stp)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef SUPPORT_CRTIMES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+time_t get_create_time(const char *path)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  static struct create_time attrBuf;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  struct attrlist attrList;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  memset(&attrList, 0, sizeof attrList);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  attrList.bitmapcount = ATTR_BIT_MAP_COUNT;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  attrList.commonattr = ATTR_CMN_CRTIME;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  if (getattrlist(path, &attrList, &attrBuf, sizeof attrBuf, FSOPT_NOFOLLOW) < 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          return 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  return attrBuf.crtime.tv_sec;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef SUPPORT_CRTIMES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+int set_create_time(const char *path, time_t crtime)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  struct attrlist attrList;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  struct timespec ts;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  if (dry_run) return 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RETURN_ERROR_IF_RO_OR_LO;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  ts.tv_sec = crtime;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  ts.tv_nsec = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  memset(&attrList, 0, sizeof attrList);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  attrList.bitmapcount = ATTR_BIT_MAP_COUNT;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  attrList.commonattr = ATTR_CMN_CRTIME;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  return setattrlist(path, &attrList, &ts, sizeof ts, FSOPT_NOFOLLOW);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifdef HAVE_UTIMENSAT
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int do_utimensat(const char *fname, STRUCT_STAT *stp)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/testsuite/crtimes.test b/testsuite/crtimes.test
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-new file mode 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- /dev/null
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/testsuite/crtimes.test
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -0,0 +1,26 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#! /bin/sh
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+# Test rsync copying create times
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+. "$suitedir/rsync.fns"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+$RSYNC --version | grep "  crtimes" >/dev/null || test_skipped "Rsync is configured without crtimes support"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+# Setting an older time via touch sets the create time to the mtime.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+# Setting it to a newer time affects just the mtime.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+mkdir "$fromdir"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+echo hiho "$fromdir/foo"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+touch -t 200101011111.11 "$fromdir"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+touch -t 200202022222.22 "$fromdir"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+touch -t 200111111111.11 "$fromdir/foo"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+touch -t 200212122222.22 "$fromdir/foo"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+TLS_ARGS=--crtimes
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+checkit "$RSYNC -rtgvvv --crtimes \"$fromdir/\" \"$todir/\"" "$fromdir" "$todir"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+# The script would have aborted on error, so getting here means we've won.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+exit 0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/testsuite/rsync.fns b/testsuite/rsync.fns
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/testsuite/rsync.fns
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/testsuite/rsync.fns
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -23,9 +23,9 @@ todir="$tmpdir/to"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- chkdir="$tmpdir/chk"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # For itemized output:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--all_plus='++++++++++'
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--allspace='          '
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--dots='......' # trailing dots after changes
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+all_plus='+++++++++++'
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+allspace='           '
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+dots='.......' # trailing dots after changes
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- tab_ch='  ' # a single tab character
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # Berkley's nice.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/tls.c b/tls.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/tls.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/tls.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -108,6 +108,9 @@ static int stat_xattr(const char *fname, STRUCT_STAT *fst)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- static int display_atimes = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef SUPPORT_CRTIMES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+static int display_crtimes = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- static void failed(char const *what, char const *where)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -143,14 +146,22 @@ static void storetime(char *dest, size_t destsize, time_t t, int nsecs)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- static void list_file(const char *fname)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   STRUCT_STAT buf;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef SUPPORT_CRTIMES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  time_t crtime = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   char permbuf[PERMSTRING_SIZE];
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   char mtimebuf[50];
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   char atimebuf[50];
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  char crtimebuf[50];
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   char linkbuf[4096];
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   int nsecs;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   if (do_lstat(fname, &buf) < 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           failed("stat", fname);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef SUPPORT_CRTIMES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  if (display_crtimes && (crtime = get_create_time(fname)) == 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          failed("get_create_time", fname);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifdef SUPPORT_XATTRS
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   if (am_root < 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           stat_xattr(fname, &buf);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -195,6 +206,12 @@ static void list_file(const char *fname)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           storetime(atimebuf, sizeof atimebuf, S_ISDIR(buf.st_mode) ? 0 : buf.st_atime, -1);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           atimebuf[0] = '\0';
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef SUPPORT_CRTIMES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  if (display_crtimes)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          storetime(crtimebuf, sizeof crtimebuf, crtime, -1);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          crtimebuf[0] = '\0';
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   /* TODO: Perhaps escape special characters in fname? */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   printf("%s ", permbuf);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -204,14 +221,17 @@ static void list_file(const char *fname)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   } else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           printf("%15s", do_big_num(buf.st_size, 1, NULL));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  printf(" %6ld.%-6ld %6ld%s%s %s%s\n",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  printf(" %6ld.%-6ld %6ld%s%s%s %s%s\n",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-          (long)buf.st_uid, (long)buf.st_gid, (long)buf.st_nlink,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--         mtimebuf, atimebuf, fname, linkbuf);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+         mtimebuf, atimebuf, crtimebuf, fname, linkbuf);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- static struct poptOption long_options[] = {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   {"atimes",          'U', POPT_ARG_NONE,   &display_atimes, 0, 0, 0},
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef SUPPORT_CRTIMES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  {"crtimes",         'N', POPT_ARG_NONE,   &display_crtimes, 0, 0, 0},
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   {"link-times",      'l', POPT_ARG_NONE,   &link_times, 0, 0, 0 },
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   {"link-owner",      'L', POPT_ARG_NONE,   &link_owner, 0, 0, 0 },
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifdef SUPPORT_XATTRS
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -231,6 +251,9 @@ static void NORETURN tls_usage(int ret)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   fprintf(F,"Trivial file listing program for portably checking rsync\n");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   fprintf(F,"\nOptions:\n");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   fprintf(F," -U, --atimes                display access (last-used) times\n");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef SUPPORT_CRTIMES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  fprintf(F," -N, --crtimes               display create times (newness)\n");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   fprintf(F," -l, --link-times            display the time on a symlink\n");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   fprintf(F," -L, --link-owner            display the owner+group on a symlink\n");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifdef SUPPORT_XATTRS
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff -Nurp a/proto.h b/proto.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/proto.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/proto.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -286,6 +286,8 @@ int do_lstat(const char *fname, STRUCT_S
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int do_fstat(int fd, STRUCT_STAT *st);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- OFF_T do_lseek(int fd, OFF_T offset, int whence);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int do_setattrlist_times(const char *fname, STRUCT_STAT *stp);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+time_t get_create_time(const char *path);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+int set_create_time(const char *path, time_t crtime);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int do_utimensat(const char *fname, STRUCT_STAT *stp);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int do_lutimes(const char *fname, STRUCT_STAT *stp);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int do_utimes(const char *fname, STRUCT_STAT *stp);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff -Nurp a/rsync.1 b/rsync.1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/rsync.1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/rsync.1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -449,6 +449,7 @@ detailed description below for a complet
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- --times, -t              preserve modification times
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- --atimes, -U             preserve access (use) times
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- --open-noatime           avoid changing the atime on opened files
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+--crtimes, -N            preserve create times (newness)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- --omit-dir-times, -O     omit directories from --times
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- --omit-link-times, -J    omit symlinks from --times
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- --super                  receiver attempts super-user activities
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1429,6 +1430,9 @@ transferred.  If your OS does not suppor
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- will silently ignore this option.  Note also that some filesystems are
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- mounted to avoid updating the atime on read access even without the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- O_NOATIME flag being set.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+.IP "\fB\-\-crtimes\fP, \fB\-N,\fP"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+This tells rsync to set the create times (newness) of +the destination
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+files to the same value as the source files.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- .IP "\fB\-\-omit-dir-times\fP, \fB\-O\fP"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- This tells rsync to omit directories when it is preserving modification
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- times (see \fB\-\-times\fP).  If NFS is sharing the directories on the receiving
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2666,7 +2670,7 @@ also be output, but only if the receivin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- output of other verbose messages).
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- .IP
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- The "%i" escape has a cryptic output that is 11 letters long.  The general
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--format is like the string \fBYXcstpoguaxf\fP, where \fBY\fP is replaced by the type
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+format is like the string \fBYXcstpoguaxfn\fP, where \fBY\fP is replaced by the type
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- of update being done, \fBX\fP is replaced by the file-type, and the other
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- letters represent attributes that may be output if they are being modified.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- .IP
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2741,6 +2745,9 @@ happens when a symlink or directory is u
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- The \fBa\fP means that the ACL information changed.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- .IP o
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- The \fBx\fP means that the extended attribute information changed.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+.IP o
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+A \fBn\fP means the create time (newness) is different and is being updated
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+to the sender's value (requires \fB\-\-crtimes\fP).
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- .RE
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- .IP
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- One other output is possible: when deleting files, the "%i" will output the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff -Nurp a/rsync.1.html b/rsync.1.html
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/rsync.1.html
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/rsync.1.html
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -364,6 +364,7 @@ detailed description below for a complet
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- --times, -t              preserve modification times
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- --atimes, -U             preserve access (use) times
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- --open-noatime           avoid changing the atime on opened files
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+--crtimes, -N            preserve create times (newness)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- --omit-dir-times, -O     omit directories from --times
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- --omit-link-times, -J    omit symlinks from --times
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- --super                  receiver attempts super-user activities
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1313,6 +1314,11 @@ mounted to avoid updating the atime on r
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- O_NOATIME flag being set.</p>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- </dd>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+<dt><code>--crtimes</code>, <code>-N,</code></dt><dd>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+<p>This tells rsync to set the create times (newness) of +the destination
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+files to the same value as the source files.</p>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+</dd>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- <dt><code>--omit-dir-times</code>, <code>-O</code></dt><dd>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- <p>This tells rsync to omit directories when it is preserving modification
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- times (see <code>--times</code>).  If NFS is sharing the directories on the receiving
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2492,7 +2498,7 @@ also be output, but only if the receivin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (you can use <code>-vv</code> with older versions of rsync, but that also turns on the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- output of other verbose messages).</p>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- <p>The &quot;%i&quot; escape has a cryptic output that is 11 letters long.  The general
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--format is like the string <code>YXcstpoguaxf</code>, where <strong>Y</strong> is replaced by the type
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+format is like the string <code>YXcstpoguaxfn</code>, where <strong>Y</strong> is replaced by the type
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- of update being done, <strong>X</strong> is replaced by the file-type, and the other
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- letters represent attributes that may be output if they are being modified.</p>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- <p>The update types that replace the <strong>Y</strong> are as follows:</p>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2546,6 +2552,8 @@ means that the access time will be set t
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- happens when a symlink or directory is updated.</li>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- <li>The <code>a</code> means that the ACL information changed.</li>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- <li>The <code>x</code> means that the extended attribute information changed.</li>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+<li>A <code>n</code> means the create time (newness) is different and is being updated
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+to the sender's value (requires <code>--crtimes</code>).</li>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- </ul>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- <p>One other output is possible: when deleting files, the &quot;%i&quot; will output the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- string &quot;<code>*deleting</code>&quot; for each item that is being removed (assuming that you
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/net/rsync/files/fileflags.diff b/net/rsync/files/fileflags.diff
</span><span style='display:block; white-space:pre;color:#808080;'>index df4e0fcf18c..b1e57522cbc 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/net/rsync/files/fileflags.diff
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/net/rsync/files/fileflags.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -7,11 +7,11 @@ To use this patch, run these commands for a successful build:
</span>     ./configure                         (optional if already run)
     make
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-based-on: 194cee671d5e178f20c4494f41911fa8db942935
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+based-on: e94bad1c156fc3910f24e2b3b71a81b0b0bdeb70
</span> diff --git a/compat.c b/compat.c
 --- a/compat.c
 +++ b/compat.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -39,12 +39,14 @@ extern int checksum_seed;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -39,6 +39,7 @@ extern int checksum_seed;
</span>  extern int basis_dir_cnt;
  extern int prune_empty_dirs;
  extern int protocol_version;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -19,23 +19,24 @@ diff --git a/compat.c b/compat.c
</span>  extern int protect_args;
  extern int preserve_uid;
  extern int preserve_gid;
<span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int preserve_atimes;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -46,6 +47,7 @@ extern int preserve_atimes;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extern int preserve_crtimes;
</span>  extern int preserve_acls;
  extern int preserve_xattrs;
 +extern int preserve_fileflags;
  extern int xfer_flags_as_varint;
  extern int need_messages_from_generator;
  extern int delete_mode, delete_before, delete_during, delete_after;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -75,7 +77,7 @@ int inplace_partial = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int do_negotiated_strings = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -77,7 +79,7 @@ int do_negotiated_strings = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int xmit_id0_names = 0;
</span>  
  /* These index values are for the file-list's extra-attribute array. */
<span style='display:block; white-space:pre;background:#ffe0e0;'>--int pathname_ndx, depth_ndx, atimes_ndx, uid_ndx, gid_ndx, acls_ndx, xattrs_ndx, unsort_ndx;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+int pathname_ndx, depth_ndx, atimes_ndx, uid_ndx, gid_ndx, fileflags_ndx, acls_ndx, xattrs_ndx, unsort_ndx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-int pathname_ndx, depth_ndx, atimes_ndx, crtimes_ndx, uid_ndx, gid_ndx, acls_ndx, xattrs_ndx, unsort_ndx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++int pathname_ndx, depth_ndx, atimes_ndx, crtimes_ndx, uid_ndx, gid_ndx, fileflags_ndx, acls_ndx, xattrs_ndx, unsort_ndx;
</span>  
  int receiver_symlink_times = 0; /* receiver can set the time on a symlink */
  int sender_symlink_iconv = 0; /* sender should convert symlink content */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -561,6 +563,8 @@ void setup_protocol(int f_out,int f_in)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -566,6 +568,8 @@ void setup_protocol(int f_out,int f_in)
</span>           uid_ndx = ++file_extra_cnt;
        if (preserve_gid)
                gid_ndx = ++file_extra_cnt;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -44,10 +45,10 @@ diff --git a/compat.c b/compat.c
</span>   if (preserve_acls && !am_sender)
                acls_ndx = ++file_extra_cnt;
        if (preserve_xattrs)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -714,6 +718,10 @@ void setup_protocol(int f_out,int f_in)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           want_xattr_optim = protocol_version >= 31 && !(compat_flags & CF_AVOID_XATTR_OPTIM);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           proper_seed_order = compat_flags & CF_CHKSUM_SEED_FIX ? 1 : 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           xfer_flags_as_varint = compat_flags & CF_VARINT_FLIST_FLAGS ? 1 : 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -726,6 +730,10 @@ void setup_protocol(int f_out,int f_in)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   fprintf(stderr, "Both rsync versions must be at least 3.2.0 for --crtimes.\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   exit_cleanup(RERR_PROTOCOL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           }
</span> +         if (!xfer_flags_as_varint && preserve_fileflags) {
 +                      fprintf(stderr, "Both rsync versions must be at least 3.2.0 for --fileflags.\n");
 +                      exit_cleanup(RERR_PROTOCOL);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -111,9 +112,9 @@ diff --git a/flist.c b/flist.c
</span>  extern int delete_during;
  extern int missing_args;
  extern int eol_nulls;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -378,6 +379,9 @@ static void send_file_entry(int f, const char *fname, struct file_struct *file,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   static time_t modtime, atime;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -383,6 +384,9 @@ static void send_file_entry(int f, const char *fname, struct file_struct *file,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   static time_t crtime;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span>   static mode_t mode;
 +#ifdef SUPPORT_FILEFLAGS
 +      static uint32 fileflags;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -121,7 +122,7 @@ diff --git a/flist.c b/flist.c
</span>  #ifdef SUPPORT_HARD_LINKS
        static int64 dev;
  #endif
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -421,6 +425,14 @@ static void send_file_entry(int f, const char *fname, struct file_struct *file,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -426,6 +430,14 @@ static void send_file_entry(int f, const char *fname, struct file_struct *file,
</span>           xflags |= XMIT_SAME_MODE;
        else
                mode = file->mode;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -136,8 +137,8 @@ diff --git a/flist.c b/flist.c
</span>  
        if (preserve_devices && IS_DEVICE(mode)) {
                if (protocol_version < 28) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -571,6 +583,10 @@ static void send_file_entry(int f, const char *fname, struct file_struct *file,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           write_varint(f, F_MOD_NSEC(file));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -587,6 +599,10 @@ static void send_file_entry(int f, const char *fname, struct file_struct *file,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span>   if (!(xflags & XMIT_SAME_MODE))
                write_int(f, to_wire_mode(mode));
 +#ifdef SUPPORT_FILEFLAGS
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -147,9 +148,9 @@ diff --git a/flist.c b/flist.c
</span>   if (atimes_ndx && !S_ISDIR(mode) && !(xflags & XMIT_SAME_ATIME))
                write_varlong(f, atime, 4);
        if (preserve_uid && !(xflags & XMIT_SAME_UID)) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -662,6 +678,9 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   static int64 modtime, atime;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -681,6 +697,9 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   static time_t crtime;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span>   static mode_t mode;
 +#ifdef SUPPORT_FILEFLAGS
 +      static uint32 fileflags;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -157,18 +158,18 @@ diff --git a/flist.c b/flist.c
</span>  #ifdef SUPPORT_HARD_LINKS
        static int64 dev;
  #endif
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -771,6 +790,10 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   mode = first->mode;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   if (atimes_ndx && !S_ISDIR(mode))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                           atime = F_ATIME(first);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -797,6 +816,10 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifdef SUPPORT_CRTIMES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   if (crtimes_ndx)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           crtime = F_CRTIME(first);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span> +#ifdef SUPPORT_FILEFLAGS
 +                      if (preserve_fileflags)
 +                              fileflags = F_FFLAGS(first);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span>                   if (preserve_uid)
                                uid = F_OWNER(first);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        if (preserve_gid)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -822,6 +845,10 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -869,6 +892,10 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
</span>  
        if (chmod_modes && !S_ISLNK(mode) && mode)
                mode = tweak_mode(mode, chmod_modes);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -179,7 +180,7 @@ diff --git a/flist.c b/flist.c
</span>  
        if (preserve_uid && !(xflags & XMIT_SAME_UID)) {
                if (protocol_version < 30)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -980,6 +1007,10 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1027,6 +1054,10 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
</span>   }
  #endif
        file->mode = mode;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -190,7 +191,7 @@ diff --git a/flist.c b/flist.c
</span>   if (preserve_uid)
                F_OWNER(file) = uid;
        if (preserve_gid) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1377,6 +1408,10 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1428,6 +1459,10 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
</span>   }
  #endif
        file->mode = st.st_mode;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -215,7 +216,7 @@ diff --git a/generator.c b/generator.c
</span>  extern int delete_mode;
  extern int delete_before;
  extern int delete_during;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -474,6 +476,10 @@ int unchanged_attrs(const char *fname, struct file_struct *file, stat_x *sxp)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -487,6 +489,10 @@ int unchanged_attrs(const char *fname, struct file_struct *file, stat_x *sxp)
</span>                   return 0;
                if (perms_differ(file, sxp))
                        return 0;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -226,7 +227,7 @@ diff --git a/generator.c b/generator.c
</span>           if (ownership_differs(file, sxp))
                        return 0;
  #ifdef SUPPORT_ACLS
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -527,6 +533,11 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -548,6 +554,11 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre
</span>                   iflags |= ITEM_REPORT_OWNER;
                if (gid_ndx && !(file->flags & FLAG_SKIP_GROUP) && sxp->st.st_gid != (gid_t)F_GROUP(file))
                        iflags |= ITEM_REPORT_GROUP;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -238,7 +239,7 @@ diff --git a/generator.c b/generator.c
</span>  #ifdef SUPPORT_ACLS
                if (preserve_acls && !S_ISLNK(file->mode)) {
                        if (!ACL_READY(*sxp))
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1413,6 +1424,10 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1442,6 +1453,10 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
</span>           if (!preserve_perms) { /* See comment in non-dir code below. */
                        file->mode = dest_mode(file->mode, sx.st.st_mode, dflt_perms, statret == 0);
                }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -249,7 +250,7 @@ diff --git a/generator.c b/generator.c
</span>           if (statret != 0 && basis_dir[0] != NULL) {
                        int j = try_dests_non(file, fname, ndx, fnamecmpbuf, &sx, itemizing, code);
                        if (j == -2) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1455,10 +1470,15 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1484,10 +1499,15 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
</span>            * readable and writable permissions during the time we are
                 * putting files within them.  This is then restored to the
                 * former permissions after the transfer is done. */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -266,7 +267,7 @@ diff --git a/generator.c b/generator.c
</span>                           rsyserr(FERROR_XFER, errno,
                                        "failed to modify permissions on %s",
                                        full_fname(fname));
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1493,6 +1513,10 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1522,6 +1542,10 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
</span>           int exists = statret == 0 && !S_ISDIR(sx.st.st_mode);
                file->mode = dest_mode(file->mode, sx.st.st_mode, dflt_perms, exists);
        }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -277,7 +278,7 @@ diff --git a/generator.c b/generator.c
</span>  
  #ifdef SUPPORT_HARD_LINKS
        if (preserve_hard_links && F_HLINK_NOT_FIRST(file)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2073,17 +2097,25 @@ static void touch_up_dirs(struct file_list *flist, int ndx)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2102,17 +2126,25 @@ static void touch_up_dirs(struct file_list *flist, int ndx)
</span>                   continue;
                fname = f_name(file, NULL);
                if (fix_dir_perms)
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -307,8 +308,8 @@ diff --git a/generator.c b/generator.c
</span> diff --git a/log.c b/log.c
 --- a/log.c
 +++ b/log.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -720,7 +720,8 @@ static void log_formatted(enum logcode code, const char *format, const char *op,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        : S_ISLNK(file->mode) ? 'U' : 'u';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -725,7 +725,8 @@ static void log_formatted(enum logcode code, const char *format, const char *op,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        : iflags & ITEM_REPORT_ATIME ? 'u' : 'n';
</span>                   c[9] = !(iflags & ITEM_REPORT_ACL) ? '.' : 'a';
                        c[10] = !(iflags & ITEM_REPORT_XATTR) ? '.' : 'x';
 -                      c[11] = '\0';
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -320,25 +321,25 @@ diff --git a/log.c b/log.c
</span> diff --git a/main.c b/main.c
 --- a/main.c
 +++ b/main.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -28,6 +28,9 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include <locale.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -31,6 +31,9 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifdef __TANDEM
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <floss.h(floss_execlp)>
</span>  #endif
<span style='display:block; white-space:pre;background:#ffe0e0;'>- #include <popt.h>
</span> +#ifdef SUPPORT_FORCE_CHANGE
 +#include <sys/sysctl.h>
 +#endif
  
  extern int dry_run;
  extern int list_only;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -54,6 +57,7 @@ extern int copy_unsafe_links;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int keep_dirlinks;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int preserve_hard_links;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int protocol_version;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -48,6 +51,7 @@ extern int called_from_signal_handler;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extern int need_messages_from_generator;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extern int kluge_around_eof;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extern int got_xfer_error;
</span> +extern int force_change;
<span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int file_total;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int recurse;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int xfer_dirs;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -944,6 +948,22 @@ static int do_recv(int f_in, int f_out, char *local_name)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extern int msgs2stderr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extern int module_id;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extern int read_only;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -970,6 +974,22 @@ static int do_recv(int f_in, int f_out, char *local_name)
</span>    * points to an identical file won't be replaced by the referent. */
        copy_links = copy_dirlinks = copy_unsafe_links = 0;
  
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -364,7 +365,7 @@ diff --git a/main.c b/main.c
</span> diff --git a/options.c b/options.c
 --- a/options.c
 +++ b/options.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -57,6 +57,7 @@ int preserve_hard_links = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -53,6 +53,7 @@ int preserve_hard_links = 0;
</span>  int preserve_acls = 0;
  int preserve_xattrs = 0;
  int preserve_perms = 0;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -372,27 +373,15 @@ diff --git a/options.c b/options.c
</span>  int preserve_executability = 0;
  int preserve_devices = 0;
  int preserve_specials = 0;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -93,6 +94,7 @@ int numeric_ids = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int msgs2stderr = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -90,6 +91,7 @@ int numeric_ids = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int msgs2stderr = 2; /* Default: send errors to stderr for local & remote-shell transfers */
</span>  int allow_8bit_chars = 0;
  int force_delete = 0;
 +int force_change = 0;
  int io_timeout = 0;
  int prune_empty_dirs = 0;
  int use_qsort = 0;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -664,6 +666,11 @@ static void print_info_flags(enum logcode f)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   "prealloc",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifndef SUPPORT_FILEFLAGS
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          "no "
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  "file-flags",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   "*Optimizations",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifndef HAVE_SIMD
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -816,6 +823,8 @@ static struct poptOption long_options[] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -614,6 +616,8 @@ static struct poptOption long_options[] = {
</span>    {"perms",           'p', POPT_ARG_VAL,    &preserve_perms, 1, 0, 0 },
    {"no-perms",         0,  POPT_ARG_VAL,    &preserve_perms, 0, 0, 0 },
    {"no-p",             0,  POPT_ARG_VAL,    &preserve_perms, 0, 0, 0 },
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -401,7 +390,7 @@ diff --git a/options.c b/options.c
</span>    {"executability",   'E', POPT_ARG_NONE,   &preserve_executability, 0, 0, 0 },
    {"acls",            'A', POPT_ARG_NONE,   0, 'A', 0, 0 },
    {"no-acls",          0,  POPT_ARG_VAL,    &preserve_acls, 0, 0, 0 },
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -910,6 +919,12 @@ static struct poptOption long_options[] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -711,6 +715,12 @@ static struct poptOption long_options[] = {
</span>    {"remove-source-files",0,POPT_ARG_VAL,    &remove_source_files, 1, 0, 0 },
    {"force",            0,  POPT_ARG_VAL,    &force_delete, 1, 0, 0 },
    {"no-force",         0,  POPT_ARG_VAL,    &force_delete, 0, 0, 0 },
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -414,9 +403,9 @@ diff --git a/options.c b/options.c
</span>    {"ignore-errors",    0,  POPT_ARG_VAL,    &ignore_errors, 1, 0, 0 },
    {"no-ignore-errors", 0,  POPT_ARG_VAL,    &ignore_errors, 0, 0, 0 },
    {"max-delete",       0,  POPT_ARG_INT,    &max_delete, 0, 0, 0 },
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1198,6 +1213,14 @@ static void set_refuse_options(void)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifndef HAVE_SETVBUF
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   parse_one_refuse_match(0, "outbuf", list_end);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -998,6 +1008,14 @@ static void set_refuse_options(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifndef SUPPORT_CRTIMES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   parse_one_refuse_match(0, "crtimes", list_end);
</span>  #endif
 +#ifndef SUPPORT_FILEFLAGS
 +      parse_one_refuse_match(0, "fileflags", list_end);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -429,7 +418,7 @@ diff --git a/options.c b/options.c
</span>  
        /* Now we use the descrip values to actually mark the options for refusal. */
        for (op = long_options; op != list_end; op++) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2646,6 +2669,9 @@ void server_options(char **args, int *argc_p)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2646,6 +2664,9 @@ void server_options(char **args, int *argc_p)
</span>   if (xfer_dirs && !recurse && delete_mode && am_sender)
                args[ac++] = "--no-r";
  
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -439,7 +428,7 @@ diff --git a/options.c b/options.c
</span>   if (do_compression && do_compression_level != CLVL_NOT_SPECIFIED) {
                if (asprintf(&arg, "--compress-level=%d", do_compression_level) < 0)
                        goto oom;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2749,6 +2775,16 @@ void server_options(char **args, int *argc_p)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2754,6 +2775,16 @@ void server_options(char **args, int *argc_p)
</span>                   args[ac++] = "--delete-excluded";
                if (force_delete)
                        args[ac++] = "--force";
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -459,7 +448,7 @@ diff --git a/options.c b/options.c
</span> diff --git a/rsync.1.md b/rsync.1.md
 --- a/rsync.1.md
 +++ b/rsync.1.md
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -360,6 +360,7 @@ detailed description below for a complete description.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -361,6 +361,7 @@ detailed description below for a complete description.
</span>  --keep-dirlinks, -K      treat symlinked dir on receiver as dir
  --hard-links, -H         preserve hard links
  --perms, -p              preserve permissions
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -467,7 +456,7 @@ diff --git a/rsync.1.md b/rsync.1.md
</span>  --executability, -E      preserve executability
  --chmod=CHMOD            affect file and/or directory permissions
  --acls, -A               preserve ACLs (implies --perms)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -399,7 +400,10 @@ detailed description below for a complete description.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -401,7 +402,10 @@ detailed description below for a complete description.
</span>  --ignore-missing-args    ignore missing source args without error
  --delete-missing-args    delete missing source args from destination
  --ignore-errors          delete even if there are I/O errors
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -479,7 +468,7 @@ diff --git a/rsync.1.md b/rsync.1.md
</span>  --max-delete=NUM         don't delete more than NUM files
  --max-size=SIZE          don't transfer any file larger than SIZE
  --min-size=SIZE          don't transfer any file smaller than SIZE
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -700,6 +704,8 @@ your home directory (remove the '=' for that).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -717,6 +721,8 @@ your home directory (remove the '=' for that).
</span>  
      Note that `-a` **does not preserve hardlinks**, because finding
      multiply-linked files is expensive.  You must separately specify `-H`.
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -488,7 +477,7 @@ diff --git a/rsync.1.md b/rsync.1.md
</span>  
  0.  `--no-OPTION`
  
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1038,7 +1044,7 @@ your home directory (remove the '=' for that).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1076,7 +1082,7 @@ your home directory (remove the '=' for that).
</span>      Without this option, if the sending side has replaced a directory with a
      symlink to a directory, the receiving side will delete anything that is in
      the way of the new symlink, including a directory hierarchy (as long as
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -497,7 +486,7 @@ diff --git a/rsync.1.md b/rsync.1.md
</span>  
      See also `--keep-dirlinks` for an analogous option for the receiving side.
  
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1224,6 +1230,29 @@ your home directory (remove the '=' for that).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1262,6 +1268,29 @@ your home directory (remove the '=' for that).
</span>      those used by `--fake-super`) unless you repeat the option (e.g. `-XX`).
      This "copy all xattrs" mode cannot be used with `--fake-super`.
  
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -527,21 +516,21 @@ diff --git a/rsync.1.md b/rsync.1.md
</span>  0.  `--chmod=CHMOD`
  
      This option tells rsync to apply one or more comma-separated "chmod" modes
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1686,7 +1715,7 @@ your home directory (remove the '=' for that).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1729,7 +1758,7 @@ your home directory (remove the '=' for that).
</span>      option a step farther: each missing arg will become a deletion request of
      the corresponding destination file on the receiving side (should it exist).
      If the destination file is a non-empty directory, it will only be
 -    successfully deleted if `--force` or `--delete` are in effect.  Other than
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+    successfully deleted if `--force-delee` or `--delete` are in effect.  Other than
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    successfully deleted if `--force-delete` or `--delete` are in effect.  Other than
</span>      that, this option is independent of any other type of delete processing.
  
      The missing source files are represented by special file-list entries which
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1697,15 +1726,16 @@ your home directory (remove the '=' for that).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1740,15 +1769,16 @@ your home directory (remove the '=' for that).
</span>      Tells `--delete` to go ahead and delete files even when there are I/O
      errors.
  
 -0.  `--force`
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+0.  `--force-delee`
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++0.  `--force-delete`
</span>  
      This option tells rsync to delete a non-empty directory when it is to be
      replaced by a non-directory.  This is only relevant if deletions are not
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -557,7 +546,7 @@ diff --git a/rsync.1.md b/rsync.1.md
</span>  
  0.  `--max-delete=NUM`
  
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2612,7 +2642,7 @@ your home directory (remove the '=' for that).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2700,7 +2730,7 @@ your home directory (remove the '=' for that).
</span>      output of other verbose messages).
  
      The "%i" escape has a cryptic output that is 11 letters long.  The general
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -626,7 +615,7 @@ diff --git a/rsync.c b/rsync.c
</span>                           /* We shouldn't have attempted to change uid
                                 * or gid unless have the privilege. */
                                rsyserr(FERROR_XFER, errno, "%s %s failed",
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -629,7 +663,7 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -642,7 +676,7 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
</span>  
  #ifdef HAVE_CHMOD
        if (!BITS_EQUAL(sxp->st.st_mode, new_mode, CHMOD_BITS)) {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -635,7 +624,7 @@ diff --git a/rsync.c b/rsync.c
</span>           if (ret < 0) {
                        rsyserr(FERROR_XFER, errno,
                                "failed to set permissions on %s",
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -641,6 +675,19 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -654,6 +688,19 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
</span>   }
  #endif
  
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -655,17 +644,17 @@ diff --git a/rsync.c b/rsync.c
</span>   if (INFO_GTE(NAME, 2) && flags & ATTRS_REPORT) {
                if (updated)
                        rprintf(FCLIENT, "%s\n", fname);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -718,7 +765,8 @@ int finish_transfer(const char *fname, const char *fnametmp,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -731,7 +778,8 @@ int finish_transfer(const char *fname, const char *fnametmp,
</span>  
        /* Change permissions before putting the file into place. */
        set_file_attrs(fnametmp, file, NULL, fnamecmp,
<span style='display:block; white-space:pre;background:#ffe0e0;'>--                      ok_to_set_time ? ATTRS_ACCURATE_TIME : ATTRS_SKIP_MTIME | ATTRS_SKIP_ATIME);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                 ok_to_set_time ? ATTRS_ACCURATE_TIME : ATTRS_SKIP_MTIME | ATTRS_SKIP_ATIME | ATTRS_SKIP_CRTIME);
</span> +                ATTRS_DELAY_IMMUTABLE
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+                      | (ok_to_set_time ? ATTRS_ACCURATE_TIME : ATTRS_SKIP_MTIME | ATTRS_SKIP_ATIME));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                 | (ok_to_set_time ? ATTRS_ACCURATE_TIME : ATTRS_SKIP_MTIME | ATTRS_SKIP_ATIME | ATTRS_SKIP_CRTIME));
</span>  
        /* move tmp file over real file */
        if (DEBUG_GTE(RECV, 1))
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -735,6 +783,10 @@ int finish_transfer(const char *fname, const char *fnametmp,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -748,6 +796,10 @@ int finish_transfer(const char *fname, const char *fnametmp,
</span>   }
        if (ret == 0) {
                /* The file was moved into place (not copied), so it's done. */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -685,7 +674,7 @@ diff --git a/rsync.h b/rsync.h
</span>  
 -#define XMIT_RESERVED_16 (1<<16)        /* reserved for future fileflags use */
 +#define XMIT_SAME_FLAGS (1<<16)         /* any protocol - restricted by command-line option */
<span style='display:block; white-space:pre;background:#ffe0e0;'>- #define XMIT_RESERVED_17 (1<<17)         /* reserved for future crtimes use */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define XMIT_CRTIME_EQ_MTIME (1<<17)        /* any protocol - restricted by command-line option */
</span>  
  /* These flags are used in the live flist data. */
 @@ -182,6 +182,7 @@
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -693,19 +682,19 @@ diff --git a/rsync.h b/rsync.h
</span>  #define ATTRS_ACCURATE_TIME      (1<<2)
  #define ATTRS_SKIP_ATIME      (1<<3)
 +#define ATTRS_DELAY_IMMUTABLE (1<<4)
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define ATTRS_SKIP_CRTIME      (1<<5)
</span>  
  #define MSG_FLUSH     2
<span style='display:block; white-space:pre;background:#ffe0e0;'>- #define FULL_FLUSH     1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -209,6 +210,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -210,6 +211,7 @@
</span>  #define ITEM_REPORT_GROUP (1<<6)
  #define ITEM_REPORT_ACL (1<<7)
  #define ITEM_REPORT_XATTR (1<<8)
 +#define ITEM_REPORT_FFLAGS (1<<9)
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define ITEM_REPORT_CRTIME (1<<10)
</span>  #define ITEM_BASIS_TYPE_FOLLOWS (1<<11)
  #define ITEM_XNAME_FOLLOWS (1<<12)
<span style='display:block; white-space:pre;background:#ffe0e0;'>- #define ITEM_IS_NEW (1<<13)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -550,6 +552,31 @@ typedef unsigned int size_t;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -578,6 +580,31 @@ typedef unsigned int size_t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define SUPPORT_CRTIMES 1
</span>  #endif
  
 +#define NO_FFLAGS ((uint32)-1)
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -736,7 +725,7 @@ diff --git a/rsync.h b/rsync.h
</span>  /* Find a variable that is either exactly 32-bits or longer.
   * If some code depends on 32-bit truncation, it will need to
   * take special action in a "#if SIZEOF_INT32 > 4" section. */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -763,6 +790,7 @@ extern int pathname_ndx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -804,6 +831,7 @@ extern int pathname_ndx;
</span>  extern int depth_ndx;
  extern int uid_ndx;
  extern int gid_ndx;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -744,7 +733,7 @@ diff --git a/rsync.h b/rsync.h
</span>  extern int acls_ndx;
  extern int xattrs_ndx;
  
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -813,6 +841,11 @@ extern int xattrs_ndx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -858,6 +886,11 @@ extern int xattrs_ndx;
</span>  /* When the associated option is on, all entries will have these present: */
  #define F_OWNER(f) REQ_EXTRA(f, uid_ndx)->unum
  #define F_GROUP(f) REQ_EXTRA(f, gid_ndx)->unum
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -767,7 +756,7 @@ diff --git a/syscall.c b/syscall.c
</span>  extern int inplace;
  extern int preallocate_files;
  extern int preserve_perms;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -68,7 +69,23 @@ int do_unlink(const char *fname)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -77,7 +78,23 @@ int do_unlink(const char *fname)
</span>  {
        if (dry_run) return 0;
        RETURN_ERROR_IF_RO_OR_LO;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -792,7 +781,7 @@ diff --git a/syscall.c b/syscall.c
</span>  }
  
  #ifdef SUPPORT_LINKS
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -129,14 +146,35 @@ int do_link(const char *old_path, const char *new_path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -142,14 +159,35 @@ int do_link(const char *old_path, const char *new_path)
</span>  }
  #endif
  
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -830,7 +819,7 @@ diff --git a/syscall.c b/syscall.c
</span>  }
  
  int do_mknod(const char *pathname, mode_t mode, dev_t dev)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -176,7 +214,7 @@ int do_mknod(const char *pathname, mode_t mode, dev_t dev)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -189,7 +227,7 @@ int do_mknod(const char *pathname, mode_t mode, dev_t dev)
</span>                   return -1;
                close(sock);
  #ifdef HAVE_CHMOD
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -839,7 +828,7 @@ diff --git a/syscall.c b/syscall.c
</span>  #else
                return 0;
  #endif
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -193,7 +231,22 @@ int do_rmdir(const char *pathname)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -206,7 +244,22 @@ int do_rmdir(const char *pathname)
</span>  {
        if (dry_run) return 0;
        RETURN_ERROR_IF_RO_OR_LO;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -863,7 +852,7 @@ diff --git a/syscall.c b/syscall.c
</span>  }
  
  int do_open(const char *pathname, int flags, mode_t mode)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -212,7 +265,7 @@ int do_open(const char *pathname, int flags, mode_t mode)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -225,7 +278,7 @@ int do_open(const char *pathname, int flags, mode_t mode)
</span>  }
  
  #ifdef HAVE_CHMOD
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -872,7 +861,7 @@ diff --git a/syscall.c b/syscall.c
</span>  {
        int code;
        if (dry_run) return 0;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -235,17 +288,72 @@ int do_chmod(const char *path, mode_t mode)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -248,17 +301,72 @@ int do_chmod(const char *path, mode_t mode)
</span>   } else
                code = chmod(path, mode & CHMOD_BITS); /* DISCOURAGED FUNCTION */
  #endif /* !HAVE_LCHMOD */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -998,6 +987,21 @@ diff --git a/testsuite/rsync.fns b/testsuite/rsync.fns
</span>  tab_ch=' ' # a single tab character
  
  # Berkley's nice.
<span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/usage.c b/usage.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/usage.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/usage.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -131,6 +131,11 @@ static void print_info_flags(enum logcode f)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   "crtimes",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef SUPPORT_FILEFLAGS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          "no "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  "file-flags",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   "*Optimizations",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifndef HAVE_SIMD
</span> diff --git a/util.c b/util.c
 --- a/util.c
 +++ b/util.c
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1079,7 +1083,7 @@ diff --git a/util.c b/util.c
</span> diff --git a/xattrs.c b/xattrs.c
 --- a/xattrs.c
 +++ b/xattrs.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1204,7 +1204,7 @@ int set_stat_xattr(const char *fname, struct file_struct *file, mode_t new_mode)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1202,7 +1202,7 @@ int set_stat_xattr(const char *fname, struct file_struct *file, mode_t new_mode)
</span>   mode = (fst.st_mode & _S_IFMT) | (fmode & ACCESSPERMS)
             | (S_ISDIR(fst.st_mode) ? 0700 : 0600);
        if (fst.st_mode != mode)
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1088,37 +1092,10 @@ diff --git a/xattrs.c b/xattrs.c
</span>   if (!IS_DEVICE(fst.st_mode))
                fst.st_rdev = 0; /* just in case */
  
<span style='display:block; white-space:pre;background:#ffe0e0;'>-diff -Nurp a/proto.h b/proto.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/proto.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/proto.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -246,6 +246,8 @@ int read_ndx_and_attrs(int f_in, int f_o
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- void free_sums(struct sum_struct *s);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- mode_t dest_mode(mode_t flist_mode, mode_t stat_mode, int dflt_perms,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            int exists);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+int make_mutable(const char *fname, mode_t mode, uint32 fileflags, uint32 iflags);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+int undo_make_mutable(const char *fname, uint32 fileflags);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-              const char *fnamecmp, int flags);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- void sig_int(int sig_num);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -268,11 +270,12 @@ int do_unlink(const char *fname);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int do_symlink(const char *lnk, const char *fname);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ssize_t do_readlink(const char *path, char *buf, size_t bufsiz);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int do_link(const char *old_path, const char *new_path);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--int do_lchown(const char *path, uid_t owner, gid_t group);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+int do_lchown(const char *path, uid_t owner, gid_t group, UNUSED(mode_t mode), UNUSED(uint32 fileflags));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int do_mknod(const char *pathname, mode_t mode, dev_t dev);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int do_rmdir(const char *pathname);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int do_open(const char *pathname, int flags, mode_t mode);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--int do_chmod(const char *path, mode_t mode);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+int do_chmod(const char *path, mode_t mode, UNUSED(uint32 fileflags));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+int do_chflags(const char *path, uint32 fileflags);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int do_rename(const char *old_path, const char *new_path);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int do_ftruncate(int fd, OFF_T size);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- void trim_trailing_slashes(char *name);
</span> diff -Nurp a/rsync.1 b/rsync.1
 --- a/rsync.1
 +++ b/rsync.1
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -436,6 +436,7 @@ detailed description below for a complet
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -437,6 +437,7 @@ detailed description below for a complet
</span>  --keep-dirlinks, -K      treat symlinked dir on receiver as dir
  --hard-links, -H         preserve hard links
  --perms, -p              preserve permissions
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1126,7 +1103,7 @@ diff -Nurp a/rsync.1 b/rsync.1
</span>  --executability, -E      preserve executability
  --chmod=CHMOD            affect file and/or directory permissions
  --acls, -A               preserve ACLs (implies --perms)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -475,7 +476,10 @@ detailed description below for a complet
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -477,7 +478,10 @@ detailed description below for a complet
</span>  --ignore-missing-args    ignore missing source args without error
  --delete-missing-args    delete missing source args from destination
  --ignore-errors          delete even if there are I/O errors
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1138,7 +1115,7 @@ diff -Nurp a/rsync.1 b/rsync.1
</span>  --max-delete=NUM         don't delete more than NUM files
  --max-size=SIZE          don't transfer any file larger than SIZE
  --min-size=SIZE          don't transfer any file smaller than SIZE
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -763,6 +767,8 @@ omission).  The only exception to the ab
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -783,6 +787,8 @@ omission).  The only exception to the ab
</span>  .IP
  Note that \fB\-a\fP \fBdoes not preserve hardlinks\fP, because finding
  multiply-linked files is expensive.  You must separately specify \fB\-H\fP.
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1147,7 +1124,7 @@ diff -Nurp a/rsync.1 b/rsync.1
</span>  .IP "\fB\-\-no-OPTION\fP"
  You may turn off one or more implied options by prefixing the option name
  with "no-".  Not all options may be prefixed with a "no-": only options that
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1092,7 +1098,7 @@ to non-directories to be affected, as th
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1139,7 +1145,7 @@ to non-directories to be affected, as th
</span>  Without this option, if the sending side has replaced a directory with a
  symlink to a directory, the receiving side will delete anything that is in
  the way of the new symlink, including a directory hierarchy (as long as
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1156,7 +1133,7 @@ diff -Nurp a/rsync.1 b/rsync.1
</span>  .IP
  See also \fB\-\-keep-dirlinks\fP for an analogous option for the receiving side.
  .IP
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1301,6 +1307,25 @@ receiver-only rule that excludes all nam
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1348,6 +1354,25 @@ receiver-only rule that excludes all nam
</span>  Note that the \fB\-X\fP option does not copy rsync's special xattr values (e.g.
  those used by \fB\-\-fake-super\fP) unless you repeat the option (e.g. \fB\-XX\fP).
  This "copy all xattrs" mode cannot be used with \fB\-\-fake-super\fP.
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1182,21 +1159,21 @@ diff -Nurp a/rsync.1 b/rsync.1
</span>  .IP "\fB\-\-chmod=CHMOD\fP"
  This option tells rsync to apply one or more comma-separated "chmod" modes
  to the permission of the files in the transfer.  The resulting value is
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1723,7 +1748,7 @@ This option takes the behavior of (the i
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1773,7 +1798,7 @@ This option takes the behavior of (the i
</span>  option a step farther: each missing arg will become a deletion request of
  the corresponding destination file on the receiving side (should it exist).
  If the destination file is a non-empty directory, it will only be
 -successfully deleted if \fB\-\-force\fP or \fB\-\-delete\fP are in effect.  Other than
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+successfully deleted if \fB\-\-force-delee\fP or \fB\-\-delete\fP are in effect.  Other than
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++successfully deleted if \fB\-\-force-delete\fP or \fB\-\-delete\fP are in effect.  Other than
</span>  that, this option is independent of any other type of delete processing.
  .IP
  The missing source files are represented by special file-list entries which
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1731,14 +1756,15 @@ display as a "\fB*missing\fP" entry in t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1781,14 +1806,15 @@ display as a "\fB*missing\fP" entry in t
</span>  .IP "\fB\-\-ignore-errors\fP"
  Tells \fB\-\-delete\fP to go ahead and delete files even when there are I/O
  errors.
 -.IP "\fB\-\-force\fP"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+.IP "\fB\-\-force-delee\fP"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++.IP "\fB\-\-force-delete\fP"
</span>  This option tells rsync to delete a non-empty directory when it is to be
  replaced by a non-directory.  This is only relevant if deletions are not
  active (see \fB\-\-delete\fP for details).
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1211,7 +1188,7 @@ diff -Nurp a/rsync.1 b/rsync.1
</span>  .IP "\fB\-\-max-delete=NUM\fP"
  This tells rsync not to delete more than NUM files or directories.  If that
  limit is exceeded, all further deletions are skipped through the end of the
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2640,7 +2666,7 @@ also be output, but only if the receivin
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2735,7 +2761,7 @@ also be output, but only if the receivin
</span>  output of other verbose messages).
  .IP
  The "%i" escape has a cryptic output that is 11 letters long.  The general
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1223,7 +1200,7 @@ diff -Nurp a/rsync.1 b/rsync.1
</span> diff -Nurp a/rsync.1.html b/rsync.1.html
 --- a/rsync.1.html
 +++ b/rsync.1.html
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -351,6 +351,7 @@ detailed description below for a complet
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -352,6 +352,7 @@ detailed description below for a complet
</span>  --keep-dirlinks, -K      treat symlinked dir on receiver as dir
  --hard-links, -H         preserve hard links
  --perms, -p              preserve permissions
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1231,7 +1208,7 @@ diff -Nurp a/rsync.1.html b/rsync.1.html
</span>  --executability, -E      preserve executability
  --chmod=CHMOD            affect file and/or directory permissions
  --acls, -A               preserve ACLs (implies --perms)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -390,7 +391,10 @@ detailed description below for a complet
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -392,7 +393,10 @@ detailed description below for a complet
</span>  --ignore-missing-args    ignore missing source args without error
  --delete-missing-args    delete missing source args from destination
  --ignore-errors          delete even if there are I/O errors
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1243,7 +1220,7 @@ diff -Nurp a/rsync.1.html b/rsync.1.html
</span>  --max-delete=NUM         don't delete more than NUM files
  --max-size=SIZE          don't transfer any file larger than SIZE
  --min-size=SIZE          don't transfer any file smaller than SIZE
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -672,7 +676,9 @@ recursion and want to preserve almost ev
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -697,7 +701,9 @@ recursion and want to preserve almost ev
</span>  omission).  The only exception to the above equivalence is when
  <code>--files-from</code> is specified, in which case <code>-r</code> is not implied.</p>
  <p>Note that <code>-a</code> <strong>does not preserve hardlinks</strong>, because finding
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1254,7 +1231,7 @@ diff -Nurp a/rsync.1.html b/rsync.1.html
</span>  </dd>
  
  <dt><code>--no-OPTION</code></dt><dd>
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -992,7 +998,7 @@ to non-directories to be affected, as th
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1039,7 +1045,7 @@ to non-directories to be affected, as th
</span>  <p>Without this option, if the sending side has replaced a directory with a
  symlink to a directory, the receiving side will delete anything that is in
  the way of the new symlink, including a directory hierarchy (as long as
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1263,7 +1240,7 @@ diff -Nurp a/rsync.1.html b/rsync.1.html
</span>  <p>See also <code>--keep-dirlinks</code> for an analogous option for the receiving side.</p>
  <p><code>--copy-dirlinks</code> applies to all symlinks to directories in the source.  If
  you want to follow only a few specified symlinks, a trick you can use is to
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1172,6 +1178,33 @@ those used by <code>--fake-super</code>)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1219,6 +1225,33 @@ those used by <code>--fake-super</code>)
</span>  This &quot;copy all xattrs&quot; mode cannot be used with <code>--fake-super</code>.</p>
  </dd>
  
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1297,21 +1274,21 @@ diff -Nurp a/rsync.1.html b/rsync.1.html
</span>  <dt><code>--chmod=CHMOD</code></dt><dd>
  <p>This option tells rsync to apply one or more comma-separated &quot;chmod&quot; modes
  to the permission of the files in the transfer.  The resulting value is
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1600,7 +1633,7 @@ is no longer there.</p>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1652,7 +1685,7 @@ is no longer there.</p>
</span>  option a step farther: each missing arg will become a deletion request of
  the corresponding destination file on the receiving side (should it exist).
  If the destination file is a non-empty directory, it will only be
 -successfully deleted if <code>--force</code> or <code>--delete</code> are in effect.  Other than
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+successfully deleted if <code>--force-delee</code> or <code>--delete</code> are in effect.  Other than
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++successfully deleted if <code>--force-delete</code> or <code>--delete</code> are in effect.  Other than
</span>  that, this option is independent of any other type of delete processing.</p>
  <p>The missing source files are represented by special file-list entries which
  display as a &quot;<code>*missing</code>&quot; entry in the <code>--list-only</code> output.</p>
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1611,13 +1644,14 @@ display as a &quot;<code>*missing</code>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1663,13 +1696,14 @@ display as a &quot;<code>*missing</code>
</span>  errors.</p>
  </dd>
  
 -<dt><code>--force</code></dt><dd>
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+<dt><code>--force-delee</code></dt><dd>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++<dt><code>--force-delete</code></dt><dd>
</span>  <p>This option tells rsync to delete a non-empty directory when it is to be
  replaced by a non-directory.  This is only relevant if deletions are not
  active (see <code>--delete</code> for details).</p>
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1325,7 +1302,7 @@ diff -Nurp a/rsync.1.html b/rsync.1.html
</span>  </dd>
  
  <dt><code>--max-delete=NUM</code></dt><dd>
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2458,7 +2492,7 @@ also be output, but only if the receivin
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2552,7 +2586,7 @@ also be output, but only if the receivin
</span>  (you can use <code>-vv</code> with older versions of rsync, but that also turns on the
  output of other verbose messages).</p>
  <p>The &quot;%i&quot; escape has a cryptic output that is 11 letters long.  The general
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/net/rsync/files/rsyncd.conf.example b/net/rsync/files/rsyncd.conf.example
</span><span style='display:block; white-space:pre;color:#808080;'>index 0e604729bfd..09cd42aff4e 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/net/rsync/files/rsyncd.conf.example
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/net/rsync/files/rsyncd.conf.example
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,5 +1,5 @@
</span> # Sample rsyncd configuration file.
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# You must rename it rsyncd.conf to use it.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# You must copy it to rsyncd.conf to use it.
</span> 
 
 log file=__PREFIX__/var/log/rsyncd.log
</pre><pre style='margin:0'>

</pre>