X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/a4453606ccf4aa3853588af2883d77d4e4df81bc..2042c632512e47cb7bfa3aa6131b89c2e9829820:/options.c diff --git a/options.c b/options.c index c868cfe4..65fc9c4a 100644 --- a/options.c +++ b/options.c @@ -20,6 +20,7 @@ */ #include "rsync.h" +#include "ifuncs.h" #include #include "zlib/zlib.h" @@ -184,8 +185,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 @@ -350,7 +351,7 @@ 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," -n, --dry-run perform a trial run with no changes made\n"); rprintf(F," -W, --whole-file copy files whole (without rsync 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"); @@ -420,7 +421,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"); @@ -463,7 +464,6 @@ static struct poptOption long_options[] = { {"no-inc-recursive", 0, POPT_ARG_VAL, &allow_inc_recurse, 0, 0, 0 }, {"i-r", 0, POPT_ARG_VAL, &allow_inc_recurse, 1, 0, 0 }, {"no-i-r", 0, POPT_ARG_VAL, &allow_inc_recurse, 0, 0, 0 }, - {"no-ir", 0, POPT_ARG_VAL, &allow_inc_recurse, 0, 0, 0 }, /* XXX remove soon */ {"dirs", 'd', POPT_ARG_VAL, &xfer_dirs, 2, 0, 0 }, {"no-dirs", 0, POPT_ARG_VAL, &xfer_dirs, 0, 0, 0 }, {"no-d", 0, POPT_ARG_VAL, &xfer_dirs, 0, 0, 0 }, @@ -1003,15 +1003,17 @@ int parse_arguments(int *argc_p, const char ***argv_p, int frommain) if (sanitize_paths) arg = sanitize_path(NULL, arg, NULL, 0, NULL); if (server_filter_list.head) { + int rej; char *cp = strdup(arg); if (!cp) out_of_memory("parse_arguments"); if (!*cp) goto options_rejected; - clean_fname(cp, 1); - if (check_filter(&server_filter_list, cp, 0) < 0) - goto options_rejected; + clean_fname(cp, CFN_COLLAPSE_DOT_DOT_DIRS); + rej = check_filter(&server_filter_list, cp, 0) < 0; free(cp); + if (rej) + goto options_rejected; } parse_filter_file(&filter_list, arg, opt == OPT_INCLUDE_FROM ? MATCHFLG_INCLUDE : 0, @@ -1198,9 +1200,9 @@ int parse_arguments(int *argc_p, const char ***argv_p, int frommain) break; #else /* FIXME: this should probably be ignored with a - * warning and then countermeasures taken to - * restrict group and other access in the presence - * of any more restrictive ACLs, but this is safe + * warning and then countermeasures taken to + * restrict group and other access in the presence + * of any more restrictive ACLs, but this is safe * for now */ snprintf(err_buf,sizeof(err_buf), "ACLs are not supported on this %s\n", @@ -1247,7 +1249,6 @@ int parse_arguments(int *argc_p, const char ***argv_p, int frommain) else need_unsorted_flist = 1; } - setup_iconv(); #endif if (protect_args == 1) { @@ -1404,14 +1405,14 @@ int parse_arguments(int *argc_p, const char ***argv_p, int frommain) if (tmpdir) { if (!*tmpdir) goto options_rejected; - clean_fname(tmpdir, 1); + clean_fname(tmpdir, CFN_COLLAPSE_DOT_DOT_DIRS); if (check_filter(elp, tmpdir, 1) < 0) goto options_rejected; } if (backup_dir) { if (!*backup_dir) goto options_rejected; - clean_fname(backup_dir, 1); + clean_fname(backup_dir, CFN_COLLAPSE_DOT_DOT_DIRS); if (check_filter(elp, backup_dir, 1) < 0) goto options_rejected; } @@ -1444,10 +1445,10 @@ int parse_arguments(int *argc_p, const char ***argv_p, int frommain) snprintf(err_buf, sizeof err_buf, "--suffix cannot be a null string without --backup-dir\n"); return 0; - } else if (make_backups && delete_mode && !delete_excluded && !am_server) { - snprintf(backup_dir_buf, sizeof backup_dir_buf, + } else if (make_backups && delete_mode && !delete_excluded && !am_server) { + snprintf(backup_dir_buf, sizeof backup_dir_buf, "P *%s", backup_suffix); - parse_rule(&filter_list, backup_dir_buf, 0, 0); + parse_rule(&filter_list, backup_dir_buf, 0, 0); } if (make_backups && !backup_dir) { @@ -1564,7 +1565,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) { @@ -1605,7 +1606,7 @@ int parse_arguments(int *argc_p, const char ***argv_p, int frommain) if (server_filter_list.head) { if (!*files_from) goto options_rejected; - clean_fname(files_from, 1); + clean_fname(files_from, CFN_COLLAPSE_DOT_DOT_DIRS); if (check_filter(&server_filter_list, files_from, 0) < 0) goto options_rejected; } @@ -1643,12 +1644,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"; @@ -1680,7 +1677,8 @@ void server_options(char **args, int *argc_p) argstr[x++] = 'n'; if (preserve_links) argstr[x++] = 'l'; - if (xfer_dirs > (recurse || !delete_mode || !am_sender ? 1 : 0)) + if ((list_only && !recurse) || xfer_dirs > 1 + || (xfer_dirs && !recurse && delete_mode && am_sender)) argstr[x++] = 'd'; if (am_sender) { if (keep_dirlinks) @@ -1750,20 +1748,20 @@ void server_options(char **args, int *argc_p) if (do_compression) argstr[x++] = 'z'; - /* This is a complete hack - blame Rusty. FIXME! - * This hack is only needed for older rsync versions that - * don't understand the --list-only option. */ - if (list_only == 1 && !recurse) - argstr[x++] = 'r'; - + /* 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'; @@ -1929,8 +1927,8 @@ void server_options(char **args, int *argc_p) if (numeric_ids) args[ac++] = "--numeric-ids"; - if (!allow_inc_recurse) - args[ac++] = "--no-ir"; /* XXX change to --no-i-r soon */ + if (use_qsort) + args[ac++] = "--use-qsort"; if (am_sender) { if (ignore_existing) @@ -1978,7 +1976,8 @@ void server_options(char **args, int *argc_p) if (!relative_paths) args[ac++] = "--no-relative"; } - if (relative_paths && !implied_dirs && !am_sender) + /* It's OK that this checks the upper-bound of the protocol_version. */ + if (relative_paths && !implied_dirs && (!am_sender || protocol_version >= 30)) args[ac++] = "--no-implied-dirs"; if (fuzzy_basis && am_sender)