X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/221ddb945658d0a77b19242bfb93b55e9f86b4aa..f9c6b3e7d622d6e3960faec80a382bbef99d7a8c:/options.c diff --git a/options.c b/options.c index e11d20ea..34c131ca 100644 --- a/options.c +++ b/options.c @@ -22,6 +22,7 @@ #include "popt.h" extern int sanitize_paths; +extern int select_timeout; extern char curr_dir[MAXPATHLEN]; extern struct exclude_list_struct exclude_list; @@ -38,6 +39,7 @@ int make_backups = 0; int whole_file = -1; int archive_mode = 0; +int keep_dirlinks = 0; int copy_links = 0; int preserve_links = 0; int preserve_hard_links = 0; @@ -83,6 +85,7 @@ int safe_symlinks = 0; int copy_unsafe_links = 0; int size_only = 0; int bwlimit = 0; +size_t bwlimit_writemax = 0; int delete_after = 0; int only_existing = 0; int opt_ignore_existing = 0; @@ -231,6 +234,7 @@ void usage(enum logcode F) rprintf(F," --backup-dir make backups into this directory\n"); rprintf(F," --suffix=SUFFIX backup suffix (default %s w/o --backup-dir)\n",BACKUP_SUFFIX); rprintf(F," -u, --update update only (don't overwrite newer files)\n"); + rprintf(F," -K, --keep-dirlinks treat symlinked dir on receiver as dir\n"); rprintf(F," -l, --links copy symlinks as symlinks\n"); rprintf(F," -L, --copy-links copy the referent of all symlinks\n"); rprintf(F," --copy-unsafe-links copy the referent of \"unsafe\" symlinks\n"); @@ -306,7 +310,7 @@ void usage(enum logcode F) enum {OPT_VERSION = 1000, OPT_SENDER, OPT_EXCLUDE, OPT_EXCLUDE_FROM, OPT_DELETE_AFTER, OPT_DELETE_EXCLUDED, OPT_LINK_DEST, OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_MODIFY_WINDOW, - OPT_READ_BATCH, OPT_WRITE_BATCH, + OPT_READ_BATCH, OPT_WRITE_BATCH, OPT_TIMEOUT, OPT_REFUSED_BASE = 9000}; static struct poptOption long_options[] = { @@ -337,6 +341,7 @@ static struct poptOption long_options[] = { {"sparse", 'S', POPT_ARG_NONE, &sparse_files, 0, 0, 0 }, {"cvs-exclude", 'C', POPT_ARG_NONE, &cvs_exclude, 0, 0, 0 }, {"update", 'u', POPT_ARG_NONE, &update_only, 0, 0, 0 }, + {"keep-dirlinks", 'K', POPT_ARG_NONE, &keep_dirlinks, 0, 0, 0 }, {"links", 'l', POPT_ARG_NONE, &preserve_links, 0, 0, 0 }, {"copy-links", 'L', POPT_ARG_NONE, ©_links, 0, 0, 0 }, {"whole-file", 'W', POPT_ARG_VAL, &whole_file, 1, 0, 0 }, @@ -359,7 +364,7 @@ static struct poptOption long_options[] = { {"rsh", 'e', POPT_ARG_STRING, &shell_cmd, 0, 0, 0 }, {"block-size", 'B', POPT_ARG_INT, &block_size, 0, 0, 0 }, {"max-delete", 0, POPT_ARG_INT, &max_delete, 0, 0, 0 }, - {"timeout", 0, POPT_ARG_INT, &io_timeout, 0, 0, 0 }, + {"timeout", 0, POPT_ARG_INT, &io_timeout, OPT_TIMEOUT, 0, 0 }, {"temp-dir", 'T', POPT_ARG_STRING, &tmpdir, 0, 0, 0 }, {"compare-dest", 0, POPT_ARG_STRING, &compare_dest, 0, 0, 0 }, {"link-dest", 0, POPT_ARG_STRING, &compare_dest, OPT_LINK_DEST, 0, 0 }, @@ -406,17 +411,12 @@ static char err_buf[200]; **/ void option_error(void) { - int save_daemon = am_daemon; - if (!err_buf[0]) { strcpy(err_buf, "Error parsing options: " "option may be supported on client but not on server?\n"); } - rwrite(FLOG, err_buf, strlen(err_buf)); - am_daemon = 0; rprintf(FERROR, RSYNC_NAME ": %s", err_buf); - am_daemon = save_daemon; } @@ -514,26 +514,30 @@ int parse_arguments(int *argc, const char ***argv, int frommain) break; case OPT_EXCLUDE: + if (am_server || sanitize_paths) + return 0; /* Impossible... */ add_exclude(&exclude_list, poptGetOptArg(pc), 0); break; case OPT_INCLUDE: + if (am_server || sanitize_paths) + return 0; /* Impossible... */ add_exclude(&exclude_list, poptGetOptArg(pc), XFLG_DEF_INCLUDE); break; case OPT_EXCLUDE_FROM: + if (am_server || sanitize_paths) + return 0; /* Impossible... */ arg = poptGetOptArg(pc); - if (sanitize_paths) - arg = alloc_sanitize_path(arg, curr_dir); add_exclude_file(&exclude_list, arg, XFLG_FATAL_ERRORS); break; case OPT_INCLUDE_FROM: + if (am_server || sanitize_paths) + return 0; /* Impossible... */ arg = poptGetOptArg(pc); - if (sanitize_paths) - arg = alloc_sanitize_path(arg, curr_dir); add_exclude_file(&exclude_list, arg, XFLG_FATAL_ERRORS | XFLG_DEF_INCLUDE); break; @@ -576,6 +580,11 @@ int parse_arguments(int *argc, const char ***argv, int frommain) checksum_seed = FIXED_CHECKSUM_SEED; break; + case OPT_TIMEOUT: + if (io_timeout && io_timeout < select_timeout) + select_timeout = io_timeout; + break; + case OPT_LINK_DEST: #if HAVE_LINK link_dest = 1; @@ -724,6 +733,12 @@ int parse_arguments(int *argc, const char ***argv, int frommain) if (do_progress && !verbose) verbose = 1; + if (bwlimit) { + bwlimit_writemax = (size_t)bwlimit * 128; + if (bwlimit_writemax < 512) + bwlimit_writemax = 512; + } + if (files_from) { char *colon; if (*argc != 2 && !(am_server && am_sender && *argc == 1)) { @@ -807,6 +822,8 @@ void server_options(char **args,int *argc) argstr[x++] = 'l'; if (copy_links) argstr[x++] = 'L'; + if (keep_dirlinks && am_sender) + argstr[x++] = 'K'; if (whole_file > 0) argstr[x++] = 'W';