#
#========================================================================
#
-# Version 2.1.0_CVS, released 8 Feb 2004.
+# Version 3.0.0alpha, released 23 Jan 2006.
#
# See http://backuppc.sourceforge.net.
#
$RsyncLibOK = 0;
$RsyncLibErr = "File::RsyncP module doesn't exist";
} else {
- if ( $File::RsyncP::VERSION < 0.44 ) {
+ #
+ # Note: also update configure.pl when this version number is changed!
+ #
+ if ( $File::RsyncP::VERSION < 0.52 ) {
$RsyncLibOK = 0;
- $RsyncLibErr = "File::RsyncP module version too old: need 0.44";
+ $RsyncLibErr = "File::RsyncP module version"
+ . " ($File::RsyncP::VERSION) too old: need 0.52";
} else {
$RsyncLibOK = 1;
}
} else {
#
# Turn $conf->{BackupFilesOnly} and $conf->{BackupFilesExclude}
- # into a hash of arrays of files.
+ # into a hash of arrays of files, and $conf->{RsyncShareName}
+ # to an array
#
- $conf->{RsyncShareName} = [ $conf->{RsyncShareName} ]
- unless ref($conf->{RsyncShareName}) eq "ARRAY";
- foreach my $param qw(BackupFilesOnly BackupFilesExclude) {
- next if ( !defined($conf->{$param}) );
- if ( ref($conf->{$param}) eq "ARRAY" ) {
- $conf->{$param} = {
- $conf->{RsyncShareName}[0] => $conf->{$param}
- };
- } elsif ( ref($conf->{$param}) eq "HASH" ) {
- # do nothing
- } else {
- $conf->{$param} = {
- $conf->{RsyncShareName}[0] => [ $conf->{$param} ]
- };
- }
- }
+ $bpc->backupFileConfFix($conf, "RsyncShareName");
+
if ( defined($conf->{BackupFilesOnly}{$t->{shareName}}) ) {
my(@inc, @exc, %incDone, %excDone);
foreach my $file ( @{$conf->{BackupFilesOnly}{$t->{shareName}}} ) {
}
}
if ( $t->{type} eq "full" ) {
- $logMsg = "full backup started for directory $t->{shareName}";
+ if ( $t->{partialNum} ) {
+ $logMsg = "full backup started for directory $t->{shareName};"
+ . " updating partial $t->{partialNum}";
+ } else {
+ $logMsg = "full backup started for directory $t->{shareName}";
+ }
} else {
$incrDate = $bpc->timeStamp($t->{lastFull} - 3600, 1);
$logMsg = "incr backup started back to $incrDate for directory"
$rsyncClientCmd = $conf->{RsyncClientCmd};
$argList = ['--server', '--sender', @$rsyncArgs,
'.', $t->{shareNameSlash}];
+ eval {
+ $argList = File::RsyncP->excludeStrip($argList);
+ };
$fioArgs = {
client => $t->{client},
share => $t->{shareName},
#
$t->{rsyncClientCmd} = $rsyncClientCmd;
$t->{rs} = File::RsyncP->new({
- logLevel => $conf->{RsyncLogLevel},
+ logLevel => $t->{logLevel} || $conf->{RsyncLogLevel},
rsyncCmd => sub {
$bpc->verbose(0);
$bpc->cmdExecOrEval($rsyncClientCmd, $args);
rsyncCmdType => "full",
rsyncArgs => $rsyncArgs,
timeout => $conf->{ClientTimeout},
- logHandler => sub {
- my($str) = @_;
- $str .= "\n";
- $t->{XferLOG}->write(\$str);
- },
+ doPartial => defined($t->{partialNum}) ? 1 : undef,
+ logHandler =>
+ sub {
+ my($str) = @_;
+ $str .= "\n";
+ $t->{XferLOG}->write(\$str);
+ if ( $str =~ /^Remote\[1\]: read errors mapping "(.*)"/ ) {
+ #
+ # Files with read errors (eg: region locked files
+ # on WinXX) are filled with 0 by rsync. Remember
+ # them and delete them later.
+ #
+ my $badFile = $1;
+ $badFile =~ s/^\/+//;
+ push(@{$t->{badFiles}}, {
+ share => $t->{shareName},
+ file => $badFile
+ });
+ }
+ },
pidHandler => sub {
$t->{pidHandler}(@_);
},
+ clientCharset => $conf->{ClientCharset},
fio => BackupPC::Xfer::RsyncFileIO->new({
xfer => $t,
bpc => $t->{bpc},
conf => $t->{conf},
backups => $t->{backups},
- logLevel => $conf->{RsyncLogLevel},
+ logLevel => $t->{logLevel}
+ || $conf->{RsyncLogLevel},
logHandler => sub {
my($str) = @_;
$str .= "\n";
$t->{XferLOG}->write(\$str);
},
+ cacheCheckProb => $conf->{RsyncCsumCacheVerifyProb},
+ clientCharset => $conf->{ClientCharset},
%$fioArgs,
}),
});
}
}
+sub abort
+{
+ my($t, $reason) = @_;
+ my $rs = $t->{rs};
+
+ $rs->abort($reason);
+ return 1;
+}
+
sub setSelectMask
{
my($t, $FDreadRef) = @_;