X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/0e36d9da420af7c7e49bfd5e2c5aad712a85b633..5e252dea4b2d310dbbb3a57337199836aff8f086:/match.c diff --git a/match.c b/match.c index 7bf2cf4e..8470de0c 100644 --- a/match.c +++ b/match.c @@ -22,6 +22,7 @@ extern int verbose; extern int am_server; extern int do_progress; +extern int checksum_seed; typedef unsigned short tag; @@ -216,20 +217,13 @@ static void hash_search(int f,struct sum_struct *s, /* we've found a match, but now check to see * if last_i can hint at a better match */ - for (j++; j < s->count && targets[j].t == t; j++) { - size_t i2 = targets[j].i; - if (i2 == last_i + 1) { - if (sum != s->sums[i2].sum1) - break; - if (memcmp(sum2,s->sums[i2].sum2,s->s2length) != 0) - break; - /* we've found an adjacent match - the RLL coder - * will be happy */ - i = i2; - break; - } + if (i != last_i + 1 && last_i + 1 < s->count + && sum == s->sums[last_i+1].sum1 + && memcmp(sum2, s->sums[last_i+1].sum2, s->s2length) == 0) { + /* we've found an adjacent match - the RLL coder + * will be happy */ + i = last_i + 1; } - last_i = i; matched(f,s,buf,offset,i); @@ -299,7 +293,7 @@ void match_sums(int f, struct sum_struct *s, struct map_struct *buf, OFF_T len) matches = 0; data_transfer = 0; - sum_init(); + sum_init(checksum_seed); if (len > 0 && s->count>0) { build_hash_table(s); @@ -322,6 +316,9 @@ void match_sums(int f, struct sum_struct *s, struct map_struct *buf, OFF_T len) } sum_end(file_sum); + /* If we had a read error, send a bad checksum. */ + if (buf && buf->status != 0) + file_sum[0]++; if (verbose > 2) rprintf(FINFO,"sending file_sum\n");