#
#========================================================================
#
-# Version 2.1.0, released 20 Jun 2004.
+# Version 3.0.0beta2, released 11 Nov 2006.
#
# See http://backuppc.sourceforge.net.
#
use vars qw( $RsyncLibOK );
use Carp;
+use Fcntl;
require Exporter;
use vars qw( @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS );
my($class, $file) = @_;
my $data;
- open(my $fh, "<", $file) || return -1;
+ sysopen(my $fh, $file, O_RDONLY) || return -1;
binmode($fh);
return -2 if ( sysread($fh, $data, 1) != 1 );
close($fh);
# Empty files don't get cached checksums.
#
# If verify is set then existing cached checksums are checked.
+# If verify == 2 then only a verify is done; no fixes are applied.
#
# Returns 0 on success. Returns 1 on good verify and 2 on bad verify.
# Returns a variety of negative values on error.
return -102 if ( !defined(my $fh = BackupPC::FileZIO->open($file, 0, 1)) );
+ my $fileSize;
while ( 1 ) {
$fh->read(\$data, $nBlks * $blockSize);
+ $fileSize += length($data);
last if ( $data eq "" );
$blockDigest .= $digest->blockDigest($data, $blockSize, 16,
$checksumSeed);
# length($metaData),
# $file,
# $eofPosn);
- open(my $fh2, "+<", $file) || return -103;
+ 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) ) {
#
# Checksums don't agree - fall through so we rewrite the data
#
- &$Log("digestAdd: $file verify failed; redoing checksums");
+ &$Log(sprintf("digestAdd: %s verify failed; redoing checksums; len = %d,%d; eofPosn = %d, fileSize = %d",
+ $file, length($data2), length($data3), $eofPosn, $fileSize));
+ #&$Log(sprintf("dataNew = %s", unpack("H*", $data2)));
+ #&$Log(sprintf("dataFile = %s", unpack("H*", $data3)));
return -109 if ( sysseek($fh2, $eofPosn, 0) != $eofPosn );
$retValue = 2;
+ return $retValue if ( $verify == 2 );
}
return -110 if ( syswrite($fh2, $data2) != length($data2) );
if ( $verify ) {
sysseek($fh2, 0, 1), $eofPosn + length($data2)));
return -112;
} else {
- &$Log(sprintf("digestAdd: $file truncated from %d to %d",
+ &$Log(sprintf("digestAdd: %s truncated from %d to %d",
+ $file,
sysseek($fh2, 0, 1), $eofPosn + length($data2)));
}
}
sub digestStart
{
my($class, $fileName, $fileSize, $blockSize, $defBlkSize,
- $checksumSeed, $needMD4, $compress, $doCache) = @_;
+ $checksumSeed, $needMD4, $compress, $doCache, $protocol_version) = @_;
return -1 if ( !$RsyncLibOK );
digest => File::RsyncP::Digest->new,
}, $class;
+ $dg->{digest}->protocol($protocol_version);
+
if ( $fileSize > 0 && $compress && $doCache >= 0 ) {
open(my $fh, "<", $fileName) || return -2;
binmode($fh);