From 7a4addaa744a9e2a99dc586a92c5ef9faac3fab9 Mon Sep 17 00:00:00 2001 From: Wayne Davison Date: Sun, 9 Sep 2007 07:53:18 +0000 Subject: [PATCH] Added the --protect-args (-s) option, and made parse_arguments() clear out an old popt context before starting a new one. --- options.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/options.c b/options.c index 44197821..c91741c7 100644 --- a/options.c +++ b/options.c @@ -90,6 +90,7 @@ char *files_from = NULL; int filesfrom_fd = -1; char *filesfrom_host = NULL; int eol_nulls = 0; +int protect_args = 0; int human_readable = 0; int recurse = 0; int allow_inc_recurse = 1; @@ -397,6 +398,7 @@ void usage(enum logcode F) rprintf(F," --include-from=FILE read include patterns from FILE\n"); rprintf(F," --files-from=FILE read list of source-file names from FILE\n"); rprintf(F," -0, --from0 all *-from/filter files are delimited by 0s\n"); + rprintf(F," -s, --protect-args no space-splitting; only wildcard special-chars\n"); rprintf(F," --address=ADDRESS bind address for outgoing socket to daemon\n"); rprintf(F," --port=PORT specify double-colon alternate port number\n"); rprintf(F," --sockopts=OPTIONS specify custom TCP options\n"); @@ -591,6 +593,7 @@ static struct poptOption long_options[] = { {"files-from", 0, POPT_ARG_STRING, &files_from, 0, 0, 0 }, {"from0", '0', POPT_ARG_VAL, &eol_nulls, 1, 0, 0}, {"no-from0", 0, POPT_ARG_VAL, &eol_nulls, 0, 0, 0}, + {"protect-args", 's', POPT_ARG_NONE, &protect_args, 0, 0, 0}, {"numeric-ids", 0, POPT_ARG_VAL, &numeric_ids, 1, 0, 0 }, {"no-numeric-ids", 0, POPT_ARG_VAL, &numeric_ids, 0, 0, 0 }, {"timeout", 0, POPT_ARG_INT, &io_timeout, 0, 0, 0 }, @@ -858,7 +861,7 @@ static void create_refuse_error(int which) **/ int parse_arguments(int *argc_p, const char ***argv_p, int frommain) { - poptContext pc; + static poptContext pc; char *ref = lp_refuse_options(module_id); const char *arg, **argv = *argv_p; int argc = *argc_p; @@ -878,8 +881,11 @@ int parse_arguments(int *argc_p, const char ***argv_p, int frommain) /* The context leaks in case of an error, but if there's a * problem we always exit anyhow. */ - pc = poptGetContext(RSYNC_NAME, *argc, *argv, long_options, 0); - poptReadDefaultConfig(pc, 0); + if (pc) + poptFreeContext(pc); + pc = poptGetContext(RSYNC_NAME, argc, argv, long_options, 0); + if (!am_server) + poptReadDefaultConfig(pc, 0); while ((opt = poptGetNextOpt(pc)) != -1) { /* most options are handled automatically by popt; @@ -1229,6 +1235,13 @@ int parse_arguments(int *argc_p, const char ***argv_p, int frommain) exit_cleanup(0); } + if (protect_args) { + if (!frommain) + protect_args = 0; + else if (am_server) + return 1; + } + #ifdef ICONV_OPTION if (iconv_opt) { if (!am_server && strcmp(iconv_opt, "-") == 0) -- 2.34.1