X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/b61665d5b61cfc322579028b4b54438d8b80ac91..ec8637f3679b891041c798400774141024e24a4e:/options.c diff --git a/options.c b/options.c index f7ef675a..11249c07 100644 --- 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; @@ -185,8 +187,8 @@ int list_only = 0; #define MAX_BATCH_NAME_LEN 256 /* Must be less than MAXPATHLEN-13 */ char *batch_name = NULL; -#ifdef ICONV_OPTION int need_unsorted_flist = 0; +#ifdef ICONV_OPTION char *iconv_opt = ICONV_OPTION; #endif @@ -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"); @@ -421,7 +424,7 @@ void usage(enum logcode F) rprintf(F," --read-batch=FILE read a batched update from FILE\n"); rprintf(F," --protocol=NUM force an older protocol version to be used\n"); #ifdef ICONV_OPTION - rprintf(F," --iconv=CONVERT_SPEC request charset conversion of filesnames\n"); + rprintf(F," --iconv=CONVERT_SPEC request charset conversion of filenames\n"); #endif rprintf(F," -4, --ipv4 prefer IPv4\n"); rprintf(F," -6, --ipv6 prefer IPv6\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, 1); - 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, 1); - 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, 1); - 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; } } @@ -1565,7 +1574,7 @@ int parse_arguments(int *argc_p, const char ***argv_p, int frommain) } if (partial_dir) { if (*partial_dir) - clean_fname(partial_dir, 1); + clean_fname(partial_dir, CFN_COLLAPSE_DOT_DOT_DIRS); if (!*partial_dir || strcmp(partial_dir, ".") == 0) partial_dir = NULL; if (!partial_dir && refused_partial) { @@ -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, 1); - 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); @@ -1644,12 +1655,8 @@ void server_options(char **args, int *argc_p) static char argstr[64]; int ac = *argc_p; char *arg; - int i, x; - if (blocking_io == -1) - blocking_io = 0; - /* This should always remain first on the server's command-line. */ args[ac++] = "--server"; @@ -1752,14 +1759,20 @@ void server_options(char **args, int *argc_p) if (do_compression) argstr[x++] = 'z'; + /* We make use of the -e option to let the server know about any + * pre-release protocol version && our allow_inc_recurse status. */ + set_allow_inc_recurse(); #if SUBPROTOCOL_VERSION != 0 - /* If we're speaking a pre-release version of a protocol, we tell - * the server about this by (ab)using the -e option. */ if (protocol_version == PROTOCOL_VERSION) { x += snprintf(argstr+x, sizeof argstr - x, - "e%d.%d", PROTOCOL_VERSION, SUBPROTOCOL_VERSION); - } + "e%d.%d%s", PROTOCOL_VERSION, SUBPROTOCOL_VERSION, + allow_inc_recurse ? "i" : ""); + } else #endif + if (allow_inc_recurse) { + argstr[x++] = 'e'; + argstr[x++] = 'i'; + } argstr[x] = '\0'; @@ -1925,8 +1938,8 @@ void server_options(char **args, int *argc_p) if (numeric_ids) args[ac++] = "--numeric-ids"; - if (!allow_inc_recurse) - args[ac++] = "--no-i-r"; + if (use_qsort) + args[ac++] = "--use-qsort"; if (am_sender) { if (ignore_existing)