* 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 version 3 as
- * published by the Free Software Foundation.
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
extern int module_id;
extern int sanitize_paths;
+extern int daemon_over_rsh;
extern struct filter_list_struct filter_list;
extern struct filter_list_struct server_filter_list;
int allow_inc_recurse = 1;
int xfer_dirs = -1;
int am_daemon = 0;
-int daemon_over_rsh = 0;
int do_stats = 0;
int do_progress = 0;
int keep_partial = 0;
int ignore_existing = 0;
int ignore_non_existing = 0;
int need_messages_from_generator = 0;
-int max_delete = -1;
+int max_delete = INT_MIN;
OFF_T max_size = 0;
OFF_T min_size = 0;
int ignore_errors = 0;
int inplace = 0;
int delay_updates = 0;
long block_size = 0; /* "long" because popt can't set an int32. */
+char *skip_compress = NULL;
/** Network address family. **/
+int default_af_hint
#ifdef INET6
-int default_af_hint = 0; /* Any protocol */
+ = 0; /* Any protocol */
#else
-int default_af_hint = AF_INET; /* Must use IPv4 */
+ = AF_INET; /* Must use IPv4 */
+# ifdef AF_INET6
+# undef AF_INET6
+# endif
+# define AF_INET6 AF_INET /* make -6 option a no-op */
#endif
/** Do not go into the background when run as --daemon. Good
rprintf(F," -A, --acls preserve ACLs (implies --perms)\n");
#endif
#ifdef SUPPORT_XATTRS
- rprintf(F," -X, --xattrs preserve extended attributes (implies --perms)\n");
+ rprintf(F," -X, --xattrs preserve extended attributes\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," --specials preserve special files\n");
rprintf(F," -D same as --devices --specials\n");
- rprintf(F," -t, --times preserve times\n");
- rprintf(F," -O, --omit-dir-times omit directories when preserving times\n");
+ rprintf(F," -t, --times preserve modification times\n");
+ rprintf(F," -O, --omit-dir-times omit directories from --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");
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," --compress-level=NUM explicitly set compression level\n");
+ rprintf(F," --skip-compress=LIST skip compressing files with a suffix in LIST\n");
rprintf(F," -C, --cvs-exclude auto-ignore files the same way CVS does\n");
rprintf(F," -f, --filter=RULE add a file-filtering RULE\n");
rprintf(F," -F same as --filter='dir-merge /.rsync-filter'\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");
-#endif
rprintf(F," --version print version number\n");
rprintf(F,"(-h) --help show this help (-h works with no other options)\n");
{"fuzzy", 'y', POPT_ARG_NONE, &fuzzy_basis, 0, 0, 0 },
{"compress", 'z', POPT_ARG_NONE, 0, 'z', 0, 0 },
{"no-compress", 0, POPT_ARG_VAL, &do_compression, 0, 0, 0 },
+ {"skip-compress", 0, POPT_ARG_STRING, &skip_compress, 0, 0, 0 },
{"no-z", 0, POPT_ARG_VAL, &do_compression, 0, 0, 0 },
{"compress-level", 0, POPT_ARG_INT, &def_compress_level, 'z', 0, 0 },
{0, 'P', POPT_ARG_NONE, 0, 'P', 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 },
-#endif
{"8-bit-output", '8', POPT_ARG_NONE, &allow_8bit_chars, 0, 0, 0 },
{"qsort", 0, POPT_ARG_NONE, &use_qsort, 0, 0, 0 },
{"address", 0, POPT_ARG_STRING, &bind_address, 0, 0, 0 },
rprintf(F," --log-file-format=FMT override the \"log format\" setting\n");
rprintf(F," --sockopts=OPTIONS specify custom TCP options\n");
rprintf(F," -v, --verbose increase verbosity\n");
-#ifdef INET6
rprintf(F," -4, --ipv4 prefer IPv4\n");
rprintf(F," -6, --ipv6 prefer IPv6\n");
-#endif
rprintf(F," --help show this help screen\n");
rprintf(F,"\n");
{"bwlimit", 0, POPT_ARG_INT, &daemon_bwlimit, 0, 0, 0 },
{"config", 0, POPT_ARG_STRING, &config_file, 0, 0, 0 },
{"daemon", 0, POPT_ARG_NONE, &daemon_opt, 0, 0, 0 },
-#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 },
-#endif
{"detach", 0, POPT_ARG_VAL, &no_detach, 0, 0, 0 },
{"no-detach", 0, POPT_ARG_VAL, &no_detach, 1, 0, 0 },
{"log-file", 0, POPT_ARG_STRING, &logfile_name, 0, 0, 0 },
case 'X':
#ifdef SUPPORT_XATTRS
preserve_xattrs++;
- preserve_perms = 1;
break;
#else
snprintf(err_buf,sizeof(err_buf),
return 0;
}
+ if (max_delete < 0 && max_delete != INT_MIN) {
+ /* Negative numbers are treated as "no deletions". */
+ max_delete = 0;
+ }
+
if (compare_dest + copy_dest + link_dest > 1) {
snprintf(err_buf, sizeof err_buf,
"You may not mix --compare-dest, --copy-dest, and --link-dest.\n");
/* This should always remain first on the server's command-line. */
args[ac++] = "--server";
- if (daemon_over_rsh) {
+ if (daemon_over_rsh > 0) {
args[ac++] = "--daemon";
*argc = ac;
/* if we're passing --daemon, we're done */
args[ac++] = arg;
}
- if (max_delete >= 0 && am_sender) {
- if (asprintf(&arg, "--max-delete=%d", max_delete) < 0)
- goto oom;
- args[ac++] = arg;
- }
-
- if (min_size && am_sender) {
- args[ac++] = "--min-size";
- args[ac++] = min_size_arg;
- }
-
- if (max_size && am_sender) {
- args[ac++] = "--max-size";
- args[ac++] = max_size_arg;
- }
-
if (io_timeout) {
if (asprintf(&arg, "--timeout=%d", io_timeout) < 0)
goto oom;
}
if (am_sender) {
+ if (max_delete > 0) {
+ if (asprintf(&arg, "--max-delete=%d", max_delete) < 0)
+ goto oom;
+ args[ac++] = arg;
+ } else if (max_delete == 0)
+ args[ac++] = "--max_delete=-1";
+ if (min_size) {
+ args[ac++] = "--min-size";
+ args[ac++] = min_size_arg;
+ }
+ if (max_size) {
+ args[ac++] = "--max-size";
+ args[ac++] = max_size_arg;
+ }
if (delete_before)
args[ac++] = "--delete-before";
else if (delete_during == 2)
args[ac++] = "--super";
if (size_only)
args[ac++] = "--size-only";
+ } else {
+ if (skip_compress) {
+ if (asprintf(&arg, "--skip-compress=%s", skip_compress) < 0)
+ goto oom;
+ args[ac++] = arg;
+ }
}
if (modify_window_set) {
if (numeric_ids)
args[ac++] = "--numeric-ids";
+ if (!allow_inc_recurse)
+ args[ac++] = "--no-ir";
+
if (am_sender) {
if (ignore_existing)
args[ac++] = "--ignore-existing";
if (p[1] == ':')
*port_ptr = atoi(p+2);
} else {
- if ((p = strchr(s, ':')) != NULL) {
+ if ((p = strchr(s, ':')) != NULL && p < s + hostlen) {
hostlen = p - s;
*port_ptr = atoi(p+1);
}