Fix serious bug with "use chroot = no" option which caused "uid =" and "gid ="
[rsync/rsync.git] / options.c
index 9d7ad92..19ff7ef 100644 (file)
--- a/options.c
+++ b/options.c
@@ -59,7 +59,6 @@ int do_stats=0;
 int do_progress=0;
 int keep_partial=0;
 int safe_symlinks=0;
-
 int block_size=BLOCK_SIZE;
 
 char *backup_suffix = BACKUP_SUFFIX;
@@ -68,7 +67,7 @@ char *compare_dest = NULL;
 char *config_file = RSYNCD_CONF;
 char *shell_cmd = NULL;
 char *log_format = NULL;
-
+char *password_file = NULL;
 char *rsync_path = RSYNC_NAME;
 int rsync_port = RSYNC_PORT;
 
@@ -86,8 +85,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 +122,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");  
@@ -134,6 +134,7 @@ void usage(int F)
   rprintf(F,"     --stats                 give some file transfer stats\n");  
   rprintf(F,"     --progress              show progress during transfer\n");  
   rprintf(F,"     --log-format=FORMAT     log file transfers using specified format\n");  
+  rprintf(F,"     --password-file=FILE    get password from FILE\n");
   rprintf(F," -h, --help                  show this help screen\n");
 
   rprintf(F,"\n");
@@ -141,14 +142,14 @@ 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,
       OPT_EXCLUDE_FROM,OPT_DELETE,OPT_NUMERIC_IDS,OPT_RSYNC_PATH,
       OPT_FORCE,OPT_TIMEOUT,OPT_DAEMON,OPT_CONFIG,OPT_PORT,
       OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_STATS, OPT_PARTIAL, OPT_PROGRESS,
-      OPT_SAFE_LINKS, OPT_COMPARE_DEST, OPT_LOG_FORMAT};
+      OPT_SAFE_LINKS, OPT_COMPARE_DEST, OPT_LOG_FORMAT,OPT_PASSWORD_FILE};
 
 static char *short_options = "oblLWHpguDCtcahvrRIxnSe:B:T:z";
 
@@ -164,6 +165,7 @@ static struct option long_options[] = {
   {"include",     1,     0,    OPT_INCLUDE},
   {"include-from",1,     0,    OPT_INCLUDE_FROM},
   {"rsync-path",  1,     0,    OPT_RSYNC_PATH},
+  {"password-file", 1, 0,     OPT_PASSWORD_FILE},
   {"one-file-system",0,  0,    'x'},
   {"ignore-times",0,     0,    'I'},
   {"help",        0,     0,    'h'},
@@ -204,14 +206,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",
@@ -226,7 +277,10 @@ int parse_arguments(int argc, char *argv[])
                case OPT_RSYNC_PATH:
                        rsync_path = optarg;
                        break;
-                       
+       
+               case OPT_PASSWORD_FILE:
+                       password_file =optarg;
+                       break;          
                case 'I':
                        ignore_times = 1;
                        break;
@@ -307,6 +361,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 +482,7 @@ int parse_arguments(int argc, char *argv[])
                        break;
 
                default:
+                       slprintf(err_buf,sizeof(err_buf),"unrecognised option\n");
                        return 0;
                }
        }