int update_only = 0;
int cvs_exclude = 0;
int dry_run = 0;
+int do_xfers = 1;
int ignore_times = 0;
int delete_mode = 0;
int delete_during = 0;
rprintf(F,"\nrsync is a file transfer program capable of efficient remote update\nvia a fast differencing algorithm.\n\n");
rprintf(F,"Usage: rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST\n");
- rprintf(F," or rsync [OPTION]... [USER@]HOST:SRC DEST\n");
+ rprintf(F," or rsync [OPTION]... [USER@]HOST:SRC [DEST]\n");
rprintf(F," or rsync [OPTION]... SRC [SRC]... DEST\n");
rprintf(F," or rsync [OPTION]... [USER@]HOST::SRC [DEST]\n");
rprintf(F," or rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST\n");
rprintf(F," --include=PATTERN don't exclude files matching PATTERN\n");
rprintf(F," --include-from=FILE read include patterns from FILE\n");
rprintf(F," --files-from=FILE read list of source-file names from FILE\n");
- rprintf(F," -0, --from0 all *-from file lists are delimited by nulls\n");
- rprintf(F," --version print version number\n");
+ rprintf(F," -0, --from0 all *-from/filter files are delimited by 0s\n");
+ rprintf(F," --address=ADDRESS bind address for outgoing socket to daemon\n");
rprintf(F," --port=PORT specify double-colon alternate port number\n");
rprintf(F," --blocking-io use blocking I/O for the remote shell\n");
rprintf(F," --no-blocking-io turn off blocking I/O when it is the default\n");
rprintf(F," --progress show progress during transfer\n");
rprintf(F," -P same as --partial --progress\n");
rprintf(F," -i, --itemize-changes output a change-summary for all updates\n");
- rprintf(F," --log-format=FORMAT log file-transfers using specified format\n");
+ rprintf(F," --log-format=FORMAT output filenames using the specified format\n");
rprintf(F," --password-file=FILE read password from FILE\n");
rprintf(F," --list-only list the files instead of copying them\n");
rprintf(F," --bwlimit=KBPS limit I/O bandwidth; KBytes per second\n");
rprintf(F," --write-batch=FILE write a batched update to FILE\n");
+ rprintf(F," --only-write-batch=FILE like --write-batch but w/o updating destination\n");
rprintf(F," --read-batch=FILE read a batched update from FILE\n");
rprintf(F," --protocol=NUM force an older protocol version to be used\n");
#ifdef INET6
rprintf(F," -4, --ipv4 prefer IPv4\n");
rprintf(F," -6, --ipv6 prefer IPv6\n");
#endif
+ rprintf(F," --version print version number\n");
rprintf(F," -h, --help show this help screen\n");
rprintf(F,"\nUse \"rsync --daemon --help\" to see the daemon-mode command-line options.\n");
enum {OPT_VERSION = 1000, OPT_DAEMON, OPT_SENDER, OPT_EXCLUDE, OPT_EXCLUDE_FROM,
OPT_FILTER, OPT_COMPARE_DEST, OPT_COPY_DEST, OPT_LINK_DEST,
OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_MODIFY_WINDOW,
- OPT_READ_BATCH, OPT_WRITE_BATCH, OPT_TIMEOUT, OPT_MAX_SIZE,
+ OPT_READ_BATCH, OPT_WRITE_BATCH, OPT_ONLY_WRITE_BATCH,
+ OPT_TIMEOUT, OPT_MAX_SIZE,
OPT_REFUSED_BASE = 9000};
static struct poptOption long_options[] = {
{"no-blocking-io", 0, POPT_ARG_VAL, &blocking_io, 0, 0, 0 },
{0, 'F', POPT_ARG_NONE, 0, 'F', 0, 0 },
{0, 'P', POPT_ARG_NONE, 0, 'P', 0, 0 },
+ {"address", 0, POPT_ARG_STRING, &bind_address, 0, 0, 0 },
{"port", 0, POPT_ARG_INT, &rsync_port, 0, 0, 0 },
{"log-format", 0, POPT_ARG_STRING, &log_format, 0, 0, 0 },
{"itemize-changes", 'i', POPT_ARG_NONE, &itemize_changes, 0, 0, 0 },
{"hard-links", 'H', POPT_ARG_NONE, &preserve_hard_links, 0, 0, 0 },
{"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_NONE, &eol_nulls, 0, 0, 0},
{"no-implied-dirs", 0, POPT_ARG_VAL, &implied_dirs, 0, 0, 0 },
{"ipv6", '6', POPT_ARG_VAL, &default_af_hint, AF_INET6, 0, 0 },
#endif
/* All these options switch us into daemon-mode option-parsing. */
- {"address", 0, POPT_ARG_STRING, 0, OPT_DAEMON, 0, 0 },
{"config", 0, POPT_ARG_STRING, 0, OPT_DAEMON, 0, 0 },
{"daemon", 0, POPT_ARG_NONE, 0, OPT_DAEMON, 0, 0 },
{"detach", 0, POPT_ARG_NONE, 0, OPT_DAEMON, 0, 0 },
}
+static OFF_T parse_size_arg(const char *size_arg)
+{
+ const char *arg;
+ OFF_T size;
+
+ for (arg = size_arg; isdigit(*(uchar*)arg); arg++) {}
+ if (*arg == '.')
+ for (arg++; isdigit(*(uchar*)arg); arg++) {}
+ switch (*arg) {
+ case 'k': case 'K':
+ size = atof(size_arg) * 1024;
+ break;
+ case 'm': case 'M':
+ size = atof(size_arg) * 1024*1024;
+ break;
+ case 'g': case 'G':
+ size = atof(size_arg) * 1024*1024*1024;
+ break;
+ case '\0':
+ size = atof(size_arg);
+ break;
+ default:
+ size = 0;
+ break;
+ }
+ return size;
+}
+
+
static void create_refuse_error(int which)
{
/* The "which" value is the index + OPT_REFUSED_BASE. */
write_batch = 1;
break;
+ case OPT_ONLY_WRITE_BATCH:
+ /* batch_name is already set */
+ write_batch = -1;
+ break;
+
case OPT_READ_BATCH:
/* batch_name is already set */
read_batch = 1;
break;
case OPT_MAX_SIZE:
- for (arg = max_size_arg; isdigit(*(uchar*)arg); arg++) {}
- if (*arg == '.')
- for (arg++; isdigit(*(uchar*)arg); arg++) {}
- switch (*arg) {
- case 'k': case 'K':
- max_size = atof(max_size_arg) * 1024;
- break;
- case 'm': case 'M':
- max_size = atof(max_size_arg) * 1024*1024;
- break;
- case 'g': case 'G':
- max_size = atof(max_size_arg) * 1024*1024*1024;
- break;
- case '\0':
- max_size = atof(max_size_arg);
- break;
- default:
- max_size = 0;
- break;
- }
- if (max_size <= 0) {
+ if ((max_size = parse_size_arg(max_size_arg)) <= 0) {
snprintf(err_buf, sizeof err_buf,
"--max-size value is invalid: %s\n",
max_size_arg);
"--write-batch and --read-batch can not be used together\n");
return 0;
}
- if (write_batch || read_batch) {
+ if (write_batch > 0 || read_batch) {
if (am_server) {
rprintf(FINFO,
"ignoring --%s-batch option sent to server\n",
&& !am_server)
verbose = 1;
+ if (dry_run)
+ do_xfers = 0;
+
if (verbose && !log_format) {
log_format = "%n%L";
log_before_transfer = !am_server;
**/
void server_options(char **args,int *argc)
{
- static char argstr[50+MAX_BASIS_DIRS*2];
+ static char argstr[64];
int ac = *argc;
char *arg;
argstr[x++] = 'b';
if (update_only)
argstr[x++] = 'u';
- if (dry_run)
+ if (!do_xfers) /* NOT "dry_run"! */
argstr[x++] = 'n';
if (preserve_links)
argstr[x++] = 'l';
args[ac++] = "--delete-after";
if (force_delete)
args[ac++] = "--force";
+ if (write_batch < 0)
+ args[ac++] = "--only-write-batch=X";
}
if (size_only)