extern int sanitize_paths;
extern int select_timeout;
-extern char curr_dir[MAXPATHLEN];
extern struct exclude_list_struct exclude_list;
extern struct exclude_list_struct server_exclude_list;
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," -B, --block-size=SIZE force a fixed checksum block-size\n");
rprintf(F," -e, --rsh=COMMAND specify the remote shell\n");
rprintf(F," --rsync-path=PATH specify path to rsync on the remote machine\n");
rprintf(F," --existing only update files that already exist\n");
static void set_refuse_options(char *bp)
{
struct poptOption *op;
- char *cp;
+ char *cp, shortname[2];
+ int is_wild, found_match;
+
+ shortname[1] = '\0';
while (1) {
+ while (*bp == ' ') bp++;
+ if (!*bp)
+ break;
if ((cp = strchr(bp, ' ')) != NULL)
*cp= '\0';
+ /* If they specify "delete", reject all delete options. */
+ if (strcmp(bp, "delete") == 0)
+ bp = "delete*";
+ is_wild = strpbrk(bp, "*?[") != NULL;
+ found_match = 0;
for (op = long_options; ; op++) {
- if (!op->longName) {
- rprintf(FLOG,
- "Unknown option %s in \"refuse options\" setting\n",
- bp);
- break;
- }
- if (strcmp(bp, op->longName) == 0) {
- op->val = (op - long_options)+OPT_REFUSED_BASE;
+ *shortname = op->shortName;
+ if (!op->longName && !*shortname)
break;
+ if ((op->longName && wildmatch(bp, op->longName))
+ || (*shortname && wildmatch(bp, shortname))) {
+ op->val = (op - long_options) + OPT_REFUSED_BASE;
+ found_match = 1;
+ if (!is_wild)
+ break;
}
}
+ if (!found_match) {
+ rprintf(FLOG, "No match for refuse-options string \"%s\"\n",
+ bp);
+ }
if (!cp)
break;
*cp = ' ';
}
#endif
- if (block_size > MAX_MAP_SIZE) {
- rprintf(FINFO, "limiting block-size to %d bytes\n",
- MAX_MAP_SIZE);
- block_size = MAX_MAP_SIZE;
- }
-
if (write_batch && read_batch) {
snprintf(err_buf, sizeof err_buf,
"--write-batch and --read-batch can not be used together\n");
if (sanitize_paths) {
int i;
for (i = *argc; i-- > 0; )
- (*argv)[i] = alloc_sanitize_path((*argv)[i], NULL);
+ (*argv)[i] = sanitize_path(NULL, (*argv)[i], NULL);
if (tmpdir)
- tmpdir = alloc_sanitize_path(tmpdir, curr_dir);
+ tmpdir = sanitize_path(NULL, tmpdir, "");
if (partial_dir)
- partial_dir = alloc_sanitize_path(partial_dir, curr_dir);
+ partial_dir = sanitize_path(NULL, partial_dir, "");
if (compare_dest)
- compare_dest = alloc_sanitize_path(compare_dest, curr_dir);
+ compare_dest = sanitize_path(NULL, compare_dest, "");
if (backup_dir)
- backup_dir = alloc_sanitize_path(backup_dir, curr_dir);
+ backup_dir = sanitize_path(NULL, backup_dir, "");
if (files_from)
- files_from = alloc_sanitize_path(files_from, curr_dir);
+ files_from = sanitize_path(NULL, files_from, "");
}
if (server_exclude_list.head && !am_sender) {
struct exclude_list_struct *elp = &server_exclude_list;
args[ac++] = arg;
}
- if (delete_excluded)
- args[ac++] = "--delete-excluded";
- else if (delete_mode)
- args[ac++] = "--delete";
+ if (am_sender) {
+ if (delete_excluded)
+ args[ac++] = "--delete-excluded";
+ else if (delete_mode
+ && (!delete_after || protocol_version < 27))
+ args[ac++] = "--delete";
+
+ if (delete_after)
+ args[ac++] = "--delete-after";
+
+ if (force_delete)
+ args[ac++] = "--force";
+ }
if (size_only)
args[ac++] = "--size-only";
} else if (keep_partial)
args[ac++] = "--partial";
- if (force_delete)
- args[ac++] = "--force";
-
- if (delete_after)
- args[ac++] = "--delete-after";
-
if (ignore_errors)
args[ac++] = "--ignore-errors";