rolling checksum code. The result is that rsync worked much more
slowly when going between two machines where one of the machines uses
signed and the other unsigned chars. The rolling checksum rarely
matched so effectively a copy was done in many cases. The data always
came through correctly so no file corruption occurred but it's pretty
pointless using rsync if it doesn't speed things up!
I've now made the sign of the chars explicit
a simple 32 bit checksum that can be upadted from either end
(inspired by Mark Adler's Adler-32 checksum)
*/
a simple 32 bit checksum that can be upadted from either end
(inspired by Mark Adler's Adler-32 checksum)
*/
-uint32 get_checksum1(char *buf,int len)
+uint32 get_checksum1(char *buf1,int len)
+ signed char *buf = (signed char *)buf1;
s1 = s2 = 0;
for (i = 0; i < (len-4); i+=4) {
s1 = s2 = 0;
for (i = 0; i < (len-4); i+=4) {
int end;
char sum2[SUM_LENGTH];
uint32 s1, s2, sum;
int end;
char sum2[SUM_LENGTH];
uint32 s1, s2, sum;
if (verbose > 2)
fprintf(FERROR,"hash search b=%d len=%d\n",s->n,(int)len);
k = MIN(len, s->n);
if (verbose > 2)
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)
s1 = sum & 0xFFFF;
s2 = sum >> 16;
if (verbose > 3)
if (!done_csum2) {
int l = MIN(s->n,len-offset);
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,csum_length) == 0) {
matched(f,s,buf,len,offset,i);
offset += s->sums[i].len - 1;
k = MIN((len-offset), s->n);
done_csum2 = 1;
}
if (memcmp(sum2,s->sums[i].sum2,csum_length) == 0) {
matched(f,s,buf,len,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;
s1 = sum & 0xFFFF;
s2 = sum >> 16;
++matches;
}
/* Trim off the first byte from the checksum */
}
/* Trim off the first byte from the checksum */
- map = map_ptr(buf,offset,k+1);
+ map = (signed char *)map_ptr(buf,offset,k+1);
s1 -= map[0] + CHAR_OFFSET;
s2 -= k * (map[0]+CHAR_OFFSET);
s1 -= map[0] + CHAR_OFFSET;
s2 -= k * (map[0]+CHAR_OFFSET);