and to allow single-letter option names.
- No need to send the various --delete* options or the --force option
from the receiver to the sender.
{
struct poptOption *op;
char *cp;
{
struct poptOption *op;
char *cp;
+ int match_short, is_wild;
+ while (*bp == ' ') bp++;
+ if (!*bp)
+ break;
if ((cp = strchr(bp, ' ')) != NULL)
*cp= '\0';
if ((cp = strchr(bp, ' ')) != NULL)
*cp= '\0';
+ /* If they specify "delete", reject all delete options. */
+ if (strcmp(bp, "delete") == 0)
+ bp = "delete*";
+ match_short = !bp[1] && *bp != '*';
+ is_wild = !match_short && strpbrk(bp, "*?[") != NULL;
for (op = long_options; ; op++) {
if (!op->longName) {
rprintf(FLOG,
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",
- if (strcmp(bp, op->longName) == 0) {
- op->val = (op - long_options)+OPT_REFUSED_BASE;
- break;
+ if (match_short ? *bp == op->shortName
+ : wildmatch(bp, op->longName)) {
+ op->val = (op - long_options) + OPT_REFUSED_BASE;
+ if (!is_wild)
+ break;
- 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";
if (size_only)
args[ac++] = "--size-only";
} else if (keep_partial)
args[ac++] = "--partial";
} 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";
if (ignore_errors)
args[ac++] = "--ignore-errors";