int modify_window = 0;
int blocking_io = -1;
int checksum_seed = 0;
+int inplace = 0;
unsigned int block_size = 0;
static void print_rsync_version(enum logcode f)
{
char const *got_socketpair = "no ";
+ char const *have_inplace = "no ";
char const *hardlinks = "no ";
char const *links = "no ";
char const *ipv6 = "no ";
got_socketpair = "";
#endif
+#if HAVE_FTRUNCATE
+ have_inplace = "";
+#endif
+
#if SUPPORT_HARD_LINKS
hardlinks = "";
#endif
/* Note that this field may not have type ino_t. It depends
* on the complicated interaction between largefile feature
* macros. */
- rprintf(f, " %sIPv6, %d-bit system inums, %d-bit internal inums\n",
- ipv6,
+ rprintf(f, " %sinplace, %sIPv6, %d-bit system inums, %d-bit internal inums\n",
+ have_inplace, ipv6,
(int) (sizeof dumstat->st_ino * 8),
(int) (sizeof (uint64) * 8));
#ifdef MAINTAINER_MODE
rprintf(F," --backup-dir make backups into this directory\n");
rprintf(F," --suffix=SUFFIX backup suffix (default %s w/o --backup-dir)\n",BACKUP_SUFFIX);
rprintf(F," -u, --update update only (don't overwrite newer files)\n");
+ rprintf(F," --inplace update the destination file inplace (see man page)\n");
rprintf(F," -K, --keep-dirlinks treat symlinked dir on receiver as dir\n");
rprintf(F," -l, --links copy symlinks as symlinks\n");
rprintf(F," -L, --copy-links copy the referent of all symlinks\n");
{"sparse", 'S', POPT_ARG_NONE, &sparse_files, 0, 0, 0 },
{"cvs-exclude", 'C', POPT_ARG_NONE, &cvs_exclude, 0, 0, 0 },
{"update", 'u', POPT_ARG_NONE, &update_only, 0, 0, 0 },
+ {"inplace", 0, POPT_ARG_NONE, &inplace, 0, 0, 0 },
{"keep-dirlinks", 'K', POPT_ARG_NONE, &keep_dirlinks, 0, 0, 0 },
{"links", 'l', POPT_ARG_NONE, &preserve_links, 0, 0, 0 },
{"copy-links", 'L', POPT_ARG_NONE, ©_links, 0, 0, 0 },
}
#endif
+ if (block_size > MAX_MAP_SIZE) {
+ rprintf(FINFO, "limiting block-size to %d bytes\n",
+ MAX_MAP_SIZE);
+ block_size = MAX_MAP_SIZE;
+ }
+
if (write_batch && read_batch) {
rprintf(FERROR,
- "write-batch and read-batch can not be used together\n");
+ "--write-batch and --read-batch can not be used together\n");
exit_cleanup(RERR_SYNTAX);
}
- if ((write_batch || read_batch) && am_server) {
+ if (write_batch || read_batch) {
+ if (dry_run) {
+ rprintf(FERROR,
+ "--%s-batch cannot be used with --dry_run (-n)\n",
+ write_batch ? "write" : "read");
+ exit_cleanup(RERR_SYNTAX);
+ }
+ if (am_server) {
+ rprintf(FINFO,
+ "ignoring --%s-batch option sent to server\n",
+ write_batch ? "write" : "read");
+ /* We don't actually exit_cleanup(), so that we can
+ * still service older version clients that still send
+ * batch args to server. */
+ read_batch = write_batch = 0;
+ batch_name = NULL;
+ }
+ }
+ if (read_batch && files_from) {
rprintf(FERROR,
- "batch-mode is incompatible with server mode\n");
- /* We don't actually exit_cleanup(), so that we can still service
- * older version clients that still send batch args to server. */
- read_batch = write_batch = 0;
- batch_name = NULL;
+ "--read-batch cannot be used with --files-from\n");
+ exit_cleanup(RERR_SYNTAX);
}
if (batch_name && strlen(batch_name) > MAX_BATCH_NAME_LEN) {
rprintf(FERROR,
bwlimit_writemax = 512;
}
+ if (inplace) {
+#if HAVE_FTRUNCATE
+ keep_partial = 0;
+#else
+ snprintf(err_buf, sizeof err_buf,
+ "--inplace is not supported on this %s\n",
+ am_server ? "server" : "client");
+ return 0;
+#endif
+ }
+
if (files_from) {
char *colon;
if (*argc != 2 && !(am_server && am_sender && *argc == 1)) {
if (opt_ignore_existing && am_sender)
args[ac++] = "--ignore-existing";
+ if (inplace)
+ args[ac++] = "--inplace";
+
if (tmpdir) {
args[ac++] = "--temp-dir";
args[ac++] = tmpdir;