./configure (optional if already run)
make
-based-on: e1e4ffe057346de61972b2d995ebc9c720a7d8bd
+based-on: af531cf787995f6a3bc381cd1da1988192e7ef59
diff --git a/clientserver.c b/clientserver.c
--- a/clientserver.c
+++ b/clientserver.c
/* 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
-@@ -1150,7 +1401,7 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
+@@ -1158,7 +1409,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];
-@@ -1296,9 +1547,16 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
+@@ -1304,9 +1555,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
-@@ -1316,11 +1574,8 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
+@@ -1324,11 +1582,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))
-@@ -1405,8 +1660,14 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
+@@ -1413,8 +1668,14 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
return NULL;
}
if (unsort_ndx)
F_NDX(file) = stats.num_dirs;
-@@ -2618,7 +2879,7 @@ struct file_list *recv_file_list(int f, int dir_ndx)
+@@ -2626,7 +2887,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 */
-@@ -2868,7 +3129,7 @@ void flist_free(struct file_list *flist)
+@@ -2876,7 +3137,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;
-@@ -2919,7 +3180,7 @@ static void flist_sort_and_clean(struct file_list *flist, int strip_root)
+@@ -2927,7 +3188,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;
-@@ -2935,8 +3196,8 @@ static void flist_sort_and_clean(struct file_list *flist, int strip_root)
+@@ -2943,8 +3204,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);
-@@ -2958,7 +3219,7 @@ static void flist_sort_and_clean(struct file_list *flist, int strip_root)
+@@ -2966,7 +3227,7 @@ static void flist_sort_and_clean(struct file_list *flist, int strip_root)
}
flist->high = prev_i;
int ignore_non_existing = 0;
int need_messages_from_generator = 0;
+int checksum_files = CSF_IGNORE_FILES;
+ time_t stop_at_utime = 0;
int max_delete = INT_MIN;
OFF_T max_size = -1;
- OFF_T min_size = -1;
-@@ -776,7 +777,7 @@ enum {OPT_SERVER = 1000, OPT_DAEMON, OPT_SENDER, OPT_EXCLUDE, OPT_EXCLUDE_FROM,
- OPT_FILTER, OPT_COMPARE_DEST, OPT_COPY_DEST, OPT_LINK_DEST, OPT_HELP,
+@@ -783,7 +784,7 @@ enum {OPT_SERVER = 1000, OPT_DAEMON, OPT_SENDER, OPT_EXCLUDE, OPT_EXCLUDE_FROM,
OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_MODIFY_WINDOW, OPT_MIN_SIZE, OPT_CHMOD,
OPT_READ_BATCH, OPT_WRITE_BATCH, OPT_ONLY_WRITE_BATCH, OPT_MAX_SIZE,
-- OPT_NO_D, OPT_APPEND, OPT_NO_ICONV, OPT_INFO, OPT_DEBUG,
-+ OPT_NO_D, OPT_APPEND, OPT_NO_ICONV, OPT_INFO, OPT_DEBUG, OPT_SUMFILES,
- OPT_USERMAP, OPT_GROUPMAP, OPT_CHOWN, OPT_BWLIMIT,
+ OPT_NO_D, OPT_APPEND, OPT_NO_ICONV, OPT_INFO, OPT_DEBUG, OPT_BLOCK_SIZE,
+- OPT_USERMAP, OPT_GROUPMAP, OPT_CHOWN, OPT_BWLIMIT,
++ OPT_USERMAP, OPT_GROUPMAP, OPT_CHOWN, OPT_BWLIMIT, OPT_SUMFILES,
OPT_OLD_COMPRESS, OPT_NEW_COMPRESS, OPT_NO_COMPRESS,
+ OPT_STOP_AFTER, OPT_STOP_AT,
OPT_REFUSED_BASE = 9000};
-@@ -928,6 +929,7 @@ static struct poptOption long_options[] = {
+@@ -935,6 +936,7 @@ static struct poptOption long_options[] = {
{"no-c", 0, POPT_ARG_VAL, &always_checksum, 0, 0, 0 },
{"checksum-choice", 0, POPT_ARG_STRING, &checksum_choice, 0, 0, 0 },
{"cc", 0, POPT_ARG_STRING, &checksum_choice, 0, 0, 0 },
+ {"sumfiles", 0, POPT_ARG_STRING, 0, OPT_SUMFILES, 0, 0 },
- {"block-size", 'B', POPT_ARG_LONG, &block_size, 0, 0, 0 },
+ {"block-size", 'B', POPT_ARG_STRING, 0, OPT_BLOCK_SIZE, 0, 0 },
{"compare-dest", 0, POPT_ARG_STRING, 0, OPT_COMPARE_DEST, 0, 0 },
{"copy-dest", 0, POPT_ARG_STRING, 0, OPT_COPY_DEST, 0, 0 },
-@@ -1751,6 +1753,23 @@ int parse_arguments(int *argc_p, const char ***argv_p)
+@@ -1935,6 +1937,23 @@ int parse_arguments(int *argc_p, const char ***argv_p)
}
break;
case OPT_INFO:
arg = poptGetOptArg(pc);
parse_output_words(info_words, info_levels, arg, USER_PRIORITY);
-@@ -2037,6 +2056,9 @@ int parse_arguments(int *argc_p, const char ***argv_p)
+@@ -2247,6 +2266,9 @@ int parse_arguments(int *argc_p, const char ***argv_p)
}
#endif
+ if (!always_checksum)
+ checksum_files = CSF_IGNORE_FILES;
+
- if (block_size) {
- /* We may not know the real protocol_version at this point if this is the client
- * option parsing, but we still want to check it so that the client can specify
+ if (write_batch && read_batch) {
+ snprintf(err_buf, sizeof err_buf,
+ "--write-batch and --read-batch can not be used together\n");
diff --git a/rsync.1.md b/rsync.1.md
--- a/rsync.1.md
+++ b/rsync.1.md
--archive, -a archive mode; equals -rlptgoD (no -H,-A,-X)
--no-OPTION turn off an implied OPTION (e.g. --no-D)
--recursive, -r recurse into directories
-@@ -681,6 +682,8 @@ your home directory (remove the '=' for that).
+@@ -683,6 +684,8 @@ your home directory (remove the '=' for that).
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
-@@ -691,6 +694,38 @@ your home directory (remove the '=' for that).
+@@ -693,6 +696,38 @@ your home directory (remove the '=' for that).
can be overridden using either the `--checksum-choice` (`--cc`) 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
-@@ -848,6 +848,10 @@ extern int xattrs_ndx;
+@@ -866,6 +866,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)
-@@ -1060,6 +1064,13 @@ typedef struct {
+@@ -1078,6 +1082,13 @@ typedef struct {
#define RELNAMECACHE_LEN (offsetof(relnamecache, fname))
#endif
./configure (optional if already run)
make
-based-on: 194cee671d5e178f20c4494f41911fa8db942935
+based-on: af531cf787995f6a3bc381cd1da1988192e7ef59
diff --git a/Makefile.in b/Makefile.in
--- a/Makefile.in
+++ b/Makefile.in
diff --git a/options.c b/options.c
--- a/options.c
+++ b/options.c
-@@ -777,7 +777,7 @@ enum {OPT_SERVER = 1000, OPT_DAEMON, OPT_SENDER, OPT_EXCLUDE, OPT_EXCLUDE_FROM,
+@@ -783,7 +783,7 @@ enum {OPT_SERVER = 1000, OPT_DAEMON, OPT_SENDER, OPT_EXCLUDE, OPT_EXCLUDE_FROM,
OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_MODIFY_WINDOW, OPT_MIN_SIZE, OPT_CHMOD,
OPT_READ_BATCH, OPT_WRITE_BATCH, OPT_ONLY_WRITE_BATCH, OPT_MAX_SIZE,
- OPT_NO_D, OPT_APPEND, OPT_NO_ICONV, OPT_INFO, OPT_DEBUG,
+ OPT_NO_D, OPT_APPEND, OPT_NO_ICONV, OPT_INFO, OPT_DEBUG, OPT_BLOCK_SIZE,
- OPT_USERMAP, OPT_GROUPMAP, OPT_CHOWN, OPT_BWLIMIT,
+ OPT_USERMAP, OPT_GROUPMAP, OPT_CHOWN, OPT_BWLIMIT, OPT_CLONE_DEST,
OPT_OLD_COMPRESS, OPT_NEW_COMPRESS, OPT_NO_COMPRESS,
+ OPT_STOP_AFTER, OPT_STOP_AT,
OPT_REFUSED_BASE = 9000};
-
-@@ -932,6 +932,7 @@ static struct poptOption long_options[] = {
+@@ -939,6 +939,7 @@ static struct poptOption long_options[] = {
{"compare-dest", 0, POPT_ARG_STRING, 0, OPT_COMPARE_DEST, 0, 0 },
{"copy-dest", 0, POPT_ARG_STRING, 0, OPT_COPY_DEST, 0, 0 },
{"link-dest", 0, POPT_ARG_STRING, 0, OPT_LINK_DEST, 0, 0 },
{"fuzzy", 'y', POPT_ARG_NONE, 0, 'y', 0, 0 },
{"no-fuzzy", 0, POPT_ARG_VAL, &fuzzy_basis, 0, 0, 0 },
{"no-y", 0, POPT_ARG_VAL, &fuzzy_basis, 0, 0, 0 },
-@@ -1192,6 +1193,9 @@ static void set_refuse_options(void)
+@@ -1202,6 +1203,9 @@ static void set_refuse_options(void)
#ifndef SUPPORT_HARD_LINKS
parse_one_refuse_match(0, "link-dest", list_end);
#endif
+#ifndef FICLONE
+ parse_one_refuse_match(0, "clone-dest", list_end);
+#endif
- #ifndef ICONV_OPTION
- parse_one_refuse_match(0, "iconv", list_end);
+ #ifndef HAVE_MKTIME
+ parse_one_refuse_match(0, "stop-at", list_end);
#endif
-@@ -1357,6 +1361,8 @@ char *alt_dest_opt(int type)
+@@ -1528,6 +1532,8 @@ char *alt_dest_opt(int type)
return "--copy-dest";
case LINK_DEST:
return "--link-dest";
+ case CLONE_DEST:
+ return "--clone-dest";
default:
- assert(0);
+ NOISY_DEATH("Unknown alt_dest_opt type");
}
-@@ -1714,6 +1720,10 @@ int parse_arguments(int *argc_p, const char ***argv_p)
+@@ -1898,6 +1904,10 @@ int parse_arguments(int *argc_p, const char ***argv_p)
want_dest_type = LINK_DEST;
goto set_dest_dir;
--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)
-@@ -2282,6 +2283,17 @@ your home directory (remove the '=' for that).
+@@ -2290,6 +2291,17 @@ your home directory (remove the '=' for that).
specified (or implied by `-a`). You can work-around this bug by avoiding
the `-o` option when sending to an old rsync.
diff --git a/t_stub.c b/t_stub.c
--- a/t_stub.c
+++ b/t_stub.c
-@@ -37,6 +37,7 @@ size_t max_alloc = 1024*1024*1024; /* max_alloc is needed when combined with uti
+@@ -37,6 +37,7 @@ size_t max_alloc = 0; /* max_alloc is needed when combined with util2.o */
char *partial_dir;
char *module_dir;
filter_rule_list daemon_filter_list;
./configure
make
-based-on: bcc273d460c4d231001a361fd0e5702578f9f1be
+based-on: af531cf787995f6a3bc381cd1da1988192e7ef59
diff --git a/.gitignore b/.gitignore
--- a/.gitignore
+++ b/.gitignore
extern int io_error;
extern int batch_fd;
extern int eol_nulls;
-@@ -1482,6 +1484,32 @@ static void read_a_msg(void)
+@@ -1487,6 +1489,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;
-@@ -1633,6 +1661,7 @@ static void read_a_msg(void)
+@@ -1638,6 +1666,7 @@ static void read_a_msg(void)
* with a duplicate exit message. */
_exit_cleanup(val, __FILE__, 0 - __LINE__);
default:
int connect_timeout = 0;
int keep_partial = 0;
int safe_symlinks = 0;
-@@ -287,6 +292,7 @@ static struct output_struct debug_words[COUNT_DEBUG+1] = {
+@@ -288,6 +293,7 @@ static struct output_struct debug_words[COUNT_DEBUG+1] = {
DEBUG_WORD(CHDIR, W_CLI|W_SRV, "Debug when the current directory changes"),
DEBUG_WORD(CONNECT, W_CLI, "Debug connection events (levels 1-2)"),
DEBUG_WORD(CMD, W_CLI, "Debug commands+options that are issued (levels 1-2)"),
DEBUG_WORD(DEL, W_REC, "Debug delete actions (levels 1-3)"),
DEBUG_WORD(DELTASUM, W_SND|W_REC, "Debug delta-transfer checksumming (levels 1-4)"),
DEBUG_WORD(DUP, W_REC, "Debug weeding of duplicate names"),
-@@ -664,6 +670,16 @@ static void print_info_flags(enum logcode f)
+@@ -670,6 +676,16 @@ static void print_info_flags(enum logcode f)
#endif
- "prealloc",
+ "stop-at",
+#if !defined HAVE_MYSQL_MYSQL_H || !defined HAVE_LIBMYSQLCLIENT
+ "no "
"*Optimizations",
#ifndef HAVE_SIMD
-@@ -777,6 +793,7 @@ enum {OPT_SERVER = 1000, OPT_DAEMON, OPT_SENDER, OPT_EXCLUDE, OPT_EXCLUDE_FROM,
+@@ -783,6 +799,7 @@ enum {OPT_SERVER = 1000, OPT_DAEMON, OPT_SENDER, OPT_EXCLUDE, OPT_EXCLUDE_FROM,
OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_MODIFY_WINDOW, OPT_MIN_SIZE, OPT_CHMOD,
OPT_READ_BATCH, OPT_WRITE_BATCH, OPT_ONLY_WRITE_BATCH, OPT_MAX_SIZE,
- OPT_NO_D, OPT_APPEND, OPT_NO_ICONV, OPT_INFO, OPT_DEBUG,
+ OPT_NO_D, OPT_APPEND, OPT_NO_ICONV, OPT_INFO, OPT_DEBUG, OPT_BLOCK_SIZE,
+ OPT_NO_DB, OPT_DBONLY,
OPT_USERMAP, OPT_GROUPMAP, OPT_CHOWN, OPT_BWLIMIT,
OPT_OLD_COMPRESS, OPT_NEW_COMPRESS, OPT_NO_COMPRESS,
- OPT_REFUSED_BASE = 9000};
-@@ -928,6 +945,10 @@ static struct poptOption long_options[] = {
+ OPT_STOP_AFTER, OPT_STOP_AT,
+@@ -935,6 +952,10 @@ static struct poptOption long_options[] = {
{"no-c", 0, POPT_ARG_VAL, &always_checksum, 0, 0, 0 },
{"checksum-choice", 0, POPT_ARG_STRING, &checksum_choice, 0, 0, 0 },
{"cc", 0, POPT_ARG_STRING, &checksum_choice, 0, 0, 0 },
+ {"no-db", 0, POPT_ARG_NONE, 0, OPT_NO_DB, 0, 0 },
+ {"db-lax", 0, POPT_ARG_VAL, &db_lax, 1, 0, 0 },
+ {"no-db-lax", 0, POPT_ARG_VAL, &db_lax, 0, 0, 0 },
- {"block-size", 'B', POPT_ARG_LONG, &block_size, 0, 0, 0 },
+ {"block-size", 'B', POPT_ARG_STRING, 0, OPT_BLOCK_SIZE, 0, 0 },
{"compare-dest", 0, POPT_ARG_STRING, 0, OPT_COMPARE_DEST, 0, 0 },
{"copy-dest", 0, POPT_ARG_STRING, 0, OPT_COPY_DEST, 0, 0 },
-@@ -1019,6 +1040,9 @@ static struct poptOption long_options[] = {
+@@ -1029,6 +1050,9 @@ static struct poptOption long_options[] = {
{"dparam", 0, POPT_ARG_STRING, 0, OPT_DAEMON, 0, 0 },
{"detach", 0, POPT_ARG_NONE, 0, OPT_DAEMON, 0, 0 },
{"no-detach", 0, POPT_ARG_NONE, 0, OPT_DAEMON, 0, 0 },
{0,0,0,0, 0, 0, 0}
};
-@@ -1059,6 +1083,39 @@ static struct poptOption long_daemon_options[] = {
+@@ -1069,6 +1093,39 @@ static struct poptOption long_daemon_options[] = {
{0,0,0,0, 0, 0, 0}
};
static char err_buf[200];
-@@ -1184,6 +1241,8 @@ static void set_refuse_options(void)
+@@ -1194,6 +1251,8 @@ static void set_refuse_options(void)
parse_one_refuse_match(0, "iconv", list_end);
#endif
parse_one_refuse_match(0, "log-file*", list_end);
}
#ifndef SUPPORT_ATIMES
-@@ -1327,6 +1386,102 @@ static void create_refuse_error(int which)
+@@ -1498,6 +1557,102 @@ static void create_refuse_error(int which)
snprintf(err_buf + n, sizeof err_buf - n, " (-%c)\n", op->shortName);
}
/* This is used to make sure that --daemon & --server cannot be aliased to
* something else. These options have always disabled popt aliases for the
* parsing of a daemon or server command-line, but we have to make sure that
-@@ -1383,6 +1538,12 @@ int parse_arguments(int *argc_p, const char ***argv_p)
+@@ -1554,6 +1709,12 @@ int parse_arguments(int *argc_p, const char ***argv_p)
return 0;
}
set_refuse_options();
#ifdef ICONV_OPTION
-@@ -1501,6 +1662,12 @@ int parse_arguments(int *argc_p, const char ***argv_p)
+@@ -1672,6 +1833,12 @@ int parse_arguments(int *argc_p, const char ***argv_p)
am_daemon = 1;
return 1;
case OPT_MODIFY_WINDOW:
/* The value has already been set by popt, but
* we need to remember that we're using a
-@@ -1573,6 +1740,10 @@ int parse_arguments(int *argc_p, const char ***argv_p)
+@@ -1744,6 +1911,10 @@ int parse_arguments(int *argc_p, const char ***argv_p)
preserve_devices = preserve_specials = 0;
break;
./configure (optional if already run)
make
-based-on: 19d8550cf48fe8b5f21872892f33ae2203d80bf5
+based-on: af531cf787995f6a3bc381cd1da1988192e7ef59
diff --git a/compat.c b/compat.c
--- a/compat.c
+++ b/compat.c
#ifdef SUPPORT_HARD_LINKS
static int64 dev;
#endif
-@@ -771,6 +790,10 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
+@@ -775,6 +794,10 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
mode = first->mode;
if (atimes_ndx && !S_ISDIR(mode))
atime = F_ATIME(first);
if (preserve_uid)
uid = F_OWNER(first);
if (preserve_gid)
-@@ -822,6 +845,10 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
+@@ -830,6 +853,10 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
if (chmod_modes && !S_ISLNK(mode) && mode)
mode = tweak_mode(mode, chmod_modes);
if (preserve_uid && !(xflags & XMIT_SAME_UID)) {
if (protocol_version < 30)
-@@ -980,6 +1007,10 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
+@@ -988,6 +1015,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) {
-@@ -1377,6 +1408,10 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
+@@ -1385,6 +1416,10 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
}
#endif
file->mode = st.st_mode;
diff --git a/log.c b/log.c
--- a/log.c
+++ b/log.c
-@@ -720,7 +720,8 @@ static void log_formatted(enum logcode code, const char *format, const char *op,
+@@ -724,7 +724,8 @@ static void log_formatted(enum logcode code, const char *format, const char *op,
: S_ISLNK(file->mode) ? 'U' : 'u';
c[9] = !(iflags & ITEM_REPORT_ACL) ? '.' : 'a';
c[10] = !(iflags & ITEM_REPORT_XATTR) ? '.' : 'x';
int io_timeout = 0;
int prune_empty_dirs = 0;
int use_qsort = 0;
-@@ -664,6 +666,11 @@ static void print_info_flags(enum logcode f)
+@@ -670,6 +672,11 @@ static void print_info_flags(enum logcode f)
#endif
- "prealloc",
+ "stop-at",
+#ifndef SUPPORT_FILEFLAGS
+ "no "
"*Optimizations",
#ifndef HAVE_SIMD
-@@ -816,6 +823,8 @@ static struct poptOption long_options[] = {
+@@ -823,6 +830,8 @@ static struct poptOption long_options[] = {
{"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 },
{"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 },
-@@ -910,6 +919,12 @@ static struct poptOption long_options[] = {
+@@ -917,6 +926,12 @@ static struct poptOption long_options[] = {
{"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 },
{"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 },
-@@ -1198,6 +1213,14 @@ static void set_refuse_options(void)
+@@ -1211,6 +1226,14 @@ static void set_refuse_options(void)
#ifndef HAVE_SETVBUF
parse_one_refuse_match(0, "outbuf", list_end);
#endif
/* Now we use the descrip values to actually mark the options for refusal. */
for (op = long_options; op != list_end; op++) {
-@@ -2647,6 +2670,9 @@ void server_options(char **args, int *argc_p)
+@@ -2844,6 +2867,9 @@ void server_options(char **args, int *argc_p)
if (xfer_dirs && !recurse && delete_mode && am_sender)
args[ac++] = "--no-r";
if (do_compression && do_compression_level != CLVL_NOT_SPECIFIED) {
if (asprintf(&arg, "--compress-level=%d", do_compression_level) < 0)
goto oom;
-@@ -2750,6 +2776,16 @@ void server_options(char **args, int *argc_p)
+@@ -2947,6 +2973,16 @@ void server_options(char **args, int *argc_p)
args[ac++] = "--delete-excluded";
if (force_delete)
args[ac++] = "--force";
--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
-@@ -700,6 +704,8 @@ your home directory (remove the '=' for that).
+@@ -702,6 +706,8 @@ your home directory (remove the '=' for that).
Note that `-a` **does not preserve hardlinks**, because finding
multiply-linked files is expensive. You must separately specify `-H`.
0. `--no-OPTION`
-@@ -1038,7 +1044,7 @@ your home directory (remove the '=' for that).
+@@ -1040,7 +1046,7 @@ your home directory (remove the '=' for that).
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` for an analogous option for the receiving side.
-@@ -1224,6 +1230,29 @@ your home directory (remove the '=' for that).
+@@ -1226,6 +1232,29 @@ your home directory (remove the '=' for that).
those used by `--fake-super`) unless you repeat the option (e.g. `-XX`).
This "copy all xattrs" mode cannot be used with `--fake-super`.
0. `--chmod=CHMOD`
This option tells rsync to apply one or more comma-separated "chmod" modes
-@@ -1686,7 +1715,7 @@ your home directory (remove the '=' for that).
+@@ -1688,7 +1717,7 @@ your home directory (remove the '=' for that).
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
that, this option is independent of any other type of delete processing.
The missing source files are represented by special file-list entries which
-@@ -1697,15 +1726,16 @@ your home directory (remove the '=' for that).
+@@ -1699,15 +1728,16 @@ your home directory (remove the '=' for that).
Tells `--delete` to go ahead and delete files even when there are I/O
errors.
0. `--max-delete=NUM`
-@@ -2612,7 +2642,7 @@ your home directory (remove the '=' for that).
+@@ -2620,7 +2650,7 @@ your home directory (remove the '=' for that).
output of other verbose messages).
The "%i" escape has a cryptic output that is 11 letters long. The general
diff --git a/xattrs.c b/xattrs.c
--- a/xattrs.c
+++ b/xattrs.c
-@@ -1204,7 +1204,7 @@ int set_stat_xattr(const char *fname, struct file_struct *file, mode_t new_mode)
+@@ -1203,7 +1203,7 @@ int set_stat_xattr(const char *fname, struct file_struct *file, mode_t new_mode)
mode = (fst.st_mode & _S_IFMT) | (fmode & ACCESSPERMS)
| (S_ISDIR(fst.st_mode) ? 0700 : 0600);
if (fst.st_mode != mode)
./configure (optional if already run)
make
-based-on: 194cee671d5e178f20c4494f41911fa8db942935
+based-on: af531cf787995f6a3bc381cd1da1988192e7ef59
diff --git a/options.c b/options.c
--- a/options.c
+++ b/options.c
int ignore_times = 0;
int delete_mode = 0;
int delete_during = 0;
-@@ -988,6 +989,7 @@ static struct poptOption long_options[] = {
+@@ -995,6 +996,7 @@ static struct poptOption long_options[] = {
{"no-timeout", 0, POPT_ARG_VAL, &io_timeout, 0, 0, 0 },
{"contimeout", 0, POPT_ARG_INT, &connect_timeout, 0, 0, 0 },
{"no-contimeout", 0, POPT_ARG_VAL, &connect_timeout, 0, 0, 0 },
+ {"fsync", 0, POPT_ARG_NONE, &do_fsync, 0, 0, 0 },
- {"rsh", 'e', POPT_ARG_STRING, &shell_cmd, 0, 0, 0 },
- {"rsync-path", 0, POPT_ARG_STRING, &rsync_path, 0, 0, 0 },
- {"temp-dir", 'T', POPT_ARG_STRING, &tmpdir, 0, 0, 0 },
-@@ -2840,6 +2842,9 @@ void server_options(char **args, int *argc_p)
+ {"stop-after", 0, POPT_ARG_STRING, 0, OPT_STOP_AFTER, 0, 0 },
+ {"time-limit", 0, POPT_ARG_STRING, 0, OPT_STOP_AFTER, 0, 0 }, /* earlier stop-after name */
+ {"stop-at", 0, POPT_ARG_STRING, 0, OPT_STOP_AT, 0, 0 },
+@@ -3038,6 +3040,9 @@ void server_options(char **args, int *argc_p)
args[ac++] = tmpdir;
}
diff --git a/flist.c b/flist.c
--- a/flist.c
+++ b/flist.c
-@@ -1619,6 +1619,9 @@ static struct file_struct *send_file_name(int f, struct file_list *flist,
+@@ -1627,6 +1627,9 @@ static struct file_struct *send_file_name(int f, struct file_list *flist,
#ifdef SUPPORT_XATTRS
if (preserve_xattrs) {
sx.st.st_mode = file->mode;
diff --git a/main.c b/main.c
--- a/main.c
+++ b/main.c
-@@ -31,6 +31,10 @@
+@@ -34,6 +34,10 @@
#ifdef SUPPORT_FORCE_CHANGE
#include <sys/sysctl.h>
#endif
extern int dry_run;
extern int list_only;
-@@ -56,6 +60,7 @@ extern int copy_dirlinks;
+@@ -59,6 +63,7 @@ extern int copy_dirlinks;
extern int copy_unsafe_links;
extern int keep_dirlinks;
extern int preserve_hard_links;
extern int protocol_version;
extern int force_change;
extern int file_total;
-@@ -112,6 +117,7 @@ int daemon_over_rsh = 0;
+@@ -115,6 +120,7 @@ int daemon_over_rsh = 0;
mode_t orig_umask = 0;
int batch_gen_fd = -1;
int sender_keeps_checksum = 0;
int raw_argc, cooked_argc;
char **raw_argv, **cooked_argv;
-@@ -662,6 +668,43 @@ static pid_t do_cmd(char *cmd, char *machine, char *user, char **remote_argv, in
+@@ -665,6 +671,43 @@ static pid_t do_cmd(char *cmd, char *machine, char *user, char **remote_argv, in
return pid;
}
/* The receiving side operates in one of two modes:
*
* 1. it receives any number of files into a destination directory,
-@@ -720,6 +763,9 @@ static char *get_local_name(struct file_list *flist, char *dest_path)
+@@ -723,6 +766,9 @@ static char *get_local_name(struct file_list *flist, char *dest_path)
exit_cleanup(RERR_FILESELECT);
}
filesystem_dev = st.st_dev; /* ensures --force works right w/-x */
return NULL;
}
if (file_total > 1) {
-@@ -779,7 +825,9 @@ static char *get_local_name(struct file_list *flist, char *dest_path)
+@@ -782,7 +828,9 @@ static char *get_local_name(struct file_list *flist, char *dest_path)
full_fname(dest_path));
exit_cleanup(RERR_FILESELECT);
}
return NULL;
}
-@@ -799,6 +847,9 @@ static char *get_local_name(struct file_list *flist, char *dest_path)
+@@ -802,6 +850,9 @@ static char *get_local_name(struct file_list *flist, char *dest_path)
full_fname(dest_path));
exit_cleanup(RERR_FILESELECT);
}
int preserve_perms = 0;
int preserve_fileflags = 0;
int preserve_executability = 0;
-@@ -934,6 +935,10 @@ static struct poptOption long_options[] = {
+@@ -941,6 +942,10 @@ static struct poptOption long_options[] = {
{"no-force-change", 0, POPT_ARG_VAL, &force_change, 0, 0, 0 },
{"force-uchange", 0, POPT_ARG_VAL, &force_change, USR_IMMUTABLE, 0, 0 },
{"force-schange", 0, POPT_ARG_VAL, &force_change, SYS_IMMUTABLE, 0, 0 },
{"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 },
-@@ -1233,6 +1238,10 @@ static void set_refuse_options(void)
+@@ -1246,6 +1251,10 @@ static void set_refuse_options(void)
#ifndef SUPPORT_CRTIMES
parse_one_refuse_match(0, "crtimes", list_end);
#endif
/* Now we use the descrip values to actually mark the options for refusal. */
for (op = long_options; op != list_end; op++) {
-@@ -2072,6 +2081,15 @@ int parse_arguments(int *argc_p, const char ***argv_p)
+@@ -2282,6 +2291,15 @@ int parse_arguments(int *argc_p, const char ***argv_p)
}
#endif
+ }
+#endif
+
- if (block_size) {
- /* We may not know the real protocol_version at this point if this is the client
- * option parsing, but we still want to check it so that the client can specify
-@@ -2688,6 +2706,11 @@ void server_options(char **args, int *argc_p)
+ if (write_batch && read_batch) {
+ snprintf(err_buf, sizeof err_buf,
+ "--write-batch and --read-batch can not be used together\n");
+@@ -2886,6 +2904,11 @@ void server_options(char **args, int *argc_p)
if (preserve_fileflags)
args[ac++] = "--fileflags";
--owner, -o preserve owner (super-user only)
--group, -g preserve group
--devices preserve device files (super-user only)
-@@ -1254,6 +1256,47 @@ your home directory (remove the '=' for that).
+@@ -1256,6 +1258,47 @@ your home directory (remove the '=' for that).
receiving side. It does not try to affect user flags. This option
overrides `--force-change` and `--force-uchange`.
diff --git a/rsync.h b/rsync.h
--- a/rsync.h
+++ b/rsync.h
-@@ -579,6 +579,17 @@ typedef unsigned int size_t;
+@@ -597,6 +597,17 @@ typedef unsigned int size_t;
#define ST_FLAGS(st) NO_FFLAGS
#endif
int preserve_executability = 0;
+int preserve_hfs_compression = 0;
int open_noatime = 0;
- size_t max_alloc = 1024*1024*1024; /* max_alloc is needed when combined with util2.o */
+ size_t max_alloc = 0; /* max_alloc is needed when combined with util2.o */
char *partial_dir;
diff --git a/xattrs.c b/xattrs.c
--- a/xattrs.c
write_varint(f_out, len); /* length might have changed! */
write_bigbuf(f_out, ptr, len);
free(ptr);
-@@ -950,7 +1011,7 @@ static int rsync_xal_set(const char *fname, item_list *xalp,
+@@ -949,7 +1010,7 @@ static int rsync_xal_set(const char *fname, item_list *xalp,
int user_only = am_root <= 0;
#endif
size_t name_len;
/* This puts the current name list into the "namebuf" buffer. */
if ((list_len = get_xattr_names(fname)) < 0)
-@@ -963,7 +1024,10 @@ static int rsync_xal_set(const char *fname, item_list *xalp,
+@@ -962,7 +1023,10 @@ static int rsync_xal_set(const char *fname, item_list *xalp,
int sum_len;
/* See if the fnamecmp version is identical. */
len = name_len = rxas[i].name_len;
still_abbrev:
if (am_generator)
continue;
-@@ -972,6 +1036,8 @@ static int rsync_xal_set(const char *fname, item_list *xalp,
+@@ -971,6 +1035,8 @@ static int rsync_xal_set(const char *fname, item_list *xalp,
ret = -1;
continue;
}
if (len != rxas[i].datum_len) {
free(ptr);
goto still_abbrev;
-@@ -1049,6 +1115,10 @@ static int rsync_xal_set(const char *fname, item_list *xalp,
+@@ -1048,6 +1114,10 @@ static int rsync_xal_set(const char *fname, item_list *xalp,
}
}
return ret;
}
-@@ -1097,7 +1167,7 @@ char *get_xattr_acl(const char *fname, int is_access_acl, size_t *len_p)
+@@ -1096,7 +1166,7 @@ char *get_xattr_acl(const char *fname, int is_access_acl, size_t *len_p)
{
const char *name = is_access_acl ? XACC_ACL_ATTR : XDEF_ACL_ATTR;
*len_p = 0; /* no extra data alloc needed from get_xattr_data() */
}
int set_xattr_acl(const char *fname, int is_access_acl, const char *buf, size_t buf_len)
-@@ -1240,11 +1310,33 @@ int set_stat_xattr(const char *fname, struct file_struct *file, mode_t new_mode)
+@@ -1239,11 +1309,33 @@ int set_stat_xattr(const char *fname, struct file_struct *file, mode_t new_mode)
return 0;
}
return ret;
}
-@@ -1253,6 +1345,9 @@ int x_lstat(const char *fname, STRUCT_STAT *fst, STRUCT_STAT *xst)
+@@ -1252,6 +1344,9 @@ int x_lstat(const char *fname, STRUCT_STAT *fst, STRUCT_STAT *xst)
int ret = do_lstat(fname, fst);
if ((ret < 0 || get_stat_xattr(fname, -1, fst, xst) < 0) && xst)
xst->st_mode = 0;
return ret;
}
-@@ -1261,6 +1356,9 @@ int x_fstat(int fd, STRUCT_STAT *fst, STRUCT_STAT *xst)
+@@ -1260,6 +1355,9 @@ int x_fstat(int fd, STRUCT_STAT *fst, STRUCT_STAT *xst)
int ret = do_fstat(fd, fst);
if ((ret < 0 || get_stat_xattr(NULL, fd, fst, xst) < 0) && xst)
xst->st_mode = 0;
- Make this code handle multibyte character encodings, and honor the
--iconv setting when converting case.
-based-on: 194cee671d5e178f20c4494f41911fa8db942935
+based-on: af531cf787995f6a3bc381cd1da1988192e7ef59
diff --git a/exclude.c b/exclude.c
--- a/exclude.c
+++ b/exclude.c
extern int ignore_errors;
extern int numeric_ids;
extern int quiet;
-@@ -2538,7 +2539,8 @@ struct file_list *recv_file_list(int f, int dir_ndx)
+@@ -2544,7 +2545,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);
-@@ -3111,6 +3113,7 @@ int f_name_cmp(const struct file_struct *f1, const struct file_struct *f2)
+@@ -3116,6 +3118,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;
-@@ -3221,7 +3224,15 @@ int f_name_cmp(const struct file_struct *f1, const struct file_struct *f2)
+@@ -3226,7 +3229,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/options.c b/options.c
--- a/options.c
+++ b/options.c
-@@ -124,6 +124,7 @@ OFF_T max_size = -1;
+@@ -125,6 +125,7 @@ OFF_T max_size = -1;
OFF_T min_size = -1;
int ignore_errors = 0;
int modify_window = 0;
int blocking_io = -1;
int checksum_seed = 0;
int inplace = 0;
-@@ -973,6 +974,8 @@ static struct poptOption long_options[] = {
+@@ -980,6 +981,8 @@ static struct poptOption long_options[] = {
{"read-batch", 0, POPT_ARG_STRING, &batch_name, OPT_READ_BATCH, 0, 0 },
{"write-batch", 0, POPT_ARG_STRING, &batch_name, OPT_WRITE_BATCH, 0, 0 },
{"only-write-batch", 0, POPT_ARG_STRING, &batch_name, OPT_ONLY_WRITE_BATCH, 0, 0 },
{"files-from", 0, POPT_ARG_STRING, &files_from, 0, 0, 0 },
{"from0", '0', POPT_ARG_VAL, &eol_nulls, 1, 0, 0},
{"no-from0", 0, POPT_ARG_VAL, &eol_nulls, 0, 0, 0},
-@@ -2790,6 +2793,9 @@ void server_options(char **args, int *argc_p)
+@@ -2988,6 +2991,9 @@ void server_options(char **args, int *argc_p)
args[ac++] = arg;
}
--address=ADDRESS bind address for outgoing socket to daemon
--port=PORT specify double-colon alternate port number
--sockopts=OPTIONS specify custom TCP options
-@@ -2146,6 +2147,12 @@ your home directory (remove the '=' for that).
+@@ -2154,6 +2155,12 @@ your home directory (remove the '=' for that).
> sudo rsync -aive lsh -M--copy-as=joe src/ lh:dest/
int preserve_executability = 0;
int open_noatime = 0;
+int ignore_case = 0;
- size_t max_alloc = 1024*1024*1024; /* max_alloc is needed when combined with util2.o */
+ size_t max_alloc = 0; /* max_alloc is needed when combined with util2.o */
char *partial_dir;
char *module_dir;
diff --git a/wildtest.c b/wildtest.c
./configure
make
-based-on: 194cee671d5e178f20c4494f41911fa8db942935
+based-on: af531cf787995f6a3bc381cd1da1988192e7ef59
diff --git a/Makefile.in b/Makefile.in
--- a/Makefile.in
+++ b/Makefile.in
diff --git a/options.c b/options.c
--- a/options.c
+++ b/options.c
-@@ -165,6 +165,7 @@ char *backup_suffix = NULL;
+@@ -166,6 +166,7 @@ char *backup_suffix = NULL;
char *tmpdir = NULL;
char *partial_dir = NULL;
char *basis_dir[MAX_BASIS_DIRS+1];
char *config_file = NULL;
char *shell_cmd = NULL;
char *logfile_name = NULL;
-@@ -226,7 +227,7 @@ static const char *debug_verbosity[] = {
+@@ -227,7 +228,7 @@ static const char *debug_verbosity[] = {
/*2*/ "BIND,CMD,CONNECT,DEL,DELTASUM,DUP,FILTER,FLIST,ICONV",
/*3*/ "ACL,BACKUP,CONNECT2,DELTASUM2,DEL2,EXIT,FILTER2,FLIST2,FUZZY,GENR,OWN,RECV,SEND,TIME",
/*4*/ "CMD2,DELTASUM3,DEL3,EXIT2,FLIST3,ICONV2,OWN2,PROTO,TIME2",
};
#define MAX_VERBOSITY ((int)(sizeof debug_verbosity / sizeof debug_verbosity[0]) - 1)
-@@ -296,6 +297,7 @@ static struct output_struct debug_words[COUNT_DEBUG+1] = {
+@@ -297,6 +298,7 @@ static struct output_struct debug_words[COUNT_DEBUG+1] = {
DEBUG_WORD(FUZZY, W_REC, "Debug fuzzy scoring (levels 1-2)"),
DEBUG_WORD(GENR, W_REC, "Debug generator functions"),
DEBUG_WORD(HASH, W_SND|W_REC, "Debug hashtable code"),
DEBUG_WORD(HLINK, W_SND|W_REC, "Debug hard-link actions (levels 1-3)"),
DEBUG_WORD(ICONV, W_CLI|W_SRV, "Debug iconv character conversions (levels 1-2)"),
DEBUG_WORD(IO, W_CLI|W_SRV, "Debug I/O routines (levels 1-4)"),
-@@ -776,7 +778,7 @@ enum {OPT_SERVER = 1000, OPT_DAEMON, OPT_SENDER, OPT_EXCLUDE, OPT_EXCLUDE_FROM,
- OPT_FILTER, OPT_COMPARE_DEST, OPT_COPY_DEST, OPT_LINK_DEST, OPT_HELP,
+@@ -783,7 +785,7 @@ enum {OPT_SERVER = 1000, OPT_DAEMON, OPT_SENDER, OPT_EXCLUDE, OPT_EXCLUDE_FROM,
OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_MODIFY_WINDOW, OPT_MIN_SIZE, OPT_CHMOD,
OPT_READ_BATCH, OPT_WRITE_BATCH, OPT_ONLY_WRITE_BATCH, OPT_MAX_SIZE,
-- OPT_NO_D, OPT_APPEND, OPT_NO_ICONV, OPT_INFO, OPT_DEBUG,
-+ OPT_NO_D, OPT_APPEND, OPT_NO_ICONV, OPT_INFO, OPT_DEBUG, OPT_LINK_BY_HASH,
- OPT_USERMAP, OPT_GROUPMAP, OPT_CHOWN, OPT_BWLIMIT,
+ OPT_NO_D, OPT_APPEND, OPT_NO_ICONV, OPT_INFO, OPT_DEBUG, OPT_BLOCK_SIZE,
+- OPT_USERMAP, OPT_GROUPMAP, OPT_CHOWN, OPT_BWLIMIT,
++ OPT_USERMAP, OPT_GROUPMAP, OPT_CHOWN, OPT_BWLIMIT, OPT_LINK_BY_HASH,
OPT_OLD_COMPRESS, OPT_NEW_COMPRESS, OPT_NO_COMPRESS,
+ OPT_STOP_AFTER, OPT_STOP_AT,
OPT_REFUSED_BASE = 9000};
-@@ -932,6 +934,7 @@ static struct poptOption long_options[] = {
+@@ -939,6 +941,7 @@ static struct poptOption long_options[] = {
{"compare-dest", 0, POPT_ARG_STRING, 0, OPT_COMPARE_DEST, 0, 0 },
{"copy-dest", 0, POPT_ARG_STRING, 0, OPT_COPY_DEST, 0, 0 },
{"link-dest", 0, POPT_ARG_STRING, 0, OPT_LINK_DEST, 0, 0 },
{"fuzzy", 'y', POPT_ARG_NONE, 0, 'y', 0, 0 },
{"no-fuzzy", 0, POPT_ARG_VAL, &fuzzy_basis, 0, 0, 0 },
{"no-y", 0, POPT_ARG_VAL, &fuzzy_basis, 0, 0, 0 },
-@@ -1178,6 +1181,9 @@ static void set_refuse_options(void)
+@@ -1188,6 +1191,9 @@ static void set_refuse_options(void)
ref = cp + 1;
}
if (am_daemon) {
#ifdef ICONV_OPTION
if (!*lp_charset(module_id))
-@@ -1863,6 +1869,21 @@ int parse_arguments(int *argc_p, const char ***argv_p)
+@@ -2047,6 +2053,20 @@ int parse_arguments(int *argc_p, const char ***argv_p)
return 0;
#endif
+ snprintf(err_buf, sizeof err_buf,
+ "hard links are not supported on this %s\n",
+ am_server ? "server" : "client");
-+ rprintf(FERROR, "ERROR: %s", err_buf);
+ return 0;
+#endif
+
- default:
- /* A large opt value means that set_refuse_options()
- * turned this option off. */
-@@ -2184,6 +2205,8 @@ int parse_arguments(int *argc_p, const char ***argv_p)
+ case OPT_STOP_AFTER: {
+ long val;
+ arg = poptGetOptArg(pc);
+@@ -2381,6 +2401,8 @@ int parse_arguments(int *argc_p, const char ***argv_p)
tmpdir = sanitize_path(NULL, tmpdir, NULL, 0, SP_DEFAULT);
if (backup_dir)
backup_dir = sanitize_path(NULL, backup_dir, NULL, 0, SP_DEFAULT);
}
if (daemon_filter_list.head && !am_sender) {
filter_rule_list *elp = &daemon_filter_list;
-@@ -2865,6 +2888,12 @@ void server_options(char **args, int *argc_p)
+@@ -3063,6 +3085,12 @@ void server_options(char **args, int *argc_p)
} else if (inplace)
args[ac++] = "--inplace";
--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)
-@@ -2282,6 +2283,50 @@ your home directory (remove the '=' for that).
+@@ -2290,6 +2291,50 @@ your home directory (remove the '=' for that).
specified (or implied by `-a`). You can work-around this bug by avoiding
the `-o` option when sending to an old rsync.
diff --git a/rsync.h b/rsync.h
--- a/rsync.h
+++ b/rsync.h
-@@ -1368,7 +1368,8 @@ extern short info_levels[], debug_levels[];
+@@ -1408,7 +1408,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: 194cee671d5e178f20c4494f41911fa8db942935
+based-on: af531cf787995f6a3bc381cd1da1988192e7ef59
diff --git a/flist.c b/flist.c
--- a/flist.c
+++ b/flist.c
extern uid_t our_uid;
extern struct stats stats;
extern char *filesfrom_host;
-@@ -1782,6 +1783,9 @@ static void send_directory(int f, struct file_list *flist, char *fbuf, int len,
+@@ -1790,6 +1791,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);
size_t bwlimit_writemax = 0;
int ignore_existing = 0;
int ignore_non_existing = 0;
-@@ -963,6 +964,7 @@ static struct poptOption long_options[] = {
+@@ -970,6 +971,7 @@ static struct poptOption long_options[] = {
{"itemize-changes", 'i', POPT_ARG_NONE, 0, 'i', 0, 0 },
{"no-itemize-changes",0, POPT_ARG_VAL, &itemize_changes, 0, 0, 0 },
{"no-i", 0, POPT_ARG_VAL, &itemize_changes, 0, 0, 0 },
--list-only list the files instead of copying them
--bwlimit=RATE limit socket I/O bandwidth
+--slow-down=USECs sleep N usec while creating the filelist
+ --stop-after=MINS Stop rsync after MINS minutes have elapsed
+ --stop-at=y-m-dTh:m Stop rsync at the specified moment in time
--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
TODO: the configure changes should abort if the user requests --enable-slp
and we can't honor that request.
-based-on: 194cee671d5e178f20c4494f41911fa8db942935
+based-on: af531cf787995f6a3bc381cd1da1988192e7ef59
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
-@@ -976,6 +976,29 @@ if test $rsync_cv_can_hardlink_special = yes; then
+@@ -985,6 +985,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
-@@ -1362,6 +1362,18 @@ static int start_client(int argc, char *argv[])
+@@ -1365,6 +1365,18 @@ 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);
diff --git a/options.c b/options.c
--- a/options.c
+++ b/options.c
-@@ -664,6 +664,11 @@ static void print_info_flags(enum logcode f)
+@@ -670,6 +670,11 @@ static void print_info_flags(enum logcode f)
#endif
- "prealloc",
+ "stop-at",
+#ifndef HAVE_LIBSLP
+ "no "