From bceec82f357618356fd209578dfccbbd6b52efba Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Tue, 19 Mar 2002 03:39:42 +0000 Subject: [PATCH] Previous solution for --no-whole-file would probably break when connecting to old servers that don't have --no-whole-file. Instead, we handle no_whole_file and whole_file separately, without the magic -1 value. We don't modify no_whole_file after initialization. --- generator.c | 38 ++++++++++++++++++++++++++++++++++---- main.c | 6 ------ options.c | 17 ++++++++--------- 3 files changed, 42 insertions(+), 19 deletions(-) diff --git a/generator.c b/generator.c index bdd27bc2..da2feac1 100644 --- a/generator.c +++ b/generator.c @@ -32,7 +32,6 @@ extern int preserve_devices; extern int preserve_hard_links; extern int update_only; extern int opt_ignore_existing; -extern int whole_file; extern int block_size; extern int csum_length; extern int ignore_times; @@ -127,6 +126,39 @@ static void send_sums(struct sum_struct *s, int f_out) } } + +/** + * Perhaps we want to just send an empty checksum set for this file, + * which will force the whole thing to be literally transferred. + * + * When do we do this? If the user's explicitly said they + * want the whole thing, or if { they haven't explicitly + * requested a delta, and it's local but not batch mode.} + * + * Whew. */ +static BOOL disable_deltas_p(void) +{ + extern int whole_file, no_whole_file; + extern int local_server; + extern int write_batch; + + assert(whole_file == 0 || whole_file == 1); + + /* OK, we don't explicitly handle both whole_file and + * no_whole_file; perhaps somebody will care to add an + * error. */ + + if (whole_file) + return True; + else if (no_whole_file) + return False; + else if (write_batch) + return False; + else + return local_server; +} + + /* generate a stream of signatures/checksums that describe a buffer @@ -403,9 +435,7 @@ void recv_generator(char *fname,struct file_list *flist,int i,int f_out) return; } - assert(whole_file == 0 || whole_file == 1); - /* We should have decided by now. */ - if (whole_file) { + if (disable_deltas_p()) { write_int(f_out,i); send_sums(NULL,f_out); return; diff --git a/main.c b/main.c index 74d205f0..f723da4e 100644 --- a/main.c +++ b/main.c @@ -716,12 +716,6 @@ static int start_client(int argc, char *argv[]) p = find_colon(argv[argc-1]); if (!p) { local_server = 1; - /* - * disable "rsync algorithm" when both sides local, - * except when creating a batch update - */ - if (!write_batch && whole_file == -1) - whole_file = 1; } else if (p[1] == ':') { *p = 0; return start_socket_client(argv[argc-1], p+2, argc-1, argv); diff --git a/options.c b/options.c index 7bb8e153..fe7ff413 100644 --- a/options.c +++ b/options.c @@ -30,9 +30,11 @@ int make_backups = 0; * because there it's no cheaper to read the whole basis file than to * just rewrite it. * - * -1 means "unspecified", i.e. depend on is_local; 0 means off; 1 means on. + * If both are 0, then look at whether we're local or remote and go by + * that. **/ -int whole_file = -1; +int whole_file = 0; +int no_whole_file = 0; int copy_links = 0; int preserve_links = 0; @@ -310,7 +312,7 @@ static struct poptOption long_options[] = { {"links", 'l', POPT_ARG_NONE, &preserve_links}, {"copy-links", 'L', POPT_ARG_NONE, ©_links}, {"whole-file", 'W', POPT_ARG_NONE, &whole_file}, - {"no-whole-file", 0, POPT_ARG_NONE, 0, OPT_NO_WHOLE_FILE}, + {"no-whole-file", 0, POPT_ARG_NONE, &no_whole_file}, {"copy-unsafe-links", 0, POPT_ARG_NONE, ©_unsafe_links}, {"perms", 'p', POPT_ARG_NONE, &preserve_perms}, {"owner", 'o', POPT_ARG_NONE, &preserve_uid}, @@ -474,10 +476,6 @@ int parse_arguments(int *argc, const char ***argv, int frommain) add_exclude_file(poptGetOptArg(pc), 1, 1); break; - case OPT_NO_WHOLE_FILE: - whole_file = 0; - break; - case OPT_NO_BLOCKING_IO: blocking_io = 0; break; @@ -601,8 +599,6 @@ void server_options(char **args,int *argc) int i, x; - if (whole_file == -1) - whole_file = 0; if (blocking_io == -1) blocking_io = 0; @@ -631,6 +627,9 @@ void server_options(char **args,int *argc) assert(whole_file == 0 || whole_file == -1); if (whole_file) argstr[x++] = 'W'; + /* We don't need to send --no-whole-file, because it's the + * default for remote transfers, and in any case old versions + * of rsync will not understand it. */ if (preserve_hard_links) argstr[x++] = 'H'; -- 2.34.1