int delete_before = 0;
int delete_after = 0;
int delete_excluded = 0;
+int remove_sent_files = 0;
int one_file_system = 0;
int protocol_version = PROTOCOL_VERSION;
int sparse_files = 0;
int do_compression = 0;
int am_root = 0;
+int am_server = 0;
+int am_sender = 0;
+int am_generator = 0;
+int am_starting_up = 1;
int orig_umask = 0;
int relative_paths = -1;
int implied_dirs = 1;
int numeric_ids = 0;
int force_delete = 0;
int io_timeout = 0;
-int am_server = 0;
-int am_sender = -1;
-int am_generator = 0;
char *files_from = NULL;
int filesfrom_fd = -1;
char *remote_filesfrom_file = NULL;
size_t bwlimit_writemax = 0;
int only_existing = 0;
int opt_ignore_existing = 0;
+int need_messages_from_generator = 0;
int max_delete = 0;
OFF_T max_size = 0;
int ignore_errors = 0;
/** Do not go into the background when run as --daemon. Good
* for debugging and required for running as a service on W32,
* or under Unix process-monitors. **/
-int no_detach = 0;
+int no_detach
+#if defined _WIN32 || defined __WIN32__
+ = 1;
+#else
+ = 0;
+#endif
int write_batch = 0;
int read_batch = 0;
char backup_dir_buf[MAXPATHLEN];
int rsync_port = 0;
int compare_dest = 0;
-int copy_dest = 0;
int link_dest = 0;
int basis_dir_cnt = 0;
int quiet = 0;
int itemize_changes = 0;
int log_before_transfer = 0;
+int log_format_has_i = 0;
+int log_format_has_o_or_i = 0;
int always_checksum = 0;
int list_only = 0;
rprintf(F," --rsync-path=PATH specify path to rsync on the remote machine\n");
rprintf(F," --existing only update files that already exist on receiver\n");
rprintf(F," --ignore-existing ignore files that already exist on receiving side\n");
+ rprintf(F," --remove-sent-files sent files/symlinks are removed from sending side\n");
rprintf(F," --del an alias for --delete-during\n");
rprintf(F," --delete delete files that don't exist on the sending side\n");
rprintf(F," --delete-before receiver deletes before transfer (default)\n");
rprintf(F," -T, --temp-dir=DIR create temporary files in directory DIR\n");
rprintf(F," -y, --fuzzy find similar file for basis if no dest file\n");
rprintf(F," --compare-dest=DIR also compare destination files relative to DIR\n");
- rprintf(F," --copy-dest=DIR ... and include copies of unchanged files\n");
rprintf(F," --link-dest=DIR hardlink to files in DIR when unchanged\n");
rprintf(F," -z, --compress compress file data during the transfer\n");
rprintf(F," -C, --cvs-exclude auto-ignore files the same way CVS does\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_FILTER, OPT_COMPARE_DEST, OPT_LINK_DEST,
OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_MODIFY_WINDOW,
OPT_READ_BATCH, OPT_WRITE_BATCH, OPT_TIMEOUT, OPT_MAX_SIZE,
OPT_REFUSED_BASE = 9000};
{"delete-during", 0, POPT_ARG_NONE, &delete_during, 0, 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_NONE, &remove_sent_files, 0, 0, 0 },
{"force", 0, POPT_ARG_NONE, &force_delete, 0, 0, 0 },
{"numeric-ids", 0, POPT_ARG_NONE, &numeric_ids, 0, 0, 0 },
{"filter", 'f', POPT_ARG_STRING, 0, OPT_FILTER, 0, 0 },
{"group", 'g', POPT_ARG_NONE, &preserve_gid, 0, 0, 0 },
{"devices", 'D', POPT_ARG_NONE, &preserve_devices, 0, 0, 0 },
{"times", 't', POPT_ARG_NONE, &preserve_times, 0, 0, 0 },
- {"omit-dir-times", 'O', POPT_ARG_NONE, &omit_dir_times, 0, 0, 0 },
+ {"omit-dir-times", 'O', POPT_ARG_VAL, &omit_dir_times, 2, 0, 0 },
{"checksum", 'c', POPT_ARG_NONE, &always_checksum, 0, 0, 0 },
{"verbose", 'v', POPT_ARG_NONE, 0, 'v', 0, 0 },
{"quiet", 'q', POPT_ARG_NONE, 0, 'q', 0, 0 },
{"timeout", 0, POPT_ARG_INT, &io_timeout, OPT_TIMEOUT, 0, 0 },
{"temp-dir", 'T', POPT_ARG_STRING, &tmpdir, 0, 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 },
{"link-dest", 0, POPT_ARG_STRING, 0, OPT_LINK_DEST, 0, 0 },
{"fuzzy", 'y', POPT_ARG_NONE, &fuzzy_basis, 0, 0, 0 },
/* TODO: Should this take an optional int giving the compression level? */
{"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 },
{"no-detach", 0, POPT_ARG_NONE, 0, OPT_DAEMON, 0, 0 },
{0,0,0,0, 0, 0, 0}
};
{"ipv4", '4', POPT_ARG_VAL, &default_af_hint, AF_INET, 0, 0 },
{"ipv6", '6', POPT_ARG_VAL, &default_af_hint, AF_INET6, 0, 0 },
#endif
- {"no-detach", 0, POPT_ARG_NONE, &no_detach, 0, 0, 0 },
+ {"detach", 0, POPT_ARG_VAL, &no_detach, 0, 0, 0 },
+ {"no-detach", 0, POPT_ARG_VAL, &no_detach, 1, 0, 0 },
{"port", 0, POPT_ARG_INT, &rsync_port, 0, 0, 0 },
{"protocol", 0, POPT_ARG_INT, &protocol_version, 0, 0, 0 },
{"server", 0, POPT_ARG_NONE, &am_server, 0, 0, 0 },
if (!op->longName && !*shortname)
break;
if ((op->longName && wildmatch(bp, op->longName))
- || (*shortname && wildmatch(bp, shortname))
- || op->val == OPT_DAEMON) {
+ || (*shortname && wildmatch(bp, shortname))) {
if (op->argInfo == POPT_ARG_VAL)
op->argInfo = POPT_ARG_NONE;
op->val = (op - long_options) + OPT_REFUSED_BASE;
*cp = ' ';
bp = cp + 1;
}
+
+ for (op = long_options; ; op++) {
+ *shortname = op->shortName;
+ if (!op->longName && !*shortname)
+ break;
+ if (op->val == OPT_DAEMON) {
+ if (op->argInfo == POPT_ARG_VAL)
+ op->argInfo = POPT_ARG_NONE;
+ op->val = (op - long_options) + OPT_REFUSED_BASE;
+ }
+ }
}
}
*argv = poptGetArgs(pc);
*argc = count_args(*argv);
+ am_starting_up = 0;
daemon_opt = 0;
am_daemon = 1;
return 1;
return 0;
#endif
- case OPT_COPY_DEST:
- copy_dest = 1;
- dest_option = "--copy-dest";
- goto set_dest_dir;
-
case OPT_COMPARE_DEST:
compare_dest = 1;
dest_option = "--compare-dest";
}
}
- if (am_sender < 0)
- am_sender = 0;
-
#ifndef SUPPORT_LINKS
if (preserve_links && !am_sender) {
snprintf(err_buf, sizeof err_buf,
return 0;
}
- if (compare_dest + copy_dest + link_dest > 1) {
+ if (compare_dest + link_dest > 1) {
snprintf(err_buf, sizeof err_buf,
- "You may not mix --compare-dest, --copy-dest, and --link-dest.\n");
+ "You may not mix --compare-dest and --link-dest.\n");
return 0;
}
return 0;
}
+ if (remove_sent_files) {
+ /* We only want to infer this refusal of --remove-sent-files
+ * via the refusal of "delete", not any of the "delete-FOO"
+ * options. */
+ if (refused_delete && am_sender) {
+ create_refuse_error(refused_delete);
+ return 0;
+ }
+ need_messages_from_generator = 1;
+ }
+
*argv = poptGetArgs(pc);
*argc = count_args(*argv);
"--suffix cannot be a null string without --backup-dir\n");
return 0;
}
+ if (make_backups && !backup_dir)
+ omit_dir_times = 1;
if (log_format) {
if (strstr(log_format, "%i") != NULL)
- itemize_changes = 1;
+ log_format_has_i = 1;
if (strstr(log_format, "%b") == NULL
&& strstr(log_format, "%c") == NULL)
log_before_transfer = !am_server;
} else if (itemize_changes) {
log_format = "%i %n%L";
+ log_format_has_i = 1;
log_before_transfer = !am_server;
}
log_format = "%n%L";
log_before_transfer = !am_server;
}
+ if (log_format_has_i
+ || (log_format && strstr(log_format, "%o") != NULL))
+ log_format_has_o_or_i = 1;
if (daemon_bwlimit && (!bwlimit || bwlimit > daemon_bwlimit))
bwlimit = daemon_bwlimit;
}
}
+ am_starting_up = 0;
+
return 1;
}
argstr[x++] = 'D';
if (preserve_times)
argstr[x++] = 't';
- if (omit_dir_times && am_sender)
+ if (omit_dir_times == 2 && am_sender)
argstr[x++] = 'O';
if (preserve_perms)
argstr[x++] = 'p';
if (list_only > 1)
args[ac++] = "--list-only";
+ /* The server side doesn't use our log-format, but in certain
+ * circumstances they need to know a little about the option. */
+ if (log_format && am_sender) {
+ if (log_format_has_i)
+ args[ac++] = "--log-format=%i";
+ else if (log_format_has_o_or_i)
+ args[ac++] = "--log-format=%o";
+ else if (!verbose)
+ args[ac++] = "--log-format=X";
+ }
+
if (block_size) {
if (asprintf(&arg, "-B%lu", block_size) < 0)
goto oom;
if (fuzzy_basis && am_sender)
args[ac++] = "--fuzzy";
+ if (remove_sent_files)
+ args[ac++] = "--remove-sent-files";
+
*argc = ac;
return;