X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/d9bea2ddd44fdcfbaf6f153f72d944603560036c..1aa71c8d5784c131688c57ff8d3c683a02f43d0c:/match.c diff --git a/match.c b/match.c index ee22ca3e..33fc6e16 100644 --- a/match.c +++ b/match.c @@ -19,9 +19,13 @@ #include "rsync.h" +extern int csum_length; + extern int verbose; extern int am_server; +extern int remote_version; + typedef unsigned short tag; #define TABLESIZE (1<<16) @@ -83,72 +87,76 @@ static void build_hash_table(struct sum_struct *s) } - static off_t last_match; -static void matched(int f,struct sum_struct *s,char *buf,off_t len, +static void matched(int f,struct sum_struct *s,struct map_struct *buf, int offset,int i) { int n = offset - last_match; - + int j; + if (verbose > 2) if (i != -1) - fprintf(stderr,"match at %d last_match=%d j=%d len=%d n=%d\n", + fprintf(FERROR,"match at %d last_match=%d j=%d len=%d n=%d\n", (int)offset,(int)last_match,i,(int)s->sums[i].len,n); - if (n > 0) { - int l = 0; - write_int(f,n); - while (l < n) { - int n1 = MIN(WRITE_BLOCK_SIZE,n-l); - write_buf(f,map_ptr(buf,last_match+l,n1),n1); - l += n1; - } - data_transfer += n; + send_token(f,i,buf,last_match,n,i==-1?0:s->sums[i].len); + data_transfer += n; + + if (n > 0) + write_flush(f); + + if (i != -1) + n += s->sums[i].len; + + for (j=0;jsums[i].len; - if (n > 0) - write_flush(f); + } -static void hash_search(int f,struct sum_struct *s,char *buf,off_t len) +static void hash_search(int f,struct sum_struct *s, + struct map_struct *buf,off_t len) { int offset,j,k; int end; char sum2[SUM_LENGTH]; uint32 s1, s2, sum; - char *map; + signed char *map; if (verbose > 2) - fprintf(stderr,"hash search b=%d len=%d\n",s->n,(int)len); + fprintf(FERROR,"hash search b=%d len=%d\n",s->n,(int)len); k = MIN(len, s->n); - map = map_ptr(buf,0,k); + map = (signed char *)map_ptr(buf,0,k); - sum = get_checksum1(map, k); + sum = get_checksum1((char *)map, k); s1 = sum & 0xFFFF; s2 = sum >> 16; if (verbose > 3) - fprintf(stderr, "sum=%.8x k=%d\n", sum, k); + fprintf(FERROR, "sum=%.8x k=%d\n", sum, k); offset = 0; end = len + 1 - s->sums[s->count-1].len; if (verbose > 3) - fprintf(stderr,"hash search s->n=%d len=%d count=%d\n", + fprintf(FERROR,"hash search s->n=%d len=%d count=%d\n", s->n,(int)len,s->count); do { tag t = gettag2(s1,s2); j = tag_table[t]; if (verbose > 4) - fprintf(stderr,"offset=%d sum=%08x\n", + fprintf(FERROR,"offset=%d sum=%08x\n", offset,sum); if (j != NULL_TAG) { @@ -161,21 +169,21 @@ static void hash_search(int f,struct sum_struct *s,char *buf,off_t len) if (sum == s->sums[i].sum1) { if (verbose > 3) - fprintf(stderr,"potential match at %d target=%d %d sum=%08x\n", + fprintf(FERROR,"potential match at %d target=%d %d sum=%08x\n", offset,j,i,sum); if (!done_csum2) { int l = MIN(s->n,len-offset); - map = map_ptr(buf,offset,l); - get_checksum2(map,l,sum2); + map = (signed char *)map_ptr(buf,offset,l); + get_checksum2((char *)map,l,sum2); done_csum2 = 1; } - if (memcmp(sum2,s->sums[i].sum2,SUM_LENGTH) == 0) { - matched(f,s,buf,len,offset,i); + if (memcmp(sum2,s->sums[i].sum2,csum_length) == 0) { + matched(f,s,buf,offset,i); offset += s->sums[i].len - 1; k = MIN((len-offset), s->n); - map = map_ptr(buf,offset,k); - sum = get_checksum1(map, k); + map = (signed char *)map_ptr(buf,offset,k); + sum = get_checksum1((char *)map, k); s1 = sum & 0xFFFF; s2 = sum >> 16; ++matches; @@ -189,13 +197,13 @@ static void hash_search(int f,struct sum_struct *s,char *buf,off_t len) } /* Trim off the first byte from the checksum */ - map = map_ptr(buf,offset,k+1); - s1 -= map[0]; - s2 -= k * map[0]; + map = (signed char *)map_ptr(buf,offset,k+1); + s1 -= map[0] + CHAR_OFFSET; + s2 -= k * (map[0]+CHAR_OFFSET); /* Add on the next byte (if there is one) to the checksum */ if (k < (len-offset)) { - s1 += map[k]; + s1 += (map[k]+CHAR_OFFSET); s2 += s1; } else { --k; @@ -203,30 +211,43 @@ static void hash_search(int f,struct sum_struct *s,char *buf,off_t len) } while (++offset < end); - matched(f,s,buf,len,len,-1); + matched(f,s,buf,len,-1); + map_ptr(buf,len-1,1); } -void match_sums(int f,struct sum_struct *s,char *buf,off_t len) +void match_sums(int f,struct sum_struct *s,struct map_struct *buf,off_t len) { + char file_sum[MD4_SUM_LENGTH]; + last_match = 0; false_alarms = 0; tag_hits = 0; matches=0; data_transfer=0; + sum_init(); + if (len > 0 && s->count>0) { build_hash_table(s); if (verbose > 2) - fprintf(stderr,"built hash table\n"); + fprintf(FERROR,"built hash table\n"); hash_search(f,s,buf,len); if (verbose > 2) - fprintf(stderr,"done hash search\n"); + fprintf(FERROR,"done hash search\n"); } else { - matched(f,s,buf,len,len,-1); + matched(f,s,buf,len,-1); + } + + sum_end(file_sum); + + if (remote_version >= 14) { + if (verbose > 2) + fprintf(FERROR,"sending file_sum\n"); + write_buf(f,file_sum,MD4_SUM_LENGTH); } if (targets) { @@ -235,7 +256,7 @@ void match_sums(int f,struct sum_struct *s,char *buf,off_t len) } if (verbose > 2) - fprintf(stderr, "false_alarms=%d tag_hits=%d matches=%d\n", + fprintf(FERROR, "false_alarms=%d tag_hits=%d matches=%d\n", false_alarms, tag_hits, matches); total_tag_hits += tag_hits; @@ -249,7 +270,7 @@ void match_report(void) if (verbose <= 1) return; - fprintf(am_server?stderr:stdout, + fprintf(FINFO, "total: matches=%d tag_hits=%d false_alarms=%d data=%d\n", total_matches,total_tag_hits, total_false_alarms,total_data_transfer);