X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/654175798bdbdd6403e10c8fa74e8586b3612ea1..d1be231290b3867648ee417fad341fdf1caaa94b:/options.c diff --git a/options.c b/options.c index 9d7ad92c..ca1b0187 100644 --- a/options.c +++ b/options.c @@ -86,8 +86,9 @@ void usage(int F) rprintf(F,"Usage: rsync [OPTION]... SRC [USER@]HOST:DEST\n"); rprintf(F," or rsync [OPTION]... [USER@]HOST:SRC DEST\n"); rprintf(F," or rsync [OPTION]... SRC DEST\n"); - rprintf(F," or rsync [OPTION]... [USER@]HOST::SRC DEST\n"); + rprintf(F," or rsync [OPTION]... [USER@]HOST::SRC [DEST]\n"); rprintf(F," or rsync [OPTION]... SRC [USER@]HOST::DEST\n"); + rprintf(F," or rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]\n"); rprintf(F,"\nOptions\n"); rprintf(F," -v, --verbose increase verbosity\n"); rprintf(F," -c, --checksum always checksum\n"); @@ -122,9 +123,9 @@ void usage(int F) rprintf(F," -T --temp-dir=DIR create temporary files in directory DIR\n"); rprintf(F," --compare-dest=DIR also compare destination files relative to DIR\n"); rprintf(F," -z, --compress compress file data\n"); - rprintf(F," --exclude=PATTERN exclude file FILE\n"); + rprintf(F," --exclude=PATTERN exclude files matching PATTERN\n"); rprintf(F," --exclude-from=FILE exclude patterns listed in FILE\n"); - rprintf(F," --include=PATTERN don't exclude file FILE\n"); + rprintf(F," --include=PATTERN don't exclude files matching PATTERN\n"); rprintf(F," --include-from=FILE don't exclude patterns listed in FILE\n"); rprintf(F," --suffix=SUFFIX override backup suffix\n"); rprintf(F," --version print version number\n"); @@ -141,7 +142,7 @@ void usage(int F) rprintf(F,"the block size defaults to %d\n",BLOCK_SIZE); rprintf(F,"\nPlease see the rsync(1) and rsyncd.conf(5) man pages for full documentation\n"); - rprintf(F,"See http://samba.anu.edu.au/rsync/ for updates and bug reports\n"); + rprintf(F,"See http://rsync.samba.org/ for updates and bug reports\n"); } enum {OPT_VERSION,OPT_SUFFIX,OPT_SENDER,OPT_SERVER,OPT_EXCLUDE, @@ -204,14 +205,63 @@ static struct option long_options[] = { {0,0,0,0}}; +static char err_buf[100]; + +void option_error(void) +{ + if (err_buf[0]) { + rprintf(FLOG,"%s", err_buf); + rprintf(FERROR,"%s", err_buf); + } else { + rprintf(FLOG,"Error parsing options - unsupported option?\n"); + rprintf(FERROR,"Error parsing options - unsupported option?\n"); + } + exit_cleanup(RERR_UNSUPPORTED); +} + +/* check to see if we should refuse this option */ +static int check_refuse_options(char *ref, int opt) +{ + int i, len; + char *p; + const char *name; + + for (i=0; long_options[i].name; i++) { + if (long_options[i].val == opt) break; + } + + if (!long_options[i].name) return 0; + + name = long_options[i].name; + len = strlen(name); + + while ((p = strstr(ref,name))) { + if ((p==ref || p[-1]==' ') && + (p[len] == ' ' || p[len] == 0)) { + slprintf(err_buf,sizeof(err_buf), + "The '%s' option is not supported by this server\n", name); + return 1; + } + ref += len; + } + return 0; +} + + int parse_arguments(int argc, char *argv[]) { int opt; int option_index; + char *ref = lp_refuse_options(module_id); while ((opt = getopt_long(argc, argv, short_options, long_options, &option_index)) != -1) { + + if (ref) { + if (check_refuse_options(ref, opt)) return 0; + } + switch (opt) { case OPT_VERSION: rprintf(FINFO,"rsync version %s protocol version %d\n\n", @@ -307,6 +357,7 @@ int parse_arguments(int argc, char *argv[]) #if SUPPORT_HARD_LINKS preserve_hard_links=1; #else + slprintf(err_buf,sizeof(err_buf),"hard links are not supported on this server\n"); rprintf(FERROR,"ERROR: hard links not supported on this platform\n"); return 0; #endif @@ -427,6 +478,7 @@ int parse_arguments(int argc, char *argv[]) break; default: + slprintf(err_buf,sizeof(err_buf),"unrecognised option\n"); return 0; } }