X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/c3ea09906de8ab7b25b12032e1ed71d61f0bac16..84e1a698bfdc69f34204c36f95457cc2aeaaf096:/options.c diff --git a/options.c b/options.c index b017c116..c4db5ed2 100644 --- a/options.c +++ b/options.c @@ -439,21 +439,33 @@ void option_error(void) static void set_refuse_options(char *bp) { struct poptOption *op; - char *cp; + char *cp, shortname[2]; + int is_wild; + + 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; for (op = long_options; ; op++) { if (!op->longName) { rprintf(FLOG, - "Unknown option %s in \"refuse options\" setting\n", + "No match for refuse-options string \"%s\"\n", bp); break; } - if (strcmp(bp, op->longName) == 0) { - op->val = (op - long_options)+OPT_REFUSED_BASE; - break; + *shortname = op->shortName; + if (wildmatch(bp, op->longName) || wildmatch(bp, shortname)) { + op->val = (op - long_options) + OPT_REFUSED_BASE; + if (!is_wild) + break; } } if (!cp) @@ -1000,10 +1012,19 @@ void server_options(char **args,int *argc) 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"; @@ -1026,12 +1047,6 @@ void server_options(char **args,int *argc) } 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";