changed an example slightly
[rsync/rsync.git] / options.c
index 09a13c4..482f85e 100644 (file)
--- 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");  
@@ -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
@@ -361,7 +412,7 @@ int parse_arguments(int argc, char *argv[])
                case OPT_SENDER:
                        if (!am_server) {
                                usage(FERROR);
-                               exit_cleanup(1);
+                               exit_cleanup(RERR_SYNTAX);
                        }
                        am_sender = 1;
                        break;
@@ -427,6 +478,7 @@ int parse_arguments(int argc, char *argv[])
                        break;
 
                default:
+                       slprintf(err_buf,sizeof(err_buf),"unrecognised option\n");
                        return 0;
                }
        }