#include "popt.h"
int make_backups = 0;
-int whole_file = 0;
+int whole_file = -1;
int copy_links = 0;
int preserve_links = 0;
int preserve_hard_links = 0;
int bwlimit=0;
int delete_after=0;
int only_existing=0;
+int opt_ignore_existing=0;
int max_delete=0;
int ignore_errors=0;
#ifdef _WIN32
#else
int modify_window=0;
#endif
-int blocking_io=0;
+int blocking_io=-1;
/** Network address family. **/
#ifdef INET6
* or under Unix process-monitors. **/
int no_detach = 0;
-
-int read_batch=0;
-int write_batch=0;
+int write_batch = 0;
+int read_batch = 0;
char *backup_suffix = BACKUP_SUFFIX;
char *tmpdir = NULL;
int always_checksum = 0;
int list_only = 0;
-char *batch_ext = NULL;
+char *batch_prefix = NULL;
static int modify_window_set;
rprintf(f, "%s version %s protocol version %d\n",
RSYNC_NAME, RSYNC_VERSION, PROTOCOL_VERSION);
rprintf(f,
- "Copyright (C) 1996-2001 by Andrew Tridgell and others\n");
+ "Copyright (C) 1996-2002 by Andrew Tridgell and others\n");
rprintf(f, "<http://rsync.samba.org/>\n");
rprintf(f, "Capabilities: %d-bit files, %ssocketpairs, "
"%shard links, %ssymlinks, batchfiles, %sIPv6,\n",
/* Note that this field may not have type ino_t. It depends
* on the complicated interaction between largefile feature
* macros. */
- rprintf(f, " %d-bit inums, %d-bit INO_T\n",
+ rprintf(f, " %d-bit system inums, %d-bit internal inums\n",
(int) (sizeof(dumstat->st_ino) * 8),
- (int) (sizeof(INO_T) * 8));
+ (int) (sizeof(INO64_T) * 8));
#ifdef NO_INT64
rprintf(f, "WARNING: no 64-bit integers on this platform!\n");
rprintf(F," -S, --sparse handle sparse files efficiently\n");
rprintf(F," -n, --dry-run show what would have been transferred\n");
rprintf(F," -W, --whole-file copy whole files, no incremental checks\n");
+ rprintf(F," --no-whole-file turn off --whole-file\n");
rprintf(F," -x, --one-file-system don't cross filesystem boundaries\n");
rprintf(F," -B, --block-size=SIZE checksum blocking size (default %d)\n",BLOCK_SIZE);
rprintf(F," -e, --rsh=COMMAND specify rsh replacement\n");
rprintf(F," --rsync-path=PATH specify path to rsync on the remote machine\n");
rprintf(F," -C, --cvs-exclude auto ignore files in the same way CVS does\n");
rprintf(F," --existing only update files that already exist\n");
+ rprintf(F," --ignore-existing ignore files that already exist on the receiving side\n");
rprintf(F," --delete delete files that don't exist on the sending side\n");
rprintf(F," --delete-excluded also delete excluded files on the receiving side\n");
rprintf(F," --delete-after delete after transferring, not before\n");
rprintf(F," --config=FILE specify alternate rsyncd.conf file\n");
rprintf(F," --port=PORT specify alternate rsyncd port number\n");
rprintf(F," --blocking-io use blocking IO for the remote shell\n");
+ rprintf(F," --no-blocking-io turn off --blocking-io\n");
rprintf(F," --stats give some file transfer stats\n");
rprintf(F," --progress show progress during transfer\n");
rprintf(F," --log-format=FORMAT log file transfers using specified format\n");
rprintf(F," --password-file=FILE get password from FILE\n");
rprintf(F," --bwlimit=KBPS limit I/O bandwidth, KBytes per second\n");
- rprintf(F," -f --read-batch=EXT read batch file\n");
- rprintf(F," -F --write-batch write batch file\n");
+ rprintf(F," --write-batch=PREFIX write batch fileset starting with PREFIX\n");
+ rprintf(F," --read-batch=PREFIX read batch fileset starting with PREFIX\n");
rprintf(F," -h, --help show this help screen\n");
#ifdef INET6
rprintf(F," -4 prefer IPv4\n");
OPT_LOG_FORMAT, OPT_PASSWORD_FILE, OPT_SIZE_ONLY, OPT_ADDRESS,
OPT_DELETE_AFTER, OPT_EXISTING, OPT_MAX_DELETE, OPT_BACKUP_DIR,
OPT_IGNORE_ERRORS, OPT_BWLIMIT, OPT_BLOCKING_IO,
- OPT_MODIFY_WINDOW};
+ OPT_NO_BLOCKING_IO, OPT_NO_WHOLE_FILE,
+ OPT_MODIFY_WINDOW, OPT_READ_BATCH, OPT_WRITE_BATCH, OPT_IGNORE_EXISTING};
static struct poptOption long_options[] = {
/* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
{"one-file-system", 'x', POPT_ARG_NONE, &one_file_system},
{"delete", 0, POPT_ARG_NONE, &delete_mode},
{"existing", 0, POPT_ARG_NONE, &only_existing},
+ {"ignore-existing", 0, POPT_ARG_NONE, &opt_ignore_existing},
{"delete-after", 0, POPT_ARG_NONE, &delete_after},
{"delete-excluded", 0, POPT_ARG_NONE, 0, OPT_DELETE_EXCLUDED},
{"force", 0, POPT_ARG_NONE, &force_delete},
{"update", 'u', POPT_ARG_NONE, &update_only},
{"links", 'l', POPT_ARG_NONE, &preserve_links},
{"copy-links", 'L', POPT_ARG_NONE, ©_links},
- {"whole", 'W', POPT_ARG_NONE, &whole_file},
+ {"whole-file", 'W', POPT_ARG_NONE, &whole_file},
+ {"no-whole-file", 0, POPT_ARG_NONE, 0, OPT_NO_WHOLE_FILE},
{"copy-unsafe-links", 0, POPT_ARG_NONE, ©_unsafe_links},
{"perms", 'p', POPT_ARG_NONE, &preserve_perms},
{"owner", 'o', POPT_ARG_NONE, &preserve_uid},
{"partial", 0, POPT_ARG_NONE, &keep_partial},
{"ignore-errors", 0, POPT_ARG_NONE, &ignore_errors},
{"blocking-io", 0, POPT_ARG_NONE, &blocking_io},
+ {"no-blocking-io", 0, POPT_ARG_NONE, 0, OPT_NO_BLOCKING_IO},
{0, 'P', POPT_ARG_NONE, 0, 'P'},
{"config", 0, POPT_ARG_STRING, &config_file},
{"port", 0, POPT_ARG_INT, &rsync_port},
{"address", 0, POPT_ARG_STRING, &bind_address, 0},
{"backup-dir", 0, POPT_ARG_STRING, &backup_dir},
{"hard-links", 'H', POPT_ARG_NONE, &preserve_hard_links},
- {"read-batch", 'f', POPT_ARG_STRING, &batch_ext, 'f'},
- {"write-batch", 'F', POPT_ARG_NONE, &write_batch, 0},
+ {"read-batch", 0, POPT_ARG_STRING, &batch_prefix, OPT_READ_BATCH},
+ {"write-batch", 0, POPT_ARG_STRING, &batch_prefix, OPT_WRITE_BATCH},
#ifdef INET6
{0, '4', POPT_ARG_VAL, &default_af_hint, AF_INET },
{0, '6', POPT_ARG_VAL, &default_af_hint, AF_INET6 },
add_exclude_file(poptGetOptArg(pc), 1, 0);
break;
- case OPT_INCLUDE_FROM:
- add_exclude_file(poptGetOptArg(pc), 1, 1);
+ case OPT_NO_WHOLE_FILE:
+ whole_file = 0;
+ break;
+
+ case OPT_NO_BLOCKING_IO:
+ blocking_io = 0;
break;
case 'h':
keep_partial = 1;
break;
+ case OPT_WRITE_BATCH:
+ /* popt stores the filename in batch_prefix for us */
+ write_batch = 1;
+ break;
- case 'f':
- /* The filename is stored for us by popt */
+ case OPT_READ_BATCH:
+ /* popt stores the filename in batch_prefix for us */
read_batch = 1;
break;
}
}
+ if (write_batch && read_batch) {
+ snprintf(err_buf,sizeof(err_buf),
+ "write-batch and read-batch can not be used together\n");
+ rprintf(FERROR,"ERROR: write-batch and read-batch"
+ " can not be used together\n");
+ return 0;
+ }
+
+ if (do_compression && (write_batch || read_batch)) {
+ snprintf(err_buf,sizeof(err_buf),
+ "compress can not be used with write-batch or read-batch\n");
+ rprintf(FERROR,"ERROR: compress can not be used with"
+ " write-batch or read-batch\n");
+ return 0;
+ }
+
*argv = poptGetArgs(pc);
if (*argv)
*argc = count_args(*argv);
static char mdelete[30];
static char mwindow[30];
static char bw[50];
- static char fext[20]; /* dw */
+ /* Leave room for ``--(write|read)-batch='' */
+ static char fext[MAXPATHLEN + 15];
int i, x;
+ if (whole_file == -1)
+ whole_file = 0;
+ if (blocking_io == -1)
+ blocking_io = 0;
+
args[ac++] = "--server";
if (!am_sender)
argstr[x++] = 'S';
if (do_compression)
argstr[x++] = 'z';
- if (write_batch)
- argstr[x++] = 'F'; /* dw */
/* this is a complete hack - blame Rusty
args[ac++] = mdelete;
}
- if (batch_ext != NULL) {
- sprintf(fext,"-f%s",batch_ext);
+ if (batch_prefix != NULL) {
+ char *fmt = "";
+ if (write_batch)
+ fmt = "--write-batch=%s";
+ else
+ if (read_batch)
+ fmt = "--read-batch=%s";
+ snprintf(fext,sizeof(fext),fmt,batch_prefix);
args[ac++] = fext;
}
if (only_existing && am_sender)
args[ac++] = "--existing";
+ if (opt_ignore_existing && am_sender)
+ args[ac++] = "--ignore-existing";
+
if (tmpdir) {
args[ac++] = "--temp-dir";
args[ac++] = tmpdir;