X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/7be73df4e7c9978b619c7e849b3f8ac2987cb667..5b36173d11398362d867d5a7fc50d5f9207f5396:/options.c diff --git a/options.c b/options.c index d5303c85..69eac5c7 100644 --- a/options.c +++ b/options.c @@ -23,7 +23,7 @@ extern int sanitize_paths; extern char curr_dir[MAXPATHLEN]; -extern struct exclude_struct **exclude_list; +extern struct exclude_list_struct exclude_list; int make_backups = 0; @@ -83,6 +83,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; @@ -183,7 +184,7 @@ static void print_rsync_version(enum logcode f) rprintf(f, " %sIPv6, %d-bit system inums, %d-bit internal inums\n", ipv6, (int) (sizeof dumstat->st_ino * 8), - (int) (sizeof (INO64_T) * 8)); + (int) (sizeof (uint64) * 8)); #ifdef MAINTAINER_MODE rprintf(f, " panic action: \"%s\"\n", get_panic_action()); @@ -290,11 +291,12 @@ void usage(enum logcode F) rprintf(F," --bwlimit=KBPS limit I/O bandwidth, KBytes per second\n"); rprintf(F," --write-batch=PREFIX write batch fileset starting with PREFIX\n"); rprintf(F," --read-batch=PREFIX read batch fileset starting with PREFIX\n"); - rprintf(F," -h, --help show this help screen\n"); + rprintf(F," --checksum-seed=NUM set block/file checksum seed\n"); #ifdef INET6 - rprintf(F," -4 prefer IPv4\n"); - rprintf(F," -6 prefer IPv6\n"); + rprintf(F," -4 --ipv4 prefer IPv4\n"); + rprintf(F," -6 --ipv6 prefer IPv6\n"); #endif + rprintf(F," -h, --help show this help screen\n"); rprintf(F,"\n"); @@ -312,8 +314,8 @@ static struct poptOption long_options[] = { /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */ {"version", 0, POPT_ARG_NONE, 0, OPT_VERSION, 0, 0}, {"suffix", 0, POPT_ARG_STRING, &backup_suffix, 0, 0, 0 }, - {"rsync-path", 0, POPT_ARG_STRING, &rsync_path, 0, 0, 0 }, - {"password-file", 0, POPT_ARG_STRING, &password_file, 0, 0, 0 }, + {"rsync-path", 0, POPT_ARG_STRING, &rsync_path, 0, 0, 0 }, + {"password-file", 0, POPT_ARG_STRING, &password_file, 0, 0, 0 }, {"ignore-times", 'I', POPT_ARG_NONE, &ignore_times, 0, 0, 0 }, {"size-only", 0, POPT_ARG_NONE, &size_only, 0, 0, 0 }, {"modify-window", 0, POPT_ARG_INT, &modify_window, OPT_MODIFY_WINDOW, 0, 0 }, @@ -386,15 +388,16 @@ static struct poptOption long_options[] = { {"from0", '0', POPT_ARG_NONE, &eol_nulls, 0, 0, 0}, {"no-implied-dirs", 0, POPT_ARG_VAL, &implied_dirs, 0, 0, 0 }, {"protocol", 0, POPT_ARG_INT, &protocol_version, 0, 0, 0 }, + {"checksum-seed", 0, POPT_ARG_INT, &checksum_seed, 0, 0, 0 }, #ifdef INET6 - {0, '4', POPT_ARG_VAL, &default_af_hint, AF_INET, 0, 0 }, - {0, '6', POPT_ARG_VAL, &default_af_hint, AF_INET6, 0, 0 }, + {"ipv4", '4', POPT_ARG_VAL, &default_af_hint, AF_INET, 0, 0 }, + {"ipv6", '6', POPT_ARG_VAL, &default_af_hint, AF_INET6, 0, 0 }, #endif {0,0,0,0, 0, 0, 0} }; -static char err_buf[100]; +static char err_buf[200]; /** @@ -404,15 +407,17 @@ static char err_buf[100]; **/ void option_error(void) { - if (err_buf[0]) { - rprintf(FLOG, "%s", err_buf); - rprintf(FERROR, RSYNC_NAME ": %s", err_buf); - } else { - rprintf (FERROR, "Error parsing options: " - "option may be supported on client but not on server?\n"); - rprintf (FERROR, RSYNC_NAME ": Error parsing options: " - "option may be supported on client but not on server?\n"); + 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; } @@ -510,29 +515,32 @@ int parse_arguments(int *argc, const char ***argv, int frommain) break; case OPT_EXCLUDE: - add_exclude(&exclude_list, poptGetOptArg(pc), - ADD_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), - ADD_INCLUDE); + 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, - MISSING_FATAL, ADD_EXCLUDE); + 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, - MISSING_FATAL, ADD_INCLUDE); + XFLG_FATAL_ERRORS | XFLG_DEF_INCLUDE); break; case 'h': @@ -581,7 +589,6 @@ int parse_arguments(int *argc, const char ***argv, int frommain) snprintf(err_buf, sizeof err_buf, "hard links are not supported on this %s\n", am_server ? "server" : "client"); - rprintf(FERROR, "ERROR: %s", err_buf); return 0; #endif @@ -614,7 +621,6 @@ int parse_arguments(int *argc, const char ***argv, int frommain) snprintf(err_buf, sizeof err_buf, "symlinks are not supported on this %s\n", am_server ? "server" : "client"); - rprintf(FERROR, "ERROR: %s", err_buf); return 0; } #endif @@ -624,7 +630,6 @@ int parse_arguments(int *argc, const char ***argv, int frommain) snprintf(err_buf, sizeof err_buf, "hard links are not supported on this %s\n", am_server ? "server" : "client"); - rprintf(FERROR, "ERROR: %s", err_buf); return 0; } #endif @@ -682,13 +687,18 @@ int parse_arguments(int *argc, const char ***argv, int frommain) tmpdir = alloc_sanitize_path(tmpdir, curr_dir); if (compare_dest) compare_dest = alloc_sanitize_path(compare_dest, curr_dir); - fprintf(stderr, "compare_dest=`%s'\n", compare_dest); if (backup_dir) backup_dir = alloc_sanitize_path(backup_dir, curr_dir); if (files_from) files_from = alloc_sanitize_path(files_from, curr_dir); } + if (daemon_opt) { + daemon_opt = 0; + am_daemon = 1; + return 1; + } + if (!backup_suffix) backup_suffix = backup_dir ? "" : BACKUP_SUFFIX; backup_suffix_len = strlen(backup_suffix); @@ -708,9 +718,9 @@ int parse_arguments(int *argc, const char ***argv, int frommain) backup_dir_buf[backup_dir_len++] = '/'; backup_dir_buf[backup_dir_len] = '\0'; } - if (verbose > 1) + if (verbose > 1 && !am_sender) rprintf(FINFO, "backup_dir is %s\n", backup_dir_buf); - } else if (!backup_suffix_len) { + } else if (!backup_suffix_len && (!am_server || !am_sender)) { rprintf(FERROR, "--suffix cannot be a null string without --backup-dir\n"); exit_cleanup(RERR_SYNTAX); @@ -719,9 +729,15 @@ 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) { + if (*argc != 2 && !(am_server && am_sender && *argc == 1)) { usage(FERROR); exit_cleanup(RERR_SYNTAX); } @@ -751,9 +767,6 @@ int parse_arguments(int *argc, const char ***argv, int frommain) } } - if (daemon_opt) - am_daemon = 1; - return 1; } @@ -911,6 +924,12 @@ void server_options(char **args,int *argc) args[ac++] = arg; } + if (checksum_seed) { + if (asprintf(&arg, "--checksum-seed=%d", checksum_seed) < 0) + goto oom; + args[ac++] = arg; + } + if (keep_partial) args[ac++] = "--partial";