X-Git-Url: http://git.rot13.org/?p=BackupPC.git;a=blobdiff_plain;f=lib%2FBackupPC%2FLib.pm;h=5ad2770d166ec2190980a7fb00c1c5ca52553e6a;hp=560a6802432e78630242214923391542f66a9b3f;hb=e951f787a66c5bd9e9955c3f657a5b44289c0fe1;hpb=79e0593c501fd58046feeca20c315cc4ac283435 diff --git a/lib/BackupPC/Lib.pm b/lib/BackupPC/Lib.pm index 560a680..5ad2770 100644 --- a/lib/BackupPC/Lib.pm +++ b/lib/BackupPC/Lib.pm @@ -29,7 +29,7 @@ # #======================================================================== # -# Version 2.1.0beta2, released 23 May 2004. +# Version 2.1.0, released 20 Jun 2004. # # See http://backuppc.sourceforge.net. # @@ -59,7 +59,7 @@ sub new TopDir => $topDir || '/data/BackupPC', BinDir => $installDir || '/usr/local/BackupPC', LibDir => $installDir || '/usr/local/BackupPC', - Version => '2.1.0beta2', + Version => '2.1.0', BackupFields => [qw( num type startTime endTime nFiles size nFilesExist sizeExist nFilesNew sizeNew @@ -220,11 +220,13 @@ sub BackupInfoWrite my($i); flock(LOCK, LOCK_EX) if open(LOCK, "$bpc->{TopDir}/pc/$host/LOCK"); - unlink("$bpc->{TopDir}/pc/$host/backups.old") - if ( -f "$bpc->{TopDir}/pc/$host/backups.old" ); - rename("$bpc->{TopDir}/pc/$host/backups", - "$bpc->{TopDir}/pc/$host/backups.old") - if ( -f "$bpc->{TopDir}/pc/$host/backups" ); + if ( -s "$bpc->{TopDir}/pc/$host/backups" ) { + unlink("$bpc->{TopDir}/pc/$host/backups.old") + if ( -f "$bpc->{TopDir}/pc/$host/backups.old" ); + rename("$bpc->{TopDir}/pc/$host/backups", + "$bpc->{TopDir}/pc/$host/backups.old") + if ( -f "$bpc->{TopDir}/pc/$host/backups" ); + } if ( open(BK_INFO, ">$bpc->{TopDir}/pc/$host/backups") ) { binmode(BK_INFO); for ( $i = 0 ; $i < @Backups ; $i++ ) { @@ -264,11 +266,13 @@ sub RestoreInfoWrite my($i); flock(LOCK, LOCK_EX) if open(LOCK, "$bpc->{TopDir}/pc/$host/LOCK"); - unlink("$bpc->{TopDir}/pc/$host/restores.old") - if ( -f "$bpc->{TopDir}/pc/$host/restores.old" ); - rename("$bpc->{TopDir}/pc/$host/restores", - "$bpc->{TopDir}/pc/$host/restores.old") - if ( -f "$bpc->{TopDir}/pc/$host/restores" ); + if ( -s "$bpc->{TopDir}/pc/$host/restores" ) { + unlink("$bpc->{TopDir}/pc/$host/restores.old") + if ( -f "$bpc->{TopDir}/pc/$host/restores.old" ); + rename("$bpc->{TopDir}/pc/$host/restores", + "$bpc->{TopDir}/pc/$host/restores.old") + if ( -f "$bpc->{TopDir}/pc/$host/restores" ); + } if ( open(RESTORE_INFO, ">$bpc->{TopDir}/pc/$host/restores") ) { binmode(RESTORE_INFO); for ( $i = 0 ; $i < @Restores ; $i++ ) { @@ -309,11 +313,13 @@ sub ArchiveInfoWrite 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 ( -s "$bpc->{TopDir}/pc/$host/archives" ) { + 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++ ) { @@ -1137,9 +1143,9 @@ sub cmdExecOrEval # # Also, $? should be set when the CHILD pipe is closed. # -sub cmdSystemOrEval +sub cmdSystemOrEvalLong { - my($bpc, $cmd, $stdoutCB, @args) = @_; + my($bpc, $cmd, $stdoutCB, $ignoreStderr, $pidHandlerCB, @args) = @_; my($pid, $out, $allOut); local(*CHILD); @@ -1173,7 +1179,11 @@ sub cmdSystemOrEval # This is the child # close(STDERR); - open(STDERR, ">&STDOUT"); + if ( $ignoreStderr ) { + open(STDERR, ">", "/dev/null"); + } else { + open(STDERR, ">&STDOUT"); + } alarm(0); $cmd = [map { m/(.*)/ } @$cmd]; # untaint # @@ -1183,6 +1193,12 @@ sub cmdSystemOrEval print(STDERR "Exec of @$cmd failed\n"); exit(1); } + + # + # Notify caller of child's pid + # + &$pidHandlerCB($pid) if ( ref($pidHandlerCB) eq "CODE" ); + # # The parent gathers the output from the child # @@ -1200,6 +1216,18 @@ sub cmdSystemOrEval return $out; } +# +# The shorter version that sets $ignoreStderr = 0, ie: merges stdout +# and stderr together. +# +sub cmdSystemOrEval +{ + my($bpc, $cmd, $stdoutCB, @args) = @_; + + return $bpc->cmdSystemOrEvalLong($cmd, $stdoutCB, 0, undef, @args); +} + + # # Promotes $conf->{BackupFilesOnly}, $conf->{BackupFilesExclude} # to hashes and $conf->{$shareName} to an array