#
#========================================================================
#
-# Version 2.1.0_CVS, released 3 Jul 2003.
+# Version 2.1.0_CVS, released 13 Mar 2004.
#
# See http://backuppc.sourceforge.net.
#
use Socket;
use Cwd;
use Digest::MD5;
+use Config;
sub new
{
num startTime endTime result errorMsg nFiles size
tarCreateErrs xferErrs
)],
+ ArchiveFields => [qw(
+ num startTime endTime result errorMsg
+ )],
}, $class;
$bpc->{BinDir} .= "/bin";
$bpc->{LibDir} .= "/lib";
if ( !$noUserCheck
&& $bpc->{Conf}{BackupPCUserVerify}
&& $> != (my $uid = (getpwnam($bpc->{Conf}{BackupPCUser}))[2]) ) {
- print("Wrong user: my userid is $>, instead of $uid"
+ print(STDERR "Wrong user: my userid is $>, instead of $uid"
. " ($bpc->{Conf}{BackupPCUser})\n");
return;
}
return $bpc->{verbose};
}
+sub sigName2num
+{
+ my($bpc, $sig) = @_;
+
+ if ( !defined($bpc->{SigName2Num}) ) {
+ my $i = 0;
+ foreach my $name ( split(' ', $Config{sig_name}) ) {
+ $bpc->{SigName2Num}{$name} = $i;
+ $i++;
+ }
+ }
+ return $bpc->{SigName2Num}{$sig};
+}
+
#
# Generate an ISO 8601 format timeStamp (but without the "T").
# See http://www.w3.org/TR/NOTE-datetime and
close(LOCK);
}
+sub ArchiveInfoRead
+{
+ my($bpc, $host) = @_;
+ local(*ARCHIVE_INFO, *LOCK);
+ my(@Archives);
+
+ flock(LOCK, LOCK_EX) if open(LOCK, "$bpc->{TopDir}/pc/$host/LOCK");
+ if ( open(ARCHIVE_INFO, "$bpc->{TopDir}/pc/$host/archives") ) {
+ binmode(ARCHIVE_INFO);
+ while ( <ARCHIVE_INFO> ) {
+ s/[\n\r]+//;
+ next if ( !/^(\d+.*)/ );
+ $_ = $1;
+ @{$Archives[@Archives]}{@{$bpc->{ArchiveFields}}} = split(/\t/);
+ }
+ close(ARCHIVE_INFO);
+ }
+ close(LOCK);
+ return @Archives;
+}
+
+sub ArchiveInfoWrite
+{
+ my($bpc, $host, @Archives) = @_;
+ local(*ARCHIVE_INFO, *LOCK);
+ my($i);
+
+ flock(LOCK, LOCK_EX) if open(LOCK, "$bpc->{TopDir}/pc/$host/LOCK");
+ unlink("$bpc->{TopDir}/pc/$host/archives.old")
+ if ( -f "$bpc->{TopDir}/pc/$host/archives.old" );
+ rename("$bpc->{TopDir}/pc/$host/archives",
+ "$bpc->{TopDir}/pc/$host/archives.old")
+ if ( -f "$bpc->{TopDir}/pc/$host/archives" );
+ if ( open(ARCHIVE_INFO, ">$bpc->{TopDir}/pc/$host/archives") ) {
+ binmode(ARCHIVE_INFO);
+ for ( $i = 0 ; $i < @Archives ; $i++ ) {
+ my %b = %{$Archives[$i]};
+ printf(ARCHIVE_INFO "%s\n",
+ join("\t", @b{@{$bpc->{ArchiveFields}}}));
+ }
+ close(ARCHIVE_INFO);
+ }
+ close(LOCK);
+}
+
sub ConfigRead
{
my($bpc, $host) = @_;
if ( defined($roots) && length($roots) ) {
$roots = [$roots] unless ref $roots;
} else {
- print "RmTreeQuiet: No root path(s) specified\n";
+ print(STDERR "RmTreeQuiet: No root path(s) specified\n");
}
chdir($pwd);
foreach $root (@{$roots}) {
#
if ( !unlink($root) ) {
if ( -d $root ) {
- my $d = DirHandle->new($root)
- or print "Can't read $pwd/$root: $!";
- @files = $d->read;
- $d->close;
- @files = grep $_!~/^\.{1,2}$/, @files;
- $bpc->RmTreeQuiet("$pwd/$root", \@files);
- chdir($pwd);
- rmdir($root) || rmdir($root);
+ my $d = DirHandle->new($root);
+ if ( !defined($d) ) {
+ print(STDERR "Can't read $pwd/$root: $!\n");
+ } else {
+ @files = $d->read;
+ $d->close;
+ @files = grep $_!~/^\.{1,2}$/, @files;
+ $bpc->RmTreeQuiet("$pwd/$root", \@files);
+ chdir($pwd);
+ rmdir($root) || rmdir($root);
+ }
} else {
unlink($root) || unlink($root);
}
return -2 if ( !defined($rawFile = $bpc->MD52Path($d, $compress)) );
$rawFile .= "_$i" if ( $i >= 0 );
if ( -f $rawFile ) {
- if ( !compare($name, $rawFile) ) {
+ if ( (stat(_))[3] < $bpc->{Conf}{HardLinkMax}
+ && !compare($name, $rawFile) ) {
unlink($name);
return -3 if ( !link($rawFile, $name) );
return 1;
print(STDERR "cmdExecOrEval: about to exec ",
$bpc->execCmd2ShellCmd(@$cmd), "\n")
if ( $bpc->{verbose} );
- exec(map { m/(.*)/ } @$cmd); # untaint
+ alarm(0);
+ $cmd = [map { m/(.*)/ } @$cmd]; # untaint
+ #
+ # force list-form of exec(), ie: no shell even for 1 arg
+ #
+ exec { $cmd->[0] } @$cmd;
print(STDERR "Exec failed for @$cmd\n");
exit(1);
}
#
close(STDERR);
open(STDERR, ">&STDOUT");
- exec(map { m/(.*)/ } @$cmd); # untaint
- print("Exec of @$cmd failed\n");
+ alarm(0);
+ $cmd = [map { m/(.*)/ } @$cmd]; # untaint
+ #
+ # force list-form of exec(), ie: no shell even for 1 arg
+ #
+ exec { $cmd->[0] } @$cmd;
+ print(STDERR "Exec of @$cmd failed\n");
exit(1);
}
#