Don't allow a slash to be specified in a module name.
[rsync/rsync.git] / options.c
index e60778d..11249c0 100644 (file)
--- a/options.c
+++ b/options.c
@@ -27,6 +27,7 @@
 extern int module_id;
 extern int sanitize_paths;
 extern int daemon_over_rsh;
+extern unsigned int module_dirlen;
 extern struct filter_list_struct filter_list;
 extern struct filter_list_struct server_filter_list;
 
@@ -99,6 +100,7 @@ int xfer_dirs = -1;
 int am_daemon = 0;
 int do_stats = 0;
 int do_progress = 0;
+int connect_timeout = 0;
 int keep_partial = 0;
 int safe_symlinks = 0;
 int copy_unsafe_links = 0;
@@ -351,8 +353,8 @@ void usage(enum logcode F)
   rprintf(F,"     --fake-super            store/recover privileged attrs using xattrs\n");
 #endif
   rprintf(F," -S, --sparse                handle sparse files efficiently\n");
-  rprintf(F," -n, --dry-run               show what would have been transferred\n");
-  rprintf(F," -W, --whole-file            copy files whole (without rsync algorithm)\n");
+  rprintf(F," -n, --dry-run               perform a trial run with no changes made\n");
+  rprintf(F," -W, --whole-file            copy files whole (without delta-xfer algorithm)\n");
   rprintf(F," -x, --one-file-system       don't cross filesystem boundaries\n");
   rprintf(F," -B, --block-size=SIZE       force a fixed checksum block-size\n");
   rprintf(F," -e, --rsh=COMMAND           specify the remote shell to use\n");
@@ -377,7 +379,8 @@ void usage(enum logcode F)
   rprintf(F,"     --delay-updates         put all updated files into place at transfer's end\n");
   rprintf(F," -m, --prune-empty-dirs      prune empty directory chains from the file-list\n");
   rprintf(F,"     --numeric-ids           don't map uid/gid values by user/group name\n");
-  rprintf(F,"     --timeout=TIME          set I/O timeout in seconds\n");
+  rprintf(F,"     --timeout=SECONDS       set I/O timeout in seconds\n");
+  rprintf(F,"     --contimeout=SECONDS    set daemon connection timeout in seconds\n");
   rprintf(F," -I, --ignore-times          don't skip files that match in size and mod-time\n");
   rprintf(F,"     --size-only             skip files that match in size\n");
   rprintf(F,"     --modify-window=NUM     compare mod-times with reduced accuracy\n");
@@ -603,6 +606,7 @@ static struct poptOption long_options[] = {
   {"no-numeric-ids",   0,  POPT_ARG_VAL,    &numeric_ids, 0, 0, 0 },
   {"timeout",          0,  POPT_ARG_INT,    &io_timeout, 0, 0, 0 },
   {"no-timeout",       0,  POPT_ARG_VAL,    &io_timeout, 0, 0, 0 },
+  {"contimeout",       0,  POPT_ARG_INT,    &connect_timeout, 0, 0, 0 },
   {"rsh",             'e', POPT_ARG_STRING, &shell_cmd, 0, 0, 0 },
   {"rsync-path",       0,  POPT_ARG_STRING, &rsync_path, 0, 0, 0 },
   {"temp-dir",        'T', POPT_ARG_STRING, &tmpdir, 0, 0, 0 },
@@ -1001,16 +1005,17 @@ int parse_arguments(int *argc_p, const char ***argv_p, int frommain)
                case OPT_INCLUDE_FROM:
                        arg = poptGetOptArg(pc);
                        if (sanitize_paths)
-                               arg = sanitize_path(NULL, arg, NULL, 0, NULL);
+                               arg = sanitize_path(NULL, arg, NULL, 0);
                        if (server_filter_list.head) {
                                int rej;
-                               char *cp = strdup(arg);
+                               char *dir, *cp = strdup(arg);
                                if (!cp)
                                        out_of_memory("parse_arguments");
                                if (!*cp)
                                        goto options_rejected;
-                               clean_fname(cp, CFN_COLLAPSE_DOT_DOT_DIRS);
-                               rej = check_filter(&server_filter_list, cp, 0) < 0;
+                               dir = cp + (*cp == '/' ? module_dirlen : 0);
+                               clean_fname(dir, CFN_COLLAPSE_DOT_DOT_DIRS);
+                               rej = check_filter(&server_filter_list, dir, 0) < 0;
                                free(cp);
                                if (rej)
                                        goto options_rejected;
@@ -1394,26 +1399,30 @@ int parse_arguments(int *argc_p, const char ***argv_p, int frommain)
        if (sanitize_paths) {
                int i;
                for (i = argc; i-- > 0; )
-                       argv[i] = sanitize_path(NULL, argv[i], "", 0, NULL);
+                       argv[i] = sanitize_path(NULL, argv[i], "", 0);
                if (tmpdir)
-                       tmpdir = sanitize_path(NULL, tmpdir, NULL, 0, NULL);
+                       tmpdir = sanitize_path(NULL, tmpdir, NULL, 0);
                if (backup_dir)
-                       backup_dir = sanitize_path(NULL, backup_dir, NULL, 0, NULL);
+                       backup_dir = sanitize_path(NULL, backup_dir, NULL, 0);
        }
        if (server_filter_list.head && !am_sender) {
                struct filter_list_struct *elp = &server_filter_list;
                if (tmpdir) {
+                       char *dir;
                        if (!*tmpdir)
                                goto options_rejected;
-                       clean_fname(tmpdir, CFN_COLLAPSE_DOT_DOT_DIRS);
-                       if (check_filter(elp, tmpdir, 1) < 0)
+                       dir = tmpdir + (*tmpdir == '/' ? module_dirlen : 0);
+                       clean_fname(dir, CFN_COLLAPSE_DOT_DOT_DIRS);
+                       if (check_filter(elp, dir, 1) < 0)
                                goto options_rejected;
                }
                if (backup_dir) {
+                       char *dir;
                        if (!*backup_dir)
                                goto options_rejected;
-                       clean_fname(backup_dir, CFN_COLLAPSE_DOT_DOT_DIRS);
-                       if (check_filter(elp, backup_dir, 1) < 0)
+                       dir = backup_dir + (*backup_dir == '/' ? module_dirlen : 0);
+                       clean_fname(dir, CFN_COLLAPSE_DOT_DOT_DIRS);
+                       if (check_filter(elp, dir, 1) < 0)
                                goto options_rejected;
                }
        }
@@ -1602,12 +1611,14 @@ int parse_arguments(int *argc_p, const char ***argv_p, int frommain)
                        }
                } else {
                        if (sanitize_paths)
-                               files_from = sanitize_path(NULL, files_from, NULL, 0, NULL);
+                               files_from = sanitize_path(NULL, files_from, NULL, 0);
                        if (server_filter_list.head) {
+                               char *dir;
                                if (!*files_from)
                                        goto options_rejected;
-                               clean_fname(files_from, CFN_COLLAPSE_DOT_DOT_DIRS);
-                               if (check_filter(&server_filter_list, files_from, 0) < 0)
+                               dir = files_from + (*files_from == '/' ? module_dirlen : 0);
+                               clean_fname(dir, CFN_COLLAPSE_DOT_DOT_DIRS);
+                               if (check_filter(&server_filter_list, dir, 0) < 0)
                                        goto options_rejected;
                        }
                        filesfrom_fd = open(files_from, O_RDONLY|O_BINARY);