<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 "%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 <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 "%i" will output the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- string "<code>*deleting</code>" 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 "copy all xattrs" 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 "chmod" 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 "<code>*missing</code>" 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 "<code>*missing</code>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1663,13 +1696,14 @@ display as a "<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 "%i" 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>