X-Git-Url: http://git.rot13.org/?p=BackupPC.git;a=blobdiff_plain;f=lib%2FBackupPC%2FXfer%2FRsyncDigest.pm;h=584ad419c581dc9274262d71c568e064539f76f8;hp=b88168118765f9bfcb236c0a9fa9e6d330e8a910;hb=c2b072c9ad558447fb73fedf0cad170214b7d80e;hpb=b81d2da5e16975674f011e4833337ac0fa24e0ea diff --git a/lib/BackupPC/Xfer/RsyncDigest.pm b/lib/BackupPC/Xfer/RsyncDigest.pm index b881681..584ad41 100644 --- a/lib/BackupPC/Xfer/RsyncDigest.pm +++ b/lib/BackupPC/Xfer/RsyncDigest.pm @@ -29,7 +29,7 @@ # #======================================================================== # -# Version 3.0.0beta2, released 11 Nov 2006. +# Version 3.0.0, released 28 Jan 2007. # # See http://backuppc.sourceforge.net. # @@ -105,7 +105,7 @@ sub fileDigestIsCached binmode($fh); return -2 if ( sysread($fh, $data, 1) != 1 ); close($fh); - return $data eq chr(0xd6) ? 1 : 0; + return $data eq chr(0xd7) ? 1 : 0; } # @@ -121,7 +121,8 @@ sub fileDigestIsCached # sub digestAdd { - my($class, $file, $blockSize, $checksumSeed, $verify) = @_; + my($class, $file, $blockSize, $checksumSeed, $verify, + $protocol_version) = @_; my $retValue = 0; # @@ -140,6 +141,8 @@ sub digestAdd return -101 if ( !$RsyncLibOK ); my $digest = File::RsyncP::Digest->new; + $digest->protocol($protocol_version) + if ( defined($protocol_version) ); $digest->add(pack("V", $checksumSeed)) if ( $checksumSeed ); return -102 if ( !defined(my $fh = BackupPC::FileZIO->open($file, 0, 1)) ); @@ -171,7 +174,7 @@ sub digestAdd sysopen(my $fh2, $file, O_RDWR) || return -103; binmode($fh2); return -104 if ( sysread($fh2, $data, 1) != 1 ); - if ( $data ne chr(0x78) && $data ne chr(0xd6) ) { + if ( $data ne chr(0x78) && $data ne chr(0xd6) && $data ne chr(0xd7) ) { &$Log(sprintf("digestAdd: $file has unexpected first char 0x%x", ord($data))); return -105; @@ -183,7 +186,7 @@ sub digestAdd # # Verify the cached checksums # - return -107 if ( $data ne chr(0xd6) ); + return -107 if ( $data ne chr(0xd7) ); return -108 if ( sysread($fh2, $data3, length($data2) + 1) < 0 ); if ( $data2 eq $data3 ) { return 1; @@ -220,7 +223,7 @@ sub digestAdd } } return -113 if ( !defined(sysseek($fh2, 0, 0)) ); - return -114 if ( syswrite($fh2, chr(0xd6)) != 1 ); + return -114 if ( syswrite($fh2, chr(0xd7)) != 1 ); close($fh2); return $retValue; } @@ -244,7 +247,7 @@ sub digestAdd sub digestStart { my($class, $fileName, $fileSize, $blockSize, $defBlkSize, - $checksumSeed, $needMD4, $compress, $doCache) = @_; + $checksumSeed, $needMD4, $compress, $doCache, $protocol_version) = @_; return -1 if ( !$RsyncLibOK ); @@ -254,15 +257,19 @@ sub digestStart name => $fileName, needMD4 => $needMD4, digest => File::RsyncP::Digest->new, + protocol_version => $protocol_version, }, $class; + $dg->{digest}->protocol($dg->{protocol_version}) + if ( defined($dg->{protocol_version}) ); + if ( $fileSize > 0 && $compress && $doCache >= 0 ) { open(my $fh, "<", $fileName) || return -2; binmode($fh); return -3 if ( read($fh, $data, 1) != 1 ); my $ret; - if ( $data eq chr(0x78) && $doCache > 0 + if ( ($data eq chr(0x78) || $data eq chr(0xd6)) && $doCache > 0 && $checksumSeed == RSYNC_CSUMSEED_CACHE ) { # # RSYNC_CSUMSEED_CACHE (32761) is the magic number that @@ -280,7 +287,7 @@ sub digestStart $blockSize || BackupPC::Xfer::RsyncDigest->blockSize( $fileSize, $defBlkSize), - $checksumSeed); + $checksumSeed, 0, $dg->{protocol_version}); if ( $ret < 0 ) { &$Log("digestAdd($fileName) failed ($ret)"); } @@ -291,7 +298,7 @@ sub digestStart binmode($fh); return -5 if ( read($fh, $data, 1) != 1 ); } - if ( $ret >= 0 && $data eq chr(0xd6) ) { + if ( $ret >= 0 && $data eq chr(0xd7) ) { # # Looks like this file has cached checksums # Read the last 48 bytes: that's 2 file MD4s (32 bytes) @@ -341,6 +348,8 @@ sub digestStart return -9 if ( !defined($dg->{fh}) ); if ( $needMD4) { $dg->{csumDigest} = File::RsyncP::Digest->new; + $dg->{csumDigest}->protocol($dg->{protocol_version}) + if ( defined($dg->{protocol_version}) ); $dg->{csumDigest}->add(pack("V", $dg->{checksumSeed})); } } @@ -385,7 +394,13 @@ sub digestEnd if ( $dg->{cached} ) { close($dg->{fh}); - return $dg->{md4DigestOld} if ( $dg->{needMD4} ); + if ( $dg->{needMD4} ) { + if ( $dg->{protocol_version} <= 26 ) { + return $dg->{md4DigestOld}; + } else { + return $dg->{md4Digest}; + } + } } else { # # make sure we read the entire file for the file MD4 digest @@ -430,7 +445,7 @@ sub logHandler # sub logHandlerSet { - my($sub) = @_; + my($dg, $sub) = @_; $Log = $sub; }