summaryrefslogtreecommitdiff
path: root/options.c
diff options
context:
space:
mode:
authorWayne Davison <wayned@samba.org>2007-09-09 07:53:18 +0000
committerWayne Davison <wayned@samba.org>2007-09-09 07:53:18 +0000
commit7a4addaa744a9e2a99dc586a92c5ef9faac3fab9 (patch)
treefda306e62cba7ea40ad5f5bfd124f42b7d99f397 /options.c
parentf7e5068d94b5de8f568cb835654dc83a31695ddf (diff)
downloadrsync-7a4addaa744a9e2a99dc586a92c5ef9faac3fab9.tar.gz
rsync-7a4addaa744a9e2a99dc586a92c5ef9faac3fab9.tar.bz2
rsync-7a4addaa744a9e2a99dc586a92c5ef9faac3fab9.zip
Added the --protect-args (-s) option, and made parse_arguments()
clear out an old popt context before starting a new one.
Diffstat (limited to 'options.c')
-rw-r--r--options.c19
1 files 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)