./configure (optional if already run)
make
-based-on: 0ac7ebceef70417355f25daf9e2fd94e84c49749
+based-on: 43f70b961e92d88387fecd3c7f6dbefc044ce4a3
diff --git a/generator.c b/generator.c
--- a/generator.c
+++ b/generator.c
continue;
if (DEBUG_GTE(RECV, 1)) {
rprintf(FINFO, "renaming %s to %s\n",
-@@ -745,7 +745,7 @@ int recv_files(int f_in, int f_out, char *local_name)
+@@ -748,7 +748,7 @@ int recv_files(int f_in, int f_out, char *local_name)
} else {
/* Reminder: --inplace && --partial-dir are never
* enabled at the same time. */
diff --git a/rsync.1.md b/rsync.1.md
--- a/rsync.1.md
+++ b/rsync.1.md
-@@ -348,6 +348,7 @@ has its own detailed description later in this manpage.
+@@ -366,6 +366,7 @@ has its own detailed description later in this manpage.
--relative, -R use relative path names
--no-implied-dirs don't send implied dirs with --relative
--backup, -b make backups (see --suffix & --backup-dir)
--backup-dir=DIR make backups into hierarchy based in DIR
--suffix=SUFFIX backup suffix (default ~ w/o --backup-dir)
--update, -u skip files that are newer on the receiver
-@@ -914,6 +915,13 @@ your home directory (remove the '=' for that).
+@@ -939,6 +940,13 @@ option name from the pathname using a space if you want the shell to expand it.
rules specify a trailing inclusion/exclusion of `*`, the auto-added rule
would never be reached).
diff --git a/rsync.1.md b/rsync.1.md
--- a/rsync.1.md
+++ b/rsync.1.md
-@@ -350,7 +350,9 @@ has its own detailed description later in this manpage.
+@@ -368,7 +368,9 @@ has its own detailed description later in this manpage.
--backup, -b make backups (see --suffix & --backup-dir)
--backup-deleted make backups only of deleted files
--backup-dir=DIR make backups into hierarchy based in DIR
--update, -u skip files that are newer on the receiver
--inplace update destination files in-place
--append append data onto shorter files
-@@ -936,6 +938,11 @@ your home directory (remove the '=' for that).
+@@ -961,6 +963,11 @@ option name from the pathname using a space if you want the shell to expand it.
daemon is the receiver, the backup dir cannot go outside the module's path
hierarchy, so take extra care not to delete it or copy into it.
./configure (optional if already run)
make
-based-on: 0ac7ebceef70417355f25daf9e2fd94e84c49749
+based-on: 43f70b961e92d88387fecd3c7f6dbefc044ce4a3
diff --git a/errcode.h b/errcode.h
--- a/errcode.h
+++ b/errcode.h
diff --git a/main.c b/main.c
--- a/main.c
+++ b/main.c
-@@ -216,8 +216,11 @@ static void wait_process_with_flush(pid_t pid, int *exit_code_ptr)
+@@ -217,8 +217,11 @@ static void wait_process_with_flush(pid_t pid, int *exit_code_ptr)
*exit_code_ptr = RERR_TERMINATED;
else
*exit_code_ptr = RERR_WAITCHILD;
}
void write_del_stats(int f)
-@@ -1631,6 +1634,14 @@ void remember_children(UNUSED(int val))
+@@ -1636,6 +1639,14 @@ void remember_children(UNUSED(int val))
break;
}
}
}
#endif
#ifndef HAVE_SIGACTION
-@@ -1684,6 +1695,13 @@ static void rsync_panic_handler(UNUSED(int whatsig))
+@@ -1689,6 +1700,13 @@ static void rsync_panic_handler(UNUSED(int whatsig))
}
#endif
static void unset_env_var(const char *var)
{
#ifdef HAVE_UNSETENV
-@@ -1700,7 +1718,6 @@ static void unset_env_var(const char *var)
+@@ -1705,7 +1723,6 @@ static void unset_env_var(const char *var)
#endif
}
int main(int argc,char *argv[])
{
int ret;
-@@ -1724,6 +1741,11 @@ int main(int argc,char *argv[])
+@@ -1729,6 +1746,11 @@ int main(int argc,char *argv[])
SIGACTMASK(SIGFPE, rsync_panic_handler);
SIGACTMASK(SIGABRT, rsync_panic_handler);
SIGACTMASK(SIGBUS, rsync_panic_handler);
./configure (optional if already run)
make
-based-on: 0ac7ebceef70417355f25daf9e2fd94e84c49749
+based-on: 43f70b961e92d88387fecd3c7f6dbefc044ce4a3
diff --git a/clientserver.c b/clientserver.c
--- a/clientserver.c
+++ b/clientserver.c
extern int copy_links;
extern int copy_unsafe_links;
extern int protocol_version;
-@@ -74,6 +77,7 @@ extern int sender_symlink_iconv;
- extern int output_needs_newline;
+@@ -75,6 +78,7 @@ extern int output_needs_newline;
extern int sender_keeps_checksum;
+ extern int trust_sender_filter;
extern int unsort_ndx;
+extern char *basis_dir[];
extern uid_t our_uid;
/* Call this with EITHER (1) "file, NULL, 0" to chdir() to the file's
* F_PATHNAME(), or (2) "NULL, dir, dirlen" to chdir() to the supplied dir,
* with dir == NULL taken to be the starting directory, and dirlen < 0
-@@ -1216,7 +1467,7 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
+@@ -1229,7 +1480,7 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
STRUCT_STAT *stp, int flags, int filter_level)
{
static char *lastdir;
struct file_struct *file;
char thisname[MAXPATHLEN];
char linkname[MAXPATHLEN];
-@@ -1362,9 +1613,16 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
+@@ -1375,9 +1626,16 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
memcpy(lastdir, thisname, len);
lastdir[len] = '\0';
lastdir_len = len;
basename_len = strlen(basename) + 1; /* count the '\0' */
#ifdef SUPPORT_LINKS
-@@ -1394,11 +1652,8 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
+@@ -1407,11 +1665,8 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
extra_len += EXTRA_LEN;
#endif
#if EXTRA_ROUNDING > 0
if (extra_len & (EXTRA_ROUNDING * EXTRA_LEN))
-@@ -1487,8 +1742,14 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
+@@ -1500,8 +1755,14 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
return NULL;
}
if (unsort_ndx)
F_NDX(file) = stats.num_dirs;
-@@ -2705,7 +2966,7 @@ struct file_list *recv_file_list(int f, int dir_ndx)
+@@ -2718,7 +2979,7 @@ struct file_list *recv_file_list(int f, int dir_ndx)
/* The --relative option sends paths with a leading slash, so we need
* to specify the strip_root option here. We rejected leading slashes
* for a non-relative transfer in recv_file_entry(). */
if (protocol_version < 30) {
/* Recv the io_error flag */
-@@ -2950,7 +3211,7 @@ void flist_free(struct file_list *flist)
+@@ -2963,7 +3224,7 @@ void flist_free(struct file_list *flist)
/* This routine ensures we don't have any duplicate names in our file list.
* duplicate names can cause corruption because of the pipelining. */
{
char fbuf[MAXPATHLEN];
int i, prev_i;
-@@ -3001,7 +3262,7 @@ static void flist_sort_and_clean(struct file_list *flist, int strip_root)
+@@ -3014,7 +3275,7 @@ static void flist_sort_and_clean(struct file_list *flist, int strip_root)
/* If one is a dir and the other is not, we want to
* keep the dir because it might have contents in the
* list. Otherwise keep the first one. */
struct file_struct *fp = flist->sorted[j];
if (!S_ISDIR(fp->mode))
keep = i, drop = j;
-@@ -3017,8 +3278,8 @@ static void flist_sort_and_clean(struct file_list *flist, int strip_root)
+@@ -3030,8 +3291,8 @@ static void flist_sort_and_clean(struct file_list *flist, int strip_root)
} else
keep = j, drop = i;
rprintf(FINFO,
"removing duplicate name %s from file list (%d)\n",
f_name(file, fbuf), drop + flist->ndx_start);
-@@ -3040,7 +3301,7 @@ static void flist_sort_and_clean(struct file_list *flist, int strip_root)
+@@ -3053,7 +3314,7 @@ static void flist_sort_and_clean(struct file_list *flist, int strip_root)
}
flist->high = prev_i;
diff --git a/rsync.1.md b/rsync.1.md
--- a/rsync.1.md
+++ b/rsync.1.md
-@@ -342,6 +342,7 @@ has its own detailed description later in this manpage.
+@@ -360,6 +360,7 @@ has its own detailed description later in this manpage.
--quiet, -q suppress non-error messages
--no-motd suppress daemon-mode MOTD
--checksum, -c skip based on checksum, not mod-time & size
--archive, -a archive mode is -rlptgoD (no -A,-X,-U,-N,-H)
--no-OPTION turn off an implied OPTION (e.g. --no-D)
--recursive, -r recurse into directories
-@@ -722,6 +723,8 @@ your home directory (remove the '=' for that).
+@@ -747,6 +748,8 @@ option name from the pathname using a space if you want the shell to expand it.
file that has the same size as the corresponding sender's file: files with
either a changed size or a changed checksum are selected for transfer.
Note that rsync always verifies that each _transferred_ file was correctly
reconstructed on the receiving side by checking a whole-file checksum that
is generated as the file is transferred, but that automatic
-@@ -733,6 +736,38 @@ your home directory (remove the '=' for that).
+@@ -758,6 +761,38 @@ option name from the pathname using a space if you want the shell to expand it.
option or an environment variable that is discussed in that option's
section.
diff --git a/rsync.h b/rsync.h
--- a/rsync.h
+++ b/rsync.h
-@@ -899,6 +899,10 @@ extern int xattrs_ndx;
+@@ -902,6 +902,10 @@ extern int xattrs_ndx;
#define F_SUM(f) ((char*)OPT_EXTRA(f, START_BUMP(f) + HLINK_BUMP(f) \
+ SUM_EXTRA_CNT - 1))
/* Some utility defines: */
#define F_IS_ACTIVE(f) (f)->basename[0]
#define F_IS_HLINKED(f) ((f)->flags & FLAG_HLINKED)
-@@ -1112,6 +1116,13 @@ typedef struct {
+@@ -1115,6 +1119,13 @@ typedef struct {
#define RELNAMECACHE_LEN (offsetof(relnamecache, fname))
#endif
}
/* Call this with EITHER (1) "file, NULL, 0" to chdir() to the file's
-@@ -1568,6 +1779,8 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
+@@ -1581,6 +1792,8 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
if (is_excluded(thisname, S_ISDIR(st.st_mode) != 0, filter_level)) {
if (ignore_perishable)
non_perishable_cnt++;
return NULL;
}
-@@ -1614,13 +1827,13 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
+@@ -1627,13 +1840,13 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
lastdir[len] = '\0';
lastdir_len = len;
if (checksum_files && am_sender && flist)
}
}
basename_len = strlen(basename) + 1; /* count the '\0' */
-@@ -1744,7 +1957,7 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
+@@ -1757,7 +1970,7 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
if (always_checksum && am_sender && S_ISREG(st.st_mode)) {
if (flist && checksum_files)
else
file_checksum(thisname, &st, tmp_sum);
if (sender_keeps_checksum)
-@@ -2136,6 +2349,9 @@ static void send_directory(int f, struct file_list *flist, char *fbuf, int len,
+@@ -2149,6 +2362,9 @@ static void send_directory(int f, struct file_list *flist, char *fbuf, int len,
closedir(d);
if (f >= 0 && recurse && !divert_dirs) {
int i, end = flist->used - 1;
/* send_if_directory() bumps flist->used, so use "end". */
-@@ -2801,6 +3017,9 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
+@@ -2814,6 +3030,9 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
rprintf(FINFO, "[%s] flist_eof=1\n", who_am_i());
}
extern int daemon_connection;
extern int protocol_version;
extern int remove_source_files;
-@@ -1085,6 +1086,9 @@ static void got_flist_entry_status(enum festatus status, int ndx)
+@@ -1089,6 +1090,9 @@ static void got_flist_entry_status(enum festatus status, int ndx)
if (inc_recurse)
flist->in_progress++;
}
|| (preserve_hard_links && F_IS_HLINKED(file)))
send_msg_int(MSG_SUCCESS, ndx);
handle_partial_dir(partialptr, PDIR_DELETE);
-@@ -923,7 +924,7 @@ int recv_files(int f_in, int f_out, char *local_name)
+@@ -926,7 +927,7 @@ int recv_files(int f_in, int f_out, char *local_name)
case 2:
break;
case 1:
diff --git a/rsync.1.md b/rsync.1.md
--- a/rsync.1.md
+++ b/rsync.1.md
-@@ -747,9 +747,13 @@ your home directory (remove the '=' for that).
+@@ -772,9 +772,13 @@ option name from the pathname using a space if you want the shell to expand it.
The MODE value is either "lax", for relaxed checking (which compares size
and mtime), "strict" (which also compares ctime and inode), or "none" to
diff --git a/rsync.h b/rsync.h
--- a/rsync.h
+++ b/rsync.h
-@@ -1118,6 +1118,8 @@ typedef struct {
+@@ -1121,6 +1121,8 @@ typedef struct {
#define CSF_ENABLE (1<<1)
#define CSF_LAX (1<<2)
./configure (optional if already run)
make
-based-on: 0ac7ebceef70417355f25daf9e2fd94e84c49749
+based-on: 43f70b961e92d88387fecd3c7f6dbefc044ce4a3
diff --git a/flist.c b/flist.c
--- a/flist.c
+++ b/flist.c
-@@ -1395,7 +1395,8 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
+@@ -1408,7 +1408,8 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
#endif
if (always_checksum && am_sender && S_ISREG(st.st_mode)) {
./configure (optional if already run)
make
-based-on: 0ac7ebceef70417355f25daf9e2fd94e84c49749
+based-on: 43f70b961e92d88387fecd3c7f6dbefc044ce4a3
diff --git a/Makefile.in b/Makefile.in
--- a/Makefile.in
+++ b/Makefile.in
diff --git a/rsync.1.md b/rsync.1.md
--- a/rsync.1.md
+++ b/rsync.1.md
-@@ -430,6 +430,7 @@ has its own detailed description later in this manpage.
+@@ -448,6 +448,7 @@ has its own detailed description later in this manpage.
--compare-dest=DIR also compare destination files relative to DIR
--copy-dest=DIR ... and include copies of unchanged files
--link-dest=DIR hardlink to files in DIR when unchanged
--compress, -z compress file data during the transfer
--compress-choice=STR choose the compression algorithm (aka --zc)
--compress-level=NUM explicitly set compression level (aka --zl)
-@@ -2532,6 +2533,18 @@ your home directory (remove the '=' for that).
+@@ -2585,6 +2586,18 @@ option name from the pathname using a space if you want the shell to expand it.
this bug by avoiding the `-o` option (or using `--no-o`) when sending to an
old rsync.
./configure (optional if already run)
make
-based-on: 0ac7ebceef70417355f25daf9e2fd94e84c49749
+based-on: 43f70b961e92d88387fecd3c7f6dbefc044ce4a3
diff --git a/daemon-parm.txt b/daemon-parm.txt
--- a/daemon-parm.txt
+++ b/daemon-parm.txt
diff --git a/rsync.1.md b/rsync.1.md
--- a/rsync.1.md
+++ b/rsync.1.md
-@@ -450,6 +450,8 @@ has its own detailed description later in this manpage.
+@@ -468,6 +468,8 @@ has its own detailed description later in this manpage.
--address=ADDRESS bind address for outgoing socket to daemon
--port=PORT specify double-colon alternate port number
--sockopts=OPTIONS specify custom TCP options
./configure (optional if already run)
make
-based-on: 0ac7ebceef70417355f25daf9e2fd94e84c49749
+based-on: 43f70b961e92d88387fecd3c7f6dbefc044ce4a3
diff --git a/generator.c b/generator.c
--- a/generator.c
+++ b/generator.c
diff --git a/rsync.1.md b/rsync.1.md
--- a/rsync.1.md
+++ b/rsync.1.md
-@@ -424,6 +424,7 @@ has its own detailed description later in this manpage.
+@@ -442,6 +442,7 @@ has its own detailed description later in this manpage.
--contimeout=SECONDS set daemon connection timeout in seconds
--ignore-times, -I don't skip files that match size and time
--size-only skip files that match in size
--modify-window=NUM, -@ set the accuracy for mod-time comparisons
--temp-dir=DIR, -T create temporary files in directory DIR
--fuzzy, -y find similar file for basis if no dest file
-@@ -684,6 +685,14 @@ your home directory (remove the '=' for that).
+@@ -709,6 +710,14 @@ option name from the pathname using a space if you want the shell to expand it.
after using another mirroring system which may not preserve timestamps
exactly.
./configure
make
-based-on: 0ac7ebceef70417355f25daf9e2fd94e84c49749
+based-on: 43f70b961e92d88387fecd3c7f6dbefc044ce4a3
diff --git a/.gitignore b/.gitignore
--- a/.gitignore
+++ b/.gitignore
netdb.h malloc.h float.h limits.h iconv.h libcharset.h langinfo.h mcheck.h \
sys/acl.h acl/libacl.h attr/xattr.h sys/xattr.h sys/extattr.h dl.h \
popt.h popt/popt.h linux/falloc.h netinet/in_systm.h netgroup.h \
-@@ -1433,6 +1434,48 @@ if test x"$enable_acl_support" = x"no" || test x"$enable_xattr_support" = x"no"
+@@ -1434,6 +1435,48 @@ if test x"$enable_acl_support" = x"no" || test x"$enable_xattr_support" = x"no"
fi
fi
extern int eol_nulls;
extern int atimes_ndx;
extern int crtimes_ndx;
-@@ -1394,11 +1395,8 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
+@@ -1407,11 +1408,8 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
extra_len += EXTRA_LEN;
#endif
#if EXTRA_ROUNDING > 0
if (extra_len & (EXTRA_ROUNDING * EXTRA_LEN))
-@@ -1487,8 +1485,12 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
+@@ -1500,8 +1498,12 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
return NULL;
}
if (unsort_ndx)
F_NDX(file) = stats.num_dirs;
-@@ -2172,6 +2174,9 @@ void send_extra_file_list(int f, int at_least)
+@@ -2185,6 +2187,9 @@ void send_extra_file_list(int f, int at_least)
finish:
if (io_error != save_io_error && protocol_version == 30 && !ignore_errors)
send_msg_int(MSG_IO_ERROR, io_error);
}
struct file_list *send_file_list(int f, int argc, char *argv[])
-@@ -2195,6 +2200,13 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
+@@ -2208,6 +2213,13 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
| (eol_nulls || reading_remotely ? RL_EOL_NULLS : 0);
int implied_dot_dir = 0;
rprintf(FLOG, "building file list\n");
if (show_filelist_progress)
start_filelist_progress("building file list");
-@@ -2540,6 +2552,9 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
+@@ -2553,6 +2565,9 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
rprintf(FINFO, "[%s] flist_eof=1\n", who_am_i());
}
extern int io_error;
extern int batch_fd;
extern int eol_nulls;
-@@ -1513,6 +1515,32 @@ static void read_a_msg(void)
+@@ -1517,6 +1519,32 @@ static void read_a_msg(void)
if (am_sender)
maybe_send_keepalive(time(NULL), MSK_ALLOW_FLUSH);
break;
case MSG_DELETED:
if (msg_bytes >= sizeof data)
goto overflow;
-@@ -1666,6 +1694,7 @@ static void read_a_msg(void)
+@@ -1670,6 +1698,7 @@ static void read_a_msg(void)
* with a duplicate exit message. */
_exit_cleanup(val, __FILE__, 0 - __LINE__);
default:
extern int mkpath_dest_arg;
extern int file_total;
extern int recurse;
-@@ -95,6 +97,7 @@ extern char *logfile_format;
+@@ -96,6 +98,7 @@ extern char *logfile_format;
extern char *filesfrom_host;
extern char *partial_dir;
extern char *rsync_path;
extern char *shell_cmd;
extern char *password_file;
extern char *backup_dir;
-@@ -1237,6 +1240,9 @@ void start_server(int f_in, int f_out, int argc, char *argv[])
+@@ -1239,6 +1242,9 @@ void start_server(int f_in, int f_out, int argc, char *argv[])
if (am_daemon && io_timeout && protocol_version >= 31)
send_msg_int(MSG_IO_TIMEOUT, io_timeout);
if (am_sender) {
keep_dirlinks = 0; /* Must be disabled on the sender. */
if (need_messages_from_generator)
-@@ -1531,6 +1537,9 @@ static int start_client(int argc, char *argv[])
+@@ -1536,6 +1542,9 @@ static int start_client(int argc, char *argv[])
else
env_port = rsync_port;
progress_init();
while (1) {
-@@ -895,6 +905,8 @@ int recv_files(int f_in, int f_out, char *local_name)
+@@ -898,6 +908,8 @@ int recv_files(int f_in, int f_out, char *local_name)
do_unlink(partialptr);
handle_partial_dir(partialptr, PDIR_DELETE);
}
} else if (keep_partial && partialptr && (!one_inplace || delay_updates)) {
if (!handle_partial_dir(partialptr, PDIR_CREATE)) {
rprintf(FERROR,
-@@ -908,6 +920,8 @@ int recv_files(int f_in, int f_out, char *local_name)
+@@ -911,6 +923,8 @@ int recv_files(int f_in, int f_out, char *local_name)
recv_ok = -1;
else if (delay_updates && recv_ok) {
bitbag_set_bit(delayed_bits, ndx);
diff --git a/rsync.1.md b/rsync.1.md
--- a/rsync.1.md
+++ b/rsync.1.md
-@@ -390,6 +390,9 @@ has its own detailed description later in this manpage.
+@@ -408,6 +408,9 @@ has its own detailed description later in this manpage.
--dry-run, -n perform a trial run with no changes made
--whole-file, -W copy files whole (w/o delta-xfer algorithm)
--checksum-choice=STR choose the checksum algorithm (aka --cc)
#define NDX_DONE -1
#define NDX_FLIST_EOF -2
#define NDX_DEL_STATS -3
-@@ -1438,7 +1442,8 @@ extern short info_levels[], debug_levels[];
+@@ -1441,7 +1445,8 @@ extern short info_levels[], debug_levels[];
#define DEBUG_CHDIR (DEBUG_BIND+1)
#define DEBUG_CONNECT (DEBUG_CHDIR+1)
#define DEBUG_CMD (DEBUG_CONNECT+1)
diff --git a/rsync.1.md b/rsync.1.md
--- a/rsync.1.md
+++ b/rsync.1.md
-@@ -428,6 +428,8 @@ has its own detailed description later in this manpage.
+@@ -446,6 +446,8 @@ has its own detailed description later in this manpage.
--temp-dir=DIR, -T create temporary files in directory DIR
--fuzzy, -y find similar file for basis if no dest file
--detect-renamed try to find renamed files to speed the xfer
--compare-dest=DIR also compare destination files relative to DIR
--copy-dest=DIR ... and include copies of unchanged files
--link-dest=DIR hardlink to files in DIR when unchanged
-@@ -2464,6 +2466,20 @@ your home directory (remove the '=' for that).
+@@ -2517,6 +2519,20 @@ option name from the pathname using a space if you want the shell to expand it.
otential alternate-basis files will be removed as the transfer progresses.
This option conflicts with [`--inplace`](#opt) and [`--append`](#opt).
a file that can't use it, while missing out on giving it to a file
that could use it.
-based-on: 0ac7ebceef70417355f25daf9e2fd94e84c49749
+based-on: 43f70b961e92d88387fecd3c7f6dbefc044ce4a3
diff --git a/backup.c b/backup.c
--- a/backup.c
+++ b/backup.c
static void send_directory(int f, struct file_list *flist,
char *fbuf, int len, int flags);
-@@ -2707,6 +2749,23 @@ struct file_list *recv_file_list(int f, int dir_ndx)
+@@ -2720,6 +2762,23 @@ struct file_list *recv_file_list(int f, int dir_ndx)
* for a non-relative transfer in recv_file_entry(). */
flist_sort_and_clean(flist, relative_paths);
diff --git a/main.c b/main.c
--- a/main.c
+++ b/main.c
-@@ -715,7 +715,7 @@ static char *get_local_name(struct file_list *flist, char *dest_path)
+@@ -717,7 +717,7 @@ static char *get_local_name(struct file_list *flist, char *dest_path)
if (mkpath_dest_arg && statret < 0 && (cp || file_total > 1)) {
int save_errno = errno;
diff --git a/rsync.1.md b/rsync.1.md
--- a/rsync.1.md
+++ b/rsync.1.md
-@@ -427,6 +427,7 @@ has its own detailed description later in this manpage.
+@@ -445,6 +445,7 @@ has its own detailed description later in this manpage.
--modify-window=NUM, -@ set the accuracy for mod-time comparisons
--temp-dir=DIR, -T create temporary files in directory DIR
--fuzzy, -y find similar file for basis if no dest file
--compare-dest=DIR also compare destination files relative to DIR
--copy-dest=DIR ... and include copies of unchanged files
--link-dest=DIR hardlink to files in DIR when unchanged
-@@ -2447,6 +2448,22 @@ your home directory (remove the '=' for that).
+@@ -2500,6 +2501,22 @@ option name from the pathname using a space if you want the shell to expand it.
potential fuzzy-match files, so either use [`--delete-after`](#opt) or
specify some filename exclusions if you need to prevent this.
./configure (optional if already run)
make
-based-on: 0ac7ebceef70417355f25daf9e2fd94e84c49749
+based-on: 43f70b961e92d88387fecd3c7f6dbefc044ce4a3
diff --git a/options.c b/options.c
--- a/options.c
+++ b/options.c
diff --git a/rsync.1.md b/rsync.1.md
--- a/rsync.1.md
+++ b/rsync.1.md
-@@ -415,6 +415,7 @@ has its own detailed description later in this manpage.
+@@ -433,6 +433,7 @@ has its own detailed description later in this manpage.
--partial keep partially transferred files
--partial-dir=DIR put a partially transferred file into DIR
--delay-updates put all updated files into place at end
--prune-empty-dirs, -m prune empty directory chains from file-list
--numeric-ids don't map uid/gid values by user/group name
--usermap=STRING custom username mapping
-@@ -3247,6 +3248,17 @@ your home directory (remove the '=' for that).
+@@ -3300,6 +3301,17 @@ option name from the pathname using a space if you want the shell to expand it.
update algorithm that is even more atomic (it uses [`--link-dest`](#opt)
and a parallel hierarchy of files).
./configure (optional if already run)
make
-based-on: 0ac7ebceef70417355f25daf9e2fd94e84c49749
+based-on: 43f70b961e92d88387fecd3c7f6dbefc044ce4a3
diff --git a/generator.c b/generator.c
--- a/generator.c
+++ b/generator.c
diff --git a/rsync.1.md b/rsync.1.md
--- a/rsync.1.md
+++ b/rsync.1.md
-@@ -351,6 +351,7 @@ has its own detailed description later in this manpage.
+@@ -369,6 +369,7 @@ has its own detailed description later in this manpage.
--backup-dir=DIR make backups into hierarchy based in DIR
--suffix=SUFFIX backup suffix (default ~ w/o --backup-dir)
--update, -u skip files that are newer on the receiver
./configure (optional if already run)
make
-based-on: 0ac7ebceef70417355f25daf9e2fd94e84c49749
+based-on: 43f70b961e92d88387fecd3c7f6dbefc044ce4a3
diff --git a/compat.c b/compat.c
--- a/compat.c
+++ b/compat.c
if (preserve_uid && !(xflags & XMIT_SAME_UID)) {
if (protocol_version < 30)
-@@ -1042,6 +1069,10 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
+@@ -1055,6 +1082,10 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
}
#endif
file->mode = mode;
if (preserve_uid)
F_OWNER(file) = uid;
if (preserve_gid) {
-@@ -1455,6 +1486,10 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
+@@ -1468,6 +1499,10 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
}
#endif
file->mode = st.st_mode;
extern int msgs2stderr;
extern int module_id;
extern int read_only;
-@@ -966,6 +970,22 @@ static int do_recv(int f_in, int f_out, char *local_name)
+@@ -968,6 +972,22 @@ static int do_recv(int f_in, int f_out, char *local_name)
* points to an identical file won't be replaced by the referent. */
copy_links = copy_dirlinks = copy_unsafe_links = 0;
diff --git a/rsync.1.md b/rsync.1.md
--- a/rsync.1.md
+++ b/rsync.1.md
-@@ -366,6 +366,7 @@ has its own detailed description later in this manpage.
+@@ -384,6 +384,7 @@ has its own detailed description later in this manpage.
--keep-dirlinks, -K treat symlinked dir on receiver as dir
--hard-links, -H preserve hard links
--perms, -p preserve permissions
--executability, -E preserve executability
--chmod=CHMOD affect file and/or directory permissions
--acls, -A preserve ACLs (implies --perms)
-@@ -407,7 +408,10 @@ has its own detailed description later in this manpage.
+@@ -425,7 +426,10 @@ has its own detailed description later in this manpage.
--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
--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
-@@ -739,6 +743,7 @@ your home directory (remove the '=' for that).
+@@ -764,6 +768,7 @@ option name from the pathname using a space if you want the shell to expand it.
recursion and want to preserve almost everything. Be aware that it does
**not** include preserving ACLs (`-A`), xattrs (`-X`), atimes (`-U`),
crtimes (`-N`), nor the finding and preserving of hardlinks (`-H`).
The only exception to the above equivalence is when [`--files-from`](#opt)
is specified, in which case [`-r`](#opt) is not implied.
-@@ -1199,7 +1204,7 @@ your home directory (remove the '=' for that).
+@@ -1223,7 +1228,7 @@ option name from the pathname using a space if you want the shell to expand it.
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
See also [`--keep-dirlinks`](#opt) for an analogous option for the
receiving side.
-@@ -1394,6 +1399,37 @@ your home directory (remove the '=' for that).
+@@ -1418,6 +1423,37 @@ option name from the pathname using a space if you want the shell to expand it.
those used by [`--fake-super`](#opt)) unless you repeat the option (e.g. `-XX`).
This "copy all xattrs" mode cannot be used with [`--fake-super`](#opt).
0. `--chmod=CHMOD`
This option tells rsync to apply one or more comma-separated "chmod" modes
-@@ -1897,8 +1933,8 @@ your home directory (remove the '=' for that).
+@@ -1931,8 +1967,8 @@ option name from the pathname using a space if you want the shell to expand it.
[`--ignore-missing-args`](#opt) 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
independent of any other type of delete processing.
The missing source files are represented by special file-list entries which
-@@ -1909,14 +1945,14 @@ your home directory (remove the '=' for that).
+@@ -1943,14 +1979,14 @@ option name from the pathname using a space if you want the shell to expand it.
Tells [`--delete`](#opt) to go ahead and delete files even when there are
I/O errors.
[`--recursive`](#opt) option was also enabled.
0. `--max-delete=NUM`
-@@ -2913,7 +2949,7 @@ your home directory (remove the '=' for that).
+@@ -2966,7 +3002,7 @@ option name from the pathname using a space if you want the shell to expand it.
also turns on the output of other verbose messages).
The "%i" escape has a cryptic output that is 11 letters long. The general
#define ITEM_REPORT_CRTIME (1<<10)
#define ITEM_BASIS_TYPE_FOLLOWS (1<<11)
#define ITEM_XNAME_FOLLOWS (1<<12)
-@@ -590,6 +592,31 @@ typedef unsigned int size_t;
+@@ -593,6 +595,31 @@ typedef unsigned int size_t;
#define SUPPORT_CRTIMES 1
#endif
/* 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. */
-@@ -821,6 +848,7 @@ extern int pathname_ndx;
+@@ -824,6 +851,7 @@ extern int pathname_ndx;
extern int depth_ndx;
extern int uid_ndx;
extern int gid_ndx;
extern int acls_ndx;
extern int xattrs_ndx;
-@@ -875,6 +903,11 @@ extern int xattrs_ndx;
+@@ -878,6 +906,11 @@ extern int xattrs_ndx;
/* 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
./configure (optional if already run)
make
-based-on: 0ac7ebceef70417355f25daf9e2fd94e84c49749
+based-on: 43f70b961e92d88387fecd3c7f6dbefc044ce4a3
diff --git a/exclude.c b/exclude.c
--- a/exclude.c
+++ b/exclude.c
-@@ -45,10 +45,13 @@ filter_rule_list filter_list = { .debug_type = "" };
- filter_rule_list cvs_filter_list = { .debug_type = " [global CVS]" };
+@@ -52,11 +52,14 @@ filter_rule_list cvs_filter_list = { .debug_type = " [global CVS]" };
filter_rule_list daemon_filter_list = { .debug_type = " [daemon]" };
+ filter_rule_list implied_filter_list = { .debug_type = " [implied]" };
+filter_rule *last_hit_filter_rule;
+
int saw_xattr_filter = 0;
+ int trust_sender_filter = 0;
-/* Need room enough for ":MODS " prefix plus some room to grow. */
-#define MAX_RULE_PREFIX (16)
#define SLASH_WILD3_SUFFIX "/***"
-@@ -127,8 +130,27 @@ static void teardown_mergelist(filter_rule *ex)
+@@ -135,8 +138,27 @@ static void teardown_mergelist(filter_rule *ex)
mergelist_cnt--;
}
if (ex->rflags & FILTRULE_PERDIR_MERGE)
teardown_mergelist(ex);
free(ex->pattern);
-@@ -726,7 +748,9 @@ static void report_filter_result(enum logcode code, char const *name,
+@@ -853,7 +875,9 @@ static void report_filter_result(enum logcode code, char const *name,
/* This function is used to check if a file should be included/excluded
* from the list of files based on its name and type etc. The value of
int name_is_excluded(const char *fname, int name_flags, int filter_level)
{
if (daemon_filter_list.head && check_filter(&daemon_filter_list, FLOG, fname, name_flags) < 0) {
-@@ -735,6 +759,9 @@ int name_is_excluded(const char *fname, int name_flags, int filter_level)
+@@ -862,6 +886,9 @@ int name_is_excluded(const char *fname, int name_flags, int filter_level)
return 1;
}
if (filter_level != ALL_FILTERS)
return 0;
-@@ -745,7 +772,8 @@ int name_is_excluded(const char *fname, int name_flags, int filter_level)
+@@ -872,7 +899,8 @@ int name_is_excluded(const char *fname, int name_flags, int filter_level)
}
/* Return -1 if file "name" is defined to be excluded by the specified
int check_filter(filter_rule_list *listp, enum logcode code,
const char *name, int name_flags)
{
-@@ -768,10 +796,12 @@ int check_filter(filter_rule_list *listp, enum logcode code,
+@@ -895,10 +923,12 @@ int check_filter(filter_rule_list *listp, enum logcode code,
}
if (rule_matches(name, ent, name_flags)) {
report_filter_result(code, name, ent, name_flags, listp->debug_type);
return 0;
}
-@@ -788,9 +818,45 @@ static const uchar *rule_strcmp(const uchar *str, const char *rule, int rule_len
+@@ -915,9 +945,45 @@ static const uchar *rule_strcmp(const uchar *str, const char *rule, int rule_len
return NULL;
}
/* Gets the next include/exclude rule from *rulestr_ptr and advances
* *rulestr_ptr to point beyond it. Stores the pattern's start (within
-@@ -805,6 +871,7 @@ static filter_rule *parse_rule_tok(const char **rulestr_ptr,
+@@ -932,6 +998,7 @@ static filter_rule *parse_rule_tok(const char **rulestr_ptr,
const char **pat_ptr, unsigned int *pat_len_ptr)
{
const uchar *s = (const uchar *)*rulestr_ptr;
filter_rule *rule;
unsigned int len;
-@@ -823,6 +890,12 @@ static filter_rule *parse_rule_tok(const char **rulestr_ptr,
+@@ -950,6 +1017,12 @@ static filter_rule *parse_rule_tok(const char **rulestr_ptr,
/* Inherit from the template. Don't inherit FILTRULES_SIDES; we check
* that later. */
rule->rflags = template->rflags & FILTRULES_FROM_CONTAINER;
/* Figure out what kind of a filter rule "s" is pointing at. Note
* that if FILTRULE_NO_PREFIXES is set, the rule is either an include
-@@ -968,11 +1041,63 @@ static filter_rule *parse_rule_tok(const char **rulestr_ptr,
+@@ -1096,11 +1169,63 @@ static filter_rule *parse_rule_tok(const char **rulestr_ptr,
goto invalid;
rule->rflags |= FILTRULE_EXCLUDE_SELF;
break;
case 'p':
rule->rflags |= FILTRULE_PERISHABLE;
break;
-@@ -1286,6 +1411,23 @@ char *get_rule_prefix(filter_rule *rule, const char *pat, int for_xfer,
+@@ -1414,6 +1539,23 @@ char *get_rule_prefix(filter_rule *rule, const char *pat, int for_xfer,
else if (am_sender)
return NULL;
}
diff --git a/flist.c b/flist.c
--- a/flist.c
+++ b/flist.c
-@@ -85,6 +85,7 @@ extern struct chmod_mode_struct *chmod_modes;
+@@ -85,6 +85,7 @@ extern char curr_dir[MAXPATHLEN];
+ extern struct chmod_mode_struct *chmod_modes;
- extern filter_rule_list filter_list;
- extern filter_rule_list daemon_filter_list;
+ extern filter_rule_list filter_list, implied_filter_list, daemon_filter_list;
+extern filter_rule *last_hit_filter_rule;
#ifdef ICONV_OPTION
extern int filesfrom_convert;
-@@ -1244,7 +1245,7 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
+@@ -1257,7 +1258,7 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
} else if (readlink_stat(thisname, &st, linkname) != 0) {
int save_errno = errno;
/* See if file is excluded before reporting an error. */
&& (is_excluded(thisname, 0, filter_level)
|| is_excluded(thisname, 1, filter_level))) {
if (ignore_perishable && save_errno != ENOENT)
-@@ -1289,6 +1290,12 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
+@@ -1302,6 +1303,12 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
if (filter_level == NO_FILTERS)
goto skip_filters;
if (S_ISDIR(st.st_mode)) {
if (!xfer_dirs) {
-@@ -1521,12 +1528,23 @@ static struct file_struct *send_file_name(int f, struct file_list *flist,
+@@ -1534,12 +1541,23 @@ static struct file_struct *send_file_name(int f, struct file_list *flist,
int flags, int filter_level)
{
struct file_struct *file;
file->mode = tweak_mode(file->mode, chmod_modes);
if (f >= 0) {
-@@ -2428,7 +2446,7 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
+@@ -2441,7 +2459,7 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
struct file_struct *file;
file = send_file_name(f, flist, fbuf, &st,
FLAG_TOP_DIR | FLAG_CONTENT_DIR | flags,
if (!file)
continue;
if (inc_recurse) {
-@@ -2442,7 +2460,7 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
+@@ -2455,7 +2473,7 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
} else
send_if_directory(f, flist, file, fbuf, len, flags);
} else
diff --git a/rsync.1.md b/rsync.1.md
--- a/rsync.1.md
+++ b/rsync.1.md
-@@ -1417,7 +1417,9 @@ your home directory (remove the '=' for that).
+@@ -1441,7 +1441,9 @@ option name from the pathname using a space if you want the shell to expand it.
> --chmod=D2775,F664
It is also legal to specify multiple `--chmod` options, as each additional
See the [`--perms`](#opt) and [`--executability`](#opt) options for how the
resulting permission value can be applied to the files in the transfer.
-@@ -2847,6 +2849,10 @@ your home directory (remove the '=' for that).
+@@ -2900,6 +2902,10 @@ option name from the pathname using a space if you want the shell to expand it.
avoid a complaint about wildcard characters, but a modern rsync handles
this automatically.
0. `--timeout=SECONDS`
This option allows you to set a maximum I/O timeout in seconds. If no data
-@@ -3910,6 +3916,15 @@ The following modifiers are accepted after a "`+`" or "`-`":
+@@ -4052,6 +4058,15 @@ The following modifiers are accepted after an include (+) or exclude (-) rule:
like "CVS" and "`*.o`" are marked as perishable, and will not prevent a
directory that was removed on the source from being deleted on the
destination.
- An `x` indicates that a rule affects xattr names in xattr copy/delete
operations (and is thus ignored when matching file/dir names). If no
xattr-matching rules are specified, a default xattr filtering rule is used
-@@ -3967,6 +3982,12 @@ The following modifiers are accepted after a merge or dir-merge rule:
+@@ -4109,6 +4124,12 @@ The following modifiers are accepted after a merge or dir-merge rule:
rules in the file must not specify sides (via a modifier or a rule prefix
such as `hide`).
#define XFLG_FATAL_ERRORS (1<<0)
#define XFLG_OLD_PREFIXES (1<<1)
-@@ -984,6 +987,8 @@ struct map_struct {
+@@ -987,6 +990,8 @@ struct map_struct {
int status; /* first errno from read errors */
};
#define NAME_IS_FILE (0) /* filter name as a file */
#define NAME_IS_DIR (1<<0) /* filter name as a dir */
#define NAME_IS_XATTR (1<<2) /* filter name as an xattr */
-@@ -1009,8 +1014,18 @@ struct map_struct {
+@@ -1012,8 +1017,18 @@ struct map_struct {
#define FILTRULE_CLEAR_LIST (1<<18)/* this item is the "!" token */
#define FILTRULE_PERISHABLE (1<<19)/* perishable if parent dir goes away */
#define FILTRULE_XATTR (1<<20)/* rule only applies to xattr names */
typedef struct filter_struct {
struct filter_struct *next;
-@@ -1020,6 +1035,11 @@ typedef struct filter_struct {
+@@ -1023,6 +1038,11 @@ typedef struct filter_struct {
int slash_cnt;
struct filter_list_struct *mergelist;
} u;
- Make this code handle multibyte character encodings, and honor the
--iconv setting when converting case.
-based-on: 0ac7ebceef70417355f25daf9e2fd94e84c49749
+based-on: 43f70b961e92d88387fecd3c7f6dbefc044ce4a3
diff --git a/exclude.c b/exclude.c
--- a/exclude.c
+++ b/exclude.c
-@@ -687,16 +687,15 @@ static int rule_matches(const char *fname, filter_rule *ex, int name_flags)
+@@ -814,16 +814,15 @@ static int rule_matches(const char *fname, filter_rule *ex, int name_flags)
if (litmatch_array(pattern, strings, slash_handling))
return ret_match;
} else if (anchored_match) {
extern int ignore_errors;
extern int numeric_ids;
extern int quiet;
-@@ -2623,7 +2624,8 @@ struct file_list *recv_file_list(int f, int dir_ndx)
+@@ -2636,7 +2637,8 @@ struct file_list *recv_file_list(int f, int dir_ndx)
cur_dir++;
if (cur_dir != good_dirname) {
const char *d = dir_ndx >= 0 ? f_name(dir_flist->files[dir_ndx], NULL) : empty_dir;
rprintf(FERROR,
"ABORTING due to invalid path from sender: %s/%s\n",
cur_dir, file->basename);
-@@ -3190,6 +3192,7 @@ int f_name_cmp(const struct file_struct *f1, const struct file_struct *f2)
+@@ -3203,6 +3205,7 @@ int f_name_cmp(const struct file_struct *f1, const struct file_struct *f2)
{
int dif;
const uchar *c1, *c2;
enum fnc_state state1, state2;
enum fnc_type type1, type2;
enum fnc_type t_path = protocol_version >= 29 ? t_PATH : t_ITEM;
-@@ -3300,7 +3303,15 @@ int f_name_cmp(const struct file_struct *f1, const struct file_struct *f2)
+@@ -3313,7 +3316,15 @@ int f_name_cmp(const struct file_struct *f1, const struct file_struct *f2)
if (type1 != type2)
return type1 == t_PATH ? 1 : -1;
}
diff --git a/rsync.1.md b/rsync.1.md
--- a/rsync.1.md
+++ b/rsync.1.md
-@@ -447,6 +447,7 @@ has its own detailed description later in this manpage.
+@@ -465,6 +465,7 @@ has its own detailed description later in this manpage.
--old-args disable the modern arg-protection idiom
--protect-args, -s no space-splitting; wildcard chars only
--copy-as=USER[:GROUP] specify user & optional group for the copy
--address=ADDRESS bind address for outgoing socket to daemon
--port=PORT specify double-colon alternate port number
--sockopts=OPTIONS specify custom TCP options
-@@ -2395,6 +2396,12 @@ your home directory (remove the '=' for that).
+@@ -2448,6 +2449,12 @@ option name from the pathname using a space if you want the shell to expand it.
> sudo rsync -aive lsh -M--copy-as=joe src/ lh:dest/
./configure
make
-based-on: 0ac7ebceef70417355f25daf9e2fd94e84c49749
+based-on: 43f70b961e92d88387fecd3c7f6dbefc044ce4a3
diff --git a/Makefile.in b/Makefile.in
--- a/Makefile.in
+++ b/Makefile.in
diff --git a/configure.ac b/configure.ac
--- a/configure.ac
+++ b/configure.ac
-@@ -966,6 +966,31 @@ if test x"$enable_iconv" != x"no"; then
+@@ -967,6 +967,31 @@ if test x"$enable_iconv" != x"no"; then
AC_DEFINE(UTF8_CHARSET, "UTF-8", [String to pass to iconv() for the UTF-8 charset.])
fi
diff --git a/main.c b/main.c
--- a/main.c
+++ b/main.c
-@@ -1574,7 +1574,7 @@ static int start_client(int argc, char *argv[])
+@@ -1579,7 +1579,7 @@ static int start_client(int argc, char *argv[])
* remote shell command, we need to do the RSYNCD protocol first */
if (daemon_connection) {
int tmpret;
diff --git a/rsync.h b/rsync.h
--- a/rsync.h
+++ b/rsync.h
-@@ -532,6 +532,15 @@ enum delret {
+@@ -535,6 +535,15 @@ enum delret {
#define iconv_t int
#endif
./configure
make
-based-on: 0ac7ebceef70417355f25daf9e2fd94e84c49749
+based-on: 43f70b961e92d88387fecd3c7f6dbefc044ce4a3
diff --git a/Makefile.in b/Makefile.in
--- a/Makefile.in
+++ b/Makefile.in
diff --git a/rsync.1.md b/rsync.1.md
--- a/rsync.1.md
+++ b/rsync.1.md
-@@ -430,6 +430,7 @@ has its own detailed description later in this manpage.
+@@ -448,6 +448,7 @@ has its own detailed description later in this manpage.
--compare-dest=DIR also compare destination files relative to DIR
--copy-dest=DIR ... and include copies of unchanged files
--link-dest=DIR hardlink to files in DIR when unchanged
--compress, -z compress file data during the transfer
--compress-choice=STR choose the compression algorithm (aka --zc)
--compress-level=NUM explicitly set compression level (aka --zl)
-@@ -2532,6 +2533,50 @@ your home directory (remove the '=' for that).
+@@ -2585,6 +2586,50 @@ option name from the pathname using a space if you want the shell to expand it.
this bug by avoiding the `-o` option (or using `--no-o`) when sending to an
old rsync.
diff --git a/rsync.h b/rsync.h
--- a/rsync.h
+++ b/rsync.h
-@@ -1447,7 +1447,8 @@ extern short info_levels[], debug_levels[];
+@@ -1450,7 +1450,8 @@ extern short info_levels[], debug_levels[];
#define DEBUG_FUZZY (DEBUG_FLIST+1)
#define DEBUG_GENR (DEBUG_FUZZY+1)
#define DEBUG_HASH (DEBUG_GENR+1)
./configure (optional if already run)
make
-based-on: 0ac7ebceef70417355f25daf9e2fd94e84c49749
+based-on: 43f70b961e92d88387fecd3c7f6dbefc044ce4a3
diff --git a/generator.c b/generator.c
--- a/generator.c
+++ b/generator.c
diff --git a/rsync.1.md b/rsync.1.md
--- a/rsync.1.md
+++ b/rsync.1.md
-@@ -383,6 +383,7 @@ has its own detailed description later in this manpage.
+@@ -401,6 +401,7 @@ has its own detailed description later in this manpage.
--crtimes, -N preserve create times (newness)
--omit-dir-times, -O omit directories from --times
--omit-link-times, -J omit symlinks from --times
--super receiver attempts super-user activities
--fake-super store/recover privileged attrs using xattrs
--sparse, -S turn sequences of nulls into sparse blocks
-@@ -1549,6 +1550,11 @@ your home directory (remove the '=' for that).
+@@ -1573,6 +1574,11 @@ option name from the pathname using a space if you want the shell to expand it.
This tells rsync to omit symlinks when it is preserving modification,
access, and create times.
./configure (optional if already run)
make
-based-on: 0ac7ebceef70417355f25daf9e2fd94e84c49749
+based-on: 43f70b961e92d88387fecd3c7f6dbefc044ce4a3
diff --git a/flist.c b/flist.c
--- a/flist.c
+++ b/flist.c
-@@ -74,6 +74,7 @@ extern int sender_symlink_iconv;
- extern int output_needs_newline;
+@@ -75,6 +75,7 @@ extern int output_needs_newline;
extern int sender_keeps_checksum;
+ extern int trust_sender_filter;
extern int unsort_ndx;
+extern unsigned long sleep_asec;
extern uid_t our_uid;
extern struct stats stats;
extern char *filesfrom_host;
-@@ -1864,6 +1865,9 @@ static void send_directory(int f, struct file_list *flist, char *fbuf, int len,
+@@ -1877,6 +1878,9 @@ static void send_directory(int f, struct file_list *flist, char *fbuf, int len,
}
send_file_name(f, flist, fbuf, NULL, flags, filter_level);
diff --git a/rsync.1.md b/rsync.1.md
--- a/rsync.1.md
+++ b/rsync.1.md
-@@ -466,6 +466,7 @@ has its own detailed description later in this manpage.
+@@ -484,6 +484,7 @@ has its own detailed description later in this manpage.
--early-input=FILE use FILE for daemon's early exec input
--list-only list the files instead of copying them
--bwlimit=RATE limit socket I/O bandwidth
TODO: the configure changes should abort if the user requests --enable-slp
and we can't honor that request.
-based-on: 0ac7ebceef70417355f25daf9e2fd94e84c49749
+based-on: 43f70b961e92d88387fecd3c7f6dbefc044ce4a3
diff --git a/Makefile.in b/Makefile.in
--- a/Makefile.in
+++ b/Makefile.in
diff --git a/configure.ac b/configure.ac
--- a/configure.ac
+++ b/configure.ac
-@@ -1034,6 +1034,29 @@ if test $rsync_cv_can_hardlink_special = yes; then
+@@ -1035,6 +1035,29 @@ if test $rsync_cv_can_hardlink_special = yes; then
AC_DEFINE(CAN_HARDLINK_SPECIAL, 1, [Define to 1 if link() can hard-link special files.])
fi
diff --git a/main.c b/main.c
--- a/main.c
+++ b/main.c
-@@ -1401,6 +1401,22 @@ static int start_client(int argc, char *argv[])
+@@ -1403,6 +1403,22 @@ static int start_client(int argc, char *argv[])
if (!read_batch) { /* for read_batch, NO source is specified */
char *path = check_for_hostspec(argv[0], &shell_machine, &rsync_port);
+
+See the following section for even more usage details.
- ## ADVANCED USAGE
+ ## SORTED TRANSFER ORDER
diff --git a/rsync.h b/rsync.h
--- a/rsync.h
./configure (optional if already run)
make
-based-on: 0ac7ebceef70417355f25daf9e2fd94e84c49749
+based-on: 43f70b961e92d88387fecd3c7f6dbefc044ce4a3
diff --git a/syscall.c b/syscall.c
--- a/syscall.c
+++ b/syscall.c
-- Matt McCutchen <hashproduct@gmail.com>
-based-on: 0ac7ebceef70417355f25daf9e2fd94e84c49749
+based-on: 43f70b961e92d88387fecd3c7f6dbefc044ce4a3
diff --git a/options.c b/options.c
--- a/options.c
+++ b/options.c
diff --git a/rsync.1.md b/rsync.1.md
--- a/rsync.1.md
+++ b/rsync.1.md
-@@ -397,6 +397,7 @@ has its own detailed description later in this manpage.
+@@ -415,6 +415,7 @@ has its own detailed description later in this manpage.
--existing skip creating new files on receiver
--ignore-existing skip updating files that exist on receiver
--remove-source-files sender removes synchronized files (non-dir)
--del an alias for --delete-during
--delete delete extraneous files from dest dirs
--delete-before receiver deletes before xfer, not during
-@@ -1783,6 +1784,17 @@ your home directory (remove the '=' for that).
+@@ -1805,6 +1806,17 @@ option name from the pathname using a space if you want the shell to expand it.
Starting with 3.1.0, rsync will skip the sender-side removal (and output an
error) if the file's size or modify time has not stayed unchanged.
./configure (optional if already run)
make
-based-on: 0ac7ebceef70417355f25daf9e2fd94e84c49749
+based-on: 43f70b961e92d88387fecd3c7f6dbefc044ce4a3
diff --git a/generator.c b/generator.c
--- a/generator.c
+++ b/generator.c
diff --git a/main.c b/main.c
--- a/main.c
+++ b/main.c
-@@ -189,7 +189,7 @@ int shell_exec(const char *cmd)
+@@ -190,7 +190,7 @@ int shell_exec(const char *cmd)
}
/* Wait for a process to exit, calling io_flush while waiting. */
progress_init();
while (1) {
-@@ -870,6 +890,9 @@ int recv_files(int f_in, int f_out, char *local_name)
+@@ -873,6 +893,9 @@ int recv_files(int f_in, int f_out, char *local_name)
else if (!am_server && INFO_GTE(NAME, 1) && INFO_EQ(PROGRESS, 1))
rprintf(FINFO, "%s\n", fname);
/* recv file data */
recv_ok = receive_data(f_in, fnamecmp, fd1, st.st_size, fname, fd2, file, inplace || one_inplace);
-@@ -885,6 +908,16 @@ int recv_files(int f_in, int f_out, char *local_name)
+@@ -888,6 +911,16 @@ int recv_files(int f_in, int f_out, char *local_name)
exit_cleanup(RERR_FILEIO);
}
diff --git a/rsync.1.md b/rsync.1.md
--- a/rsync.1.md
+++ b/rsync.1.md
-@@ -424,6 +424,7 @@ has its own detailed description later in this manpage.
+@@ -442,6 +442,7 @@ has its own detailed description later in this manpage.
--contimeout=SECONDS set daemon connection timeout in seconds
--ignore-times, -I don't skip files that match size and time
--size-only skip files that match in size
--modify-window=NUM, -@ set the accuracy for mod-time comparisons
--temp-dir=DIR, -T create temporary files in directory DIR
--fuzzy, -y find similar file for basis if no dest file
-@@ -472,6 +473,8 @@ has its own detailed description later in this manpage.
+@@ -490,6 +491,8 @@ has its own detailed description later in this manpage.
--write-batch=FILE write a batched update to FILE
--only-write-batch=FILE like --write-batch but w/o updating dest
--read-batch=FILE read a batched update from FILE
--protocol=NUM force an older protocol version to be used
--iconv=CONVERT_SPEC request charset conversion of filenames
--checksum-seed=NUM set block/file checksum seed (advanced)
-@@ -3525,6 +3528,36 @@ your home directory (remove the '=' for that).
+@@ -3576,6 +3579,36 @@ option name from the pathname using a space if you want the shell to expand it.
[`--write-batch`](#opt). If _FILE_ is `-`, the batch data will be read
from standard input. See the "BATCH MODE" section for details.
./configure (optional if already run)
make
-based-on: 0ac7ebceef70417355f25daf9e2fd94e84c49749
+based-on: 43f70b961e92d88387fecd3c7f6dbefc044ce4a3
diff --git a/fileio.c b/fileio.c
--- a/fileio.c
+++ b/fileio.c
diff --git a/rsync.1.md b/rsync.1.md
--- a/rsync.1.md
+++ b/rsync.1.md
-@@ -386,6 +386,7 @@ has its own detailed description later in this manpage.
+@@ -404,6 +404,7 @@ has its own detailed description later in this manpage.
--super receiver attempts super-user activities
--fake-super store/recover privileged attrs using xattrs
--sparse, -S turn sequences of nulls into sparse blocks
--preallocate allocate dest files before writing them
--dry-run, -n perform a trial run with no changes made
--whole-file, -W copy files whole (w/o delta-xfer algorithm)
-@@ -1623,6 +1624,18 @@ your home directory (remove the '=' for that).
+@@ -1647,6 +1648,18 @@ option name from the pathname using a space if you want the shell to expand it.
(as opposed to allocated sequences of null bytes) if the kernel version and
filesystem type support creating holes in the allocated data.
./configure (optional if already run)
make
-based-on: 0ac7ebceef70417355f25daf9e2fd94e84c49749
+based-on: 43f70b961e92d88387fecd3c7f6dbefc044ce4a3
diff --git a/flist.c b/flist.c
--- a/flist.c
+++ b/flist.c
-@@ -78,6 +78,7 @@ extern uid_t our_uid;
+@@ -79,6 +79,7 @@ extern uid_t our_uid;
extern struct stats stats;
extern char *filesfrom_host;
extern char *usermap, *groupmap;
if (*thisname
&& (clean_fname(thisname, CFN_REFUSE_DOT_DOT_DIRS) < 0 || (!relative_paths && *thisname == '/'))) {
rprintf(FERROR, "ABORTING due to unsafe pathname from sender: %s\n", thisname);
-@@ -2560,6 +2584,15 @@ struct file_list *recv_file_list(int f, int dir_ndx)
+@@ -2573,6 +2597,15 @@ struct file_list *recv_file_list(int f, int dir_ndx)
parse_name_map(usermap, True);
if (groupmap)
parse_name_map(groupmap, False);
diff --git a/rsync.1.md b/rsync.1.md
--- a/rsync.1.md
+++ b/rsync.1.md
-@@ -474,6 +474,7 @@ has its own detailed description later in this manpage.
+@@ -492,6 +492,7 @@ has its own detailed description later in this manpage.
--read-batch=FILE read a batched update from FILE
--protocol=NUM force an older protocol version to be used
--iconv=CONVERT_SPEC request charset conversion of filenames
--checksum-seed=NUM set block/file checksum seed (advanced)
--ipv4, -4 prefer IPv4
--ipv6, -6 prefer IPv6
-@@ -3567,6 +3568,25 @@ your home directory (remove the '=' for that).
+@@ -3618,6 +3619,25 @@ option name from the pathname using a space if you want the shell to expand it.
free to specify just the local charset for a daemon transfer (e.g.
`--iconv=utf8`).
patch -p1 <patches/xxh3-safety-check.diff
make
-based-on: 0ac7ebceef70417355f25daf9e2fd94e84c49749
+based-on: 43f70b961e92d88387fecd3c7f6dbefc044ce4a3
diff --git a/checksum.c b/checksum.c
--- a/checksum.c
+++ b/checksum.c