*
* Copyright (C) 1998-2001 Andrew Tridgell <tridge@samba.org>
* Copyright (C) 2000, 2001, 2002 Martin Pool <mbp@samba.org>
- * Copyright (C) 2002, 2003, 2004, 2005, 2006 Wayne Davison
+ * Copyright (C) 2002-2007 Wayne Davison
*
* This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
int copy_links = 0;
int preserve_links = 0;
int preserve_hard_links = 0;
+int preserve_acls = 0;
+int preserve_xattrs = 0;
int preserve_perms = 0;
int preserve_executability = 0;
int preserve_devices = 0;
int sparse_files = 0;
int do_compression = 0;
int def_compress_level = Z_DEFAULT_COMPRESSION;
-int am_root = 0;
+int am_root = 0; /* 0 = normal, 1 = root, 2 = --super, -1 = --fake-super */
int am_server = 0;
int am_sender = 0;
int am_generator = 0;
int eol_nulls = 0;
int human_readable = 0;
int recurse = 0;
+int allow_inc_recurse = 1;
int xfer_dirs = -1;
int am_daemon = 0;
int daemon_over_rsh = 0;
int ignore_existing = 0;
int ignore_non_existing = 0;
int need_messages_from_generator = 0;
-int max_delete = 0;
+int max_delete = -1;
OFF_T max_size = 0;
OFF_T min_size = 0;
int ignore_errors = 0;
int delay_updates = 0;
long block_size = 0; /* "long" because popt can't set an int32. */
-
/** Network address family. **/
#ifdef INET6
int default_af_hint = 0; /* Any protocol */
int verbose = 0;
int quiet = 0;
+int output_motd = 1;
int log_before_transfer = 0;
int stdout_format_has_i = 0;
int stdout_format_has_o_or_i = 0;
#define MAX_BATCH_NAME_LEN 256 /* Must be less than MAXPATHLEN-13 */
char *batch_name = NULL;
+#ifdef ICONV_OPTION
+int need_unsorted_flist = 0;
+char *iconv_opt = ICONV_OPTION;
+#endif
+
struct chmod_mode_struct *chmod_modes = NULL;
static int daemon_opt; /* sets am_daemon after option error-reporting */
static int itemize_changes = 0;
static int refused_delete, refused_archive_part, refused_compress;
static int refused_partial, refused_progress, refused_delete_before;
+static int refused_delete_during;
static int refused_inplace;
static char *max_size_arg, *min_size_arg;
static char tmp_partialdir[] = ".~tmp~";
static void print_rsync_version(enum logcode f)
{
+ char *subprotocol = "";
char const *got_socketpair = "no ";
char const *have_inplace = "no ";
char const *hardlinks = "no ";
+ char const *acls = "no ";
+ char const *xattrs = "no ";
char const *links = "no ";
+ char const *iconv = "no ";
char const *ipv6 = "no ";
STRUCT_STAT *dumstat;
+#if SUBPROTOCOL_VERSION != 0
+ asprintf(&subprotocol, ".PR%d", SUBPROTOCOL_VERSION);
+#endif
#ifdef HAVE_SOCKETPAIR
got_socketpair = "";
#endif
-
#ifdef HAVE_FTRUNCATE
have_inplace = "";
#endif
-
#ifdef SUPPORT_HARD_LINKS
hardlinks = "";
#endif
-
+#ifdef SUPPORT_ACLS
+ acls = "";
+#endif
+#ifdef SUPPORT_XATTRS
+ xattrs = "";
+#endif
#ifdef SUPPORT_LINKS
links = "";
#endif
-
#ifdef INET6
ipv6 = "";
#endif
+#ifdef ICONV_OPTION
+ iconv = "";
+#endif
+
+ rprintf(f, "%s version %s protocol version %d%s\n",
+ RSYNC_NAME, RSYNC_VERSION, PROTOCOL_VERSION, subprotocol);
+ rprintf(f, "Copyright (C) 1996-2007 by Andrew Tridgell, Wayne Davison, and others.\n");
+ rprintf(f, "Web site: http://rsync.samba.org/\n");
+ rprintf(f, "Capabilities:\n");
+ rprintf(f, " %d-bit files, %d-bit inums, %d-bit timestamps, %d-bit long ints,\n",
+ (int)(sizeof (OFF_T) * 8),
+ (int)(sizeof dumstat->st_ino * 8), /* Don't check ino_t! */
+ (int)(sizeof (time_t) * 8),
+ (int)(sizeof (int64) * 8));
+ rprintf(f, " %ssocketpairs, %shardlinks, %ssymlinks, %sIPv6, batchfiles, %sinplace,\n",
+ got_socketpair, hardlinks, links, ipv6, have_inplace);
+ rprintf(f, " %sappend, %sACLs, %sxattrs, %siconv\n",
+ have_inplace, acls, xattrs, iconv);
- rprintf(f, "%s version %s protocol version %d\n",
- RSYNC_NAME, RSYNC_VERSION, PROTOCOL_VERSION);
- rprintf(f, "Copyright (C) 1996-2006 by Andrew Tridgell, Wayne Davison, and others.\n");
- rprintf(f, "<http://rsync.samba.org/>\n");
- rprintf(f, "Capabilities: %d-bit files, %ssocketpairs, "
- "%shard links, %ssymlinks, batchfiles,\n",
- (int) (sizeof (OFF_T) * 8),
- got_socketpair, hardlinks, links);
-
- /* Note that this field may not have type ino_t. It depends
- * on the complicated interaction between largefile feature
- * macros. */
- rprintf(f, " %sinplace, %sIPv6, "
- "%d-bit system inums, %d-bit internal inums\n",
- have_inplace, ipv6,
- (int) (sizeof dumstat->st_ino * 8),
- (int) (sizeof (int64) * 8));
#ifdef MAINTAINER_MODE
rprintf(f, "Panic Action: \"%s\"\n", get_panic_action());
#endif
rprintf(F,"Options\n");
rprintf(F," -v, --verbose increase verbosity\n");
rprintf(F," -q, --quiet suppress non-error messages\n");
+ rprintf(F," --no-motd suppress daemon-mode MOTD (see manpage caveat)\n");
rprintf(F," -c, --checksum skip based on checksum, not mod-time & size\n");
- rprintf(F," -a, --archive archive mode; same as -rlptgoD (no -H)\n");
+ rprintf(F," -a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)\n");
rprintf(F," --no-OPTION turn off an implied OPTION (e.g. --no-D)\n");
rprintf(F," -r, --recursive recurse into directories\n");
rprintf(F," -R, --relative use relative path names\n");
rprintf(F," -p, --perms preserve permissions\n");
rprintf(F," -E, --executability preserve the file's executability\n");
rprintf(F," --chmod=CHMOD affect file and/or directory permissions\n");
+#ifdef SUPPORT_ACLS
+ rprintf(F," -A, --acls preserve ACLs (implies --perms)\n");
+#endif
+#ifdef SUPPORT_XATTRS
+ rprintf(F," -X, --xattrs preserve extended attributes (implies --perms)\n");
+#endif
rprintf(F," -o, --owner preserve owner (super-user only)\n");
rprintf(F," -g, --group preserve group\n");
rprintf(F," --devices preserve device files (super-user only)\n");
rprintf(F," -t, --times preserve times\n");
rprintf(F," -O, --omit-dir-times omit directories when preserving times\n");
rprintf(F," --super receiver attempts super-user activities\n");
+#ifdef SUPPORT_XATTRS
+ rprintf(F," --fake-super store/recover privileged attrs using xattrs\n");
+#endif
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 files whole (without rsync algorithm)\n");
rprintf(F," --remove-source-files sender removes synchronized files (non-dirs)\n");
rprintf(F," --del an alias for --delete-during\n");
rprintf(F," --delete delete extraneous files from destination dirs\n");
- rprintf(F," --delete-before receiver deletes before transfer (default)\n");
- rprintf(F," --delete-during receiver deletes during transfer, not before\n");
- rprintf(F," --delete-after receiver deletes after transfer, not before\n");
+ rprintf(F," --delete-before receiver deletes before transfer, not during\n");
+ rprintf(F," --delete-during receiver deletes during transfer (default)\n");
+ rprintf(F," --delete-delay find deletions during, delete after\n");
+ rprintf(F," --delete-after receiver deletes after transfer, not during\n");
rprintf(F," --delete-excluded also delete excluded files from destination dirs\n");
rprintf(F," --ignore-errors delete even if there are I/O errors\n");
rprintf(F," --force force deletion of directories even if not empty\n");
rprintf(F," --out-format=FORMAT output updates using the specified FORMAT\n");
rprintf(F," --log-file=FILE log what we're doing to the specified FILE\n");
rprintf(F," --log-file-format=FMT log updates using the specified FMT\n");
- rprintf(F," --password-file=FILE read password from FILE\n");
+ rprintf(F," --password-file=FILE read daemon-access 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 ICONV_OPTION
+ rprintf(F," --iconv=CONVERT_SPEC request charset conversion of filesnames\n");
+#endif
#ifdef INET6
rprintf(F," -4, --ipv4 prefer IPv4\n");
rprintf(F," -6, --ipv6 prefer IPv6\n");
{"no-verbose", 0, POPT_ARG_VAL, &verbose, 0, 0, 0 },
{"no-v", 0, POPT_ARG_VAL, &verbose, 0, 0, 0 },
{"quiet", 'q', POPT_ARG_NONE, 0, 'q', 0, 0 },
+ {"motd", 0, POPT_ARG_VAL, &output_motd, 1, 0, 0 },
+ {"no-motd", 0, POPT_ARG_VAL, &output_motd, 0, 0, 0 },
{"stats", 0, POPT_ARG_NONE, &do_stats, 0, 0, 0 },
{"human-readable", 'h', POPT_ARG_NONE, 0, 'h', 0, 0},
{"dry-run", 'n', POPT_ARG_NONE, &dry_run, 0, 0, 0 },
{"archive", 'a', POPT_ARG_NONE, 0, 'a', 0, 0 },
{"recursive", 'r', POPT_ARG_VAL, &recurse, 2, 0, 0 },
{"no-recursive", 0, POPT_ARG_VAL, &recurse, 0, 0, 0 },
+ {"ir", 0, POPT_ARG_VAL, &allow_inc_recurse, 1, 0, 0 },
+ {"inc-recursive", 0, POPT_ARG_VAL, &allow_inc_recurse, 1, 0, 0 },
+ {"no-ir", 0, POPT_ARG_VAL, &allow_inc_recurse, 0, 0, 0 },
+ {"no-inc-recursive", 0, POPT_ARG_VAL, &allow_inc_recurse, 0, 0, 0 },
{"no-r", 0, POPT_ARG_VAL, &recurse, 0, 0, 0 },
{"dirs", 'd', POPT_ARG_VAL, &xfer_dirs, 2, 0, 0 },
{"no-dirs", 0, POPT_ARG_VAL, &xfer_dirs, 0, 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 },
+ {"no-A", 0, POPT_ARG_VAL, &preserve_acls, 0, 0, 0 },
+ {"xattrs", 'X', POPT_ARG_NONE, 0, 'X', 0, 0 },
+ {"no-xattrs", 0, POPT_ARG_VAL, &preserve_xattrs, 0, 0, 0 },
+ {"no-X", 0, POPT_ARG_VAL, &preserve_xattrs, 0, 0, 0 },
{"times", 't', POPT_ARG_VAL, &preserve_times, 1, 0, 0 },
{"no-times", 0, POPT_ARG_VAL, &preserve_times, 0, 0, 0 },
{"no-t", 0, POPT_ARG_VAL, &preserve_times, 0, 0, 0 },
{"modify-window", 0, POPT_ARG_INT, &modify_window, OPT_MODIFY_WINDOW, 0, 0 },
{"super", 0, POPT_ARG_VAL, &am_root, 2, 0, 0 },
{"no-super", 0, POPT_ARG_VAL, &am_root, 0, 0, 0 },
+ {"fake-super", 0, POPT_ARG_VAL, &am_root, -1, 0, 0 },
{"owner", 'o', POPT_ARG_VAL, &preserve_uid, 1, 0, 0 },
{"no-owner", 0, POPT_ARG_VAL, &preserve_uid, 0, 0, 0 },
{"no-o", 0, POPT_ARG_VAL, &preserve_uid, 0, 0, 0 },
{"safe-links", 0, POPT_ARG_NONE, &safe_symlinks, 0, 0, 0 },
{"copy-dirlinks", 'k', POPT_ARG_NONE, ©_dirlinks, 0, 0, 0 },
{"keep-dirlinks", 'K', POPT_ARG_NONE, &keep_dirlinks, 0, 0, 0 },
- {"hard-links", 'H', POPT_ARG_VAL, &preserve_hard_links, 1, 0, 0 },
+ {"hard-links", 'H', POPT_ARG_NONE, 0, 'H', 0, 0 },
{"no-hard-links", 0, POPT_ARG_VAL, &preserve_hard_links, 0, 0, 0 },
{"no-H", 0, POPT_ARG_VAL, &preserve_hard_links, 0, 0, 0 },
{"relative", 'R', POPT_ARG_VAL, &relative_paths, 1, 0, 0 },
{"append", 0, POPT_ARG_VAL, &append_mode, 1, 0, 0 },
{"del", 0, POPT_ARG_NONE, &delete_during, 0, 0, 0 },
{"delete", 0, POPT_ARG_NONE, &delete_mode, 0, 0, 0 },
- {"delete-before", 0, POPT_ARG_VAL, &delete_before, 2, 0, 0 },
- {"delete-during", 0, POPT_ARG_NONE, &delete_during, 0, 0, 0 },
+ {"delete-before", 0, POPT_ARG_NONE, &delete_before, 0, 0, 0 },
+ {"delete-during", 0, POPT_ARG_VAL, &delete_during, 1, 0, 0 },
+ {"delete-delay", 0, POPT_ARG_VAL, &delete_during, 2, 0, 0 },
{"delete-after", 0, POPT_ARG_NONE, &delete_after, 0, 0, 0 },
{"delete-excluded", 0, POPT_ARG_NONE, &delete_excluded, 0, 0, 0 },
{"remove-sent-files",0, POPT_ARG_VAL, &remove_source_files, 2, 0, 0 }, /* deprecated */
{"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 },
+#ifdef ICONV_OPTION
+ {"iconv", 0, POPT_ARG_STRING, &iconv_opt, 0, 0, 0 },
+#endif
#ifdef INET6
{"ipv4", '4', POPT_ARG_VAL, &default_af_hint, AF_INET, 0, 0 },
{"ipv6", '6', POPT_ARG_VAL, &default_af_hint, AF_INET6, 0, 0 },
refused_delete = op->val;
else if (wildmatch("delete-before", op->longName))
refused_delete_before = op->val;
+ else if (wildmatch("delete-during", op->longName))
+ refused_delete_during = op->val;
else if (wildmatch("partial", op->longName))
refused_partial = op->val;
else if (wildmatch("progress", op->longName))
const char *arg;
OFF_T size = 1;
- for (arg = *size_arg; isdigit(*(uchar*)arg); arg++) {}
+ for (arg = *size_arg; isDigit(arg); arg++) {}
if (*arg == '.')
- for (arg++; isdigit(*(uchar*)arg); arg++) {}
+ for (arg++; isDigit(arg); arg++) {}
switch (*arg && *arg != '+' && *arg != '-' ? *arg++ : def_suf) {
case 'b': case 'B':
reps = 0;
OFF_T num = size;
*s = '\0';
while (num) {
- *--s = (num % 10) + '0';
+ *--s = (char)(num % 10) + '0';
num /= 10;
}
if (!(*size_arg = strdup(s)))
if (am_daemon)
set_refuse_options("log-file*");
+#ifdef ICONV_OPTION
+ if (!am_daemon && (arg = getenv("RSYNC_ICONV")) != NULL && *arg)
+ iconv_opt = strdup(arg);
+#endif
+
/* TODO: Call poptReadDefaultConfig; handle errors. */
/* The context leaks in case of an error, but if there's a
long_options, 0);
am_server = 1;
}
+#ifdef ICONV_OPTION
+ iconv_opt = NULL;
+#endif
break;
case OPT_SENDER:
sizeof err_buf);
return 0;
}
+#ifdef ICONV_OPTION
+ iconv_opt = NULL;
+#endif
poptFreeContext(pc);
pc = poptGetContext(RSYNC_NAME, *argc, *argv,
long_daemon_options, 0);
human_readable++;
break;
+ case 'H':
+ preserve_hard_links++;
+ break;
+
case 'i':
itemize_changes++;
break;
usage(FINFO);
exit_cleanup(0);
+ case 'A':
+#ifdef SUPPORT_ACLS
+ preserve_acls = 1;
+ preserve_perms = 1;
+ break;
+#else
+ /* FIXME: this should probably be ignored with a
+ * warning and then countermeasures taken to
+ * restrict group and other access in the presence
+ * of any more restrictive ACLs, but this is safe
+ * for now */
+ snprintf(err_buf,sizeof(err_buf),
+ "ACLs are not supported on this %s\n",
+ am_server ? "server" : "client");
+ return 0;
+#endif
+
+ case 'X':
+#ifdef SUPPORT_XATTRS
+ preserve_xattrs = 1;
+ preserve_perms = 1;
+ break;
+#else
+ snprintf(err_buf,sizeof(err_buf),
+ "extended attributes are not supported on this %s\n",
+ am_server ? "server" : "client");
+ return 0;
+#endif
+
default:
/* A large opt value means that set_refuse_options()
* turned this option off. */
exit_cleanup(0);
}
+#ifdef ICONV_OPTION
+ if (iconv_opt) {
+ if (!am_server && strcmp(iconv_opt, "-") == 0)
+ iconv_opt = NULL;
+ else
+ need_unsorted_flist = 1;
+ }
+#endif
+
#ifndef SUPPORT_LINKS
if (preserve_links && !am_sender) {
snprintf(err_buf, sizeof err_buf,
}
#endif
+#ifndef SUPPORT_XATTRS
+ if (am_root < 0) {
+ snprintf(err_buf, sizeof err_buf,
+ "--fake-super requires an rsync with extended attributes enabled\n");
+ return 0;
+ }
+#endif
+
if (write_batch && read_batch) {
snprintf(err_buf, sizeof err_buf,
"--write-batch and --read-batch can not be used together\n");
if (!relative_paths)
implied_dirs = 0;
- if (!!delete_before + delete_during + delete_after > 1) {
+ if (delete_before + !!delete_during + delete_after > 1) {
snprintf(err_buf, sizeof err_buf,
"You may not combine multiple --delete-WHEN options.\n");
return 0;
if (delete_before || delete_during || delete_after)
delete_mode = 1;
else if (delete_mode || delete_excluded) {
+ /* Only choose now between before & during if one is refused. */
if (refused_delete_before) {
- create_refuse_error(refused_delete_before);
- return 0;
- }
- delete_mode = delete_before = 1;
+ if (!refused_delete_during)
+ delete_during = 1;
+ else {
+ create_refuse_error(refused_delete_before);
+ return 0;
+ }
+ } else if (refused_delete_during)
+ delete_before = 1;
+ delete_mode = 1;
}
if (!xfer_dirs && delete_mode) {
snprintf(err_buf, sizeof err_buf,
if (!*backup_dir)
goto options_rejected;
clean_fname(backup_dir, 1);
- if (check_filter(elp, backup_dir, 1) < 0) {
- options_rejected:
- snprintf(err_buf, sizeof err_buf,
- "Your options have been rejected by the server.\n");
- return 0;
- }
+ if (check_filter(elp, backup_dir, 1) < 0)
+ goto options_rejected;
}
}
snprintf(err_buf, sizeof err_buf,
"--suffix cannot be a null string without --backup-dir\n");
return 0;
- } else if (make_backups && delete_mode && !delete_excluded) {
- snprintf(backup_dir_buf, sizeof backup_dir_buf,
+ } else if (make_backups && delete_mode && !delete_excluded && !am_server) {
+ snprintf(backup_dir_buf, sizeof backup_dir_buf,
"P *%s", backup_suffix);
- parse_rule(&filter_list, backup_dir_buf, 0, 0);
+ parse_rule(&filter_list, backup_dir_buf, 0, 0);
}
if (make_backups && !backup_dir)
omit_dir_times = 1;
clean_fname(partial_dir, 1);
if (!*partial_dir || strcmp(partial_dir, ".") == 0)
partial_dir = NULL;
- else if (*partial_dir != '/' && !am_server) {
- parse_rule(&filter_list, partial_dir,
- MATCHFLG_NO_PREFIXES|MATCHFLG_DIRECTORY, 0);
- }
if (!partial_dir && refused_partial) {
create_refuse_error(refused_partial);
return 0;
am_starting_up = 0;
return 1;
+
+ options_rejected:
+ snprintf(err_buf, sizeof err_buf,
+ "Your options have been rejected by the server.\n");
+ return 0;
}
* default for remote transfers, and in any case old versions
* of rsync will not understand it. */
- if (preserve_hard_links)
+ if (preserve_hard_links) {
argstr[x++] = 'H';
+ if (preserve_hard_links > 1)
+ argstr[x++] = 'H';
+ }
if (preserve_uid)
argstr[x++] = 'o';
if (preserve_gid)
argstr[x++] = 'p';
else if (preserve_executability && am_sender)
argstr[x++] = 'E';
+#ifdef SUPPORT_ACLS
+ if (preserve_acls)
+ argstr[x++] = 'A';
+#endif
+#ifdef SUPPORT_XATTRS
+ if (preserve_xattrs)
+ argstr[x++] = 'X';
+#endif
if (recurse)
argstr[x++] = 'r';
if (always_checksum)
if (list_only == 1 && !recurse)
argstr[x++] = 'r';
+#if SUBPROTOCOL_VERSION != 0
+ /* If we're speaking a pre-release version of a protocol, we tell
+ * the server about this by (ab)using the -e option. */
+ if (protocol_version == PROTOCOL_VERSION) {
+ x += snprintf(argstr+x, sizeof argstr - x,
+ "e%d.%d", PROTOCOL_VERSION, SUBPROTOCOL_VERSION);
+ }
+#endif
+
argstr[x] = '\0';
if (x != 1)
args[ac++] = "--log-format=X";
}
+#ifdef ICONV_OPTION
+ if (iconv_opt) {
+ char *set = strchr(iconv_opt, ',');
+ if (set)
+ set++;
+ else
+ set = iconv_opt;
+ if (asprintf(&arg, "--iconv=%s", set) < 0)
+ goto oom;
+ args[ac++] = arg;
+ }
+#endif
+
if (block_size) {
if (asprintf(&arg, "-B%lu", block_size) < 0)
goto oom;
args[ac++] = arg;
}
- if (max_delete && am_sender) {
+ if (max_delete >= 0 && am_sender) {
if (asprintf(&arg, "--max-delete=%d", max_delete) < 0)
goto oom;
args[ac++] = arg;
}
if (am_sender) {
- if (delete_excluded)
- args[ac++] = "--delete-excluded";
- else if (delete_before == 1 || delete_after)
- args[ac++] = "--delete";
- if (delete_before > 1)
+ if (delete_before)
args[ac++] = "--delete-before";
- if (delete_during)
+ else if (delete_during == 2)
+ args[ac++] = "--delete-delay";
+ else if (delete_during)
args[ac++] = "--delete-during";
- if (delete_after)
+ else if (delete_after)
args[ac++] = "--delete-after";
+ else if (delete_mode && !delete_excluded)
+ args[ac++] = "--delete";
+ if (delete_excluded)
+ args[ac++] = "--delete-excluded";
if (force_delete)
args[ac++] = "--force";
if (write_batch < 0)
if (numeric_ids)
args[ac++] = "--numeric-ids";
- if (ignore_existing && am_sender)
- args[ac++] = "--ignore-existing";
+ if (am_sender) {
+ if (ignore_existing)
+ args[ac++] = "--ignore-existing";
+
+ /* Backward compatibility: send --existing, not --ignore-non-existing. */
+ if (ignore_non_existing)
+ args[ac++] = "--existing";
+
+ if (tmpdir) {
+ args[ac++] = "--temp-dir";
+ args[ac++] = tmpdir;
+ }
- /* Backward compatibility: send --existing, not --ignore-non-existing. */
- if (ignore_non_existing && am_sender)
- args[ac++] = "--existing";
+ if (basis_dir[0]) {
+ /* the server only needs this option if it is not the sender,
+ * and it may be an older version that doesn't know this
+ * option, so don't send it if client is the sender.
+ */
+ int i;
+ for (i = 0; i < basis_dir_cnt; i++) {
+ args[ac++] = dest_option;
+ args[ac++] = basis_dir[i];
+ }
+ }
+ }
if (append_mode)
args[ac++] = "--append";
else if (inplace)
args[ac++] = "--inplace";
- if (tmpdir && am_sender) {
- args[ac++] = "--temp-dir";
- args[ac++] = tmpdir;
- }
-
- if (basis_dir[0] && am_sender) {
- /* the server only needs this option if it is not the sender,
- * and it may be an older version that doesn't know this
- * option, so don't send it if client is the sender.
- */
- int i;
- for (i = 0; i < basis_dir_cnt; i++) {
- args[ac++] = dest_option;
- args[ac++] = basis_dir[i];
- }
- }
-
if (files_from && (!am_sender || filesfrom_host)) {
if (filesfrom_host) {
args[ac++] = "--files-from";