X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=backup%2Fbackuplib.pl;h=1163b5a0012be6b0ba157c55aa6ca4bc4a56e236;hb=6548c05b2f401d9d712acde8d0aff31388c0db70;hp=ba1c50be01467958ded1c00873c1753870c5466a;hpb=17fb3a3831ca812a3ad384f4eec3b977432facd9;p=chiark-utils.git diff --git a/backup/backuplib.pl b/backup/backuplib.pl index ba1c50b..1163b5a 100644 --- a/backup/backuplib.pl +++ b/backup/backuplib.pl @@ -23,6 +23,8 @@ require IO::File; +$nice='nice ' if !defined $nice; + sub printdate () { print scalar(localtime),"\n"; } @@ -51,6 +53,29 @@ sub startprocess ($$$) { exec $c; die "$c: $!"; } +sub rewind_raw () { + system "mt -f $tape rewind"; $? and die $?; +} + +sub readtapeid_raw () { + open T, ">>TAPEID" or die $!; close T; + unlink 'TAPEID' or die $!; + rewind_raw(); + system "mt -f $tape setblk $blocksizebytes"; $? and die $?; + system "dd if=$tape bs=${blocksize}b count=10 ". + "| tar -b$blocksize -vvxf - TAPEID"; +} + +sub writetapeid ($$) { + open T, ">TAPEID" or die $!; + print T "$_[0]\n$_[1]\n" or die $!; + close T or die $!; + + system "tar -b$blocksize -vvcf TAPEID.tar TAPEID"; $? and die $?; + system "dd if=TAPEID.tar of=$ntape bs=${blocksize}b count=10"; + $? and die $?; +} + sub endprocesses () { while (keys %processes) { $p= waitpid(-1,0) or die "wait: $!"; @@ -117,22 +142,47 @@ sub readfsys ($) { # Parse a line from a filesystem definition file. We expect the line # to be in $tf. sub parsefsys () { - if ($tf =~ m,^(/\S*)\s+(\w+)$,) { - # Line of form '/file/system dumptype' + my ($dopts,$dopt); + if ($tf =~ m#^(/\S*)\s+(\w+)([,=0-9a-z]*)$#) { + # Line of form '/file/system dumptype[,options]' $atf= $1; $tm= $2; + $dopts= $3; $prefix= ''; stat $atf or die "stat $atf: $!"; -d _ or die "not a dir: $atf"; $rstr= ''; - } elsif ($tf =~ m,^(/\S*)\s+(\w+)\s+(\w+)$,) { - # Line of form '/file/system dumptype prefix' - # (used for remote backups, I think) + } elsif ($tf =~ m#^(/\S*)\s+(\w+)([,=0-9a-z]*)\s+(\w+)$#) { + # Line of form '/file/system dumptype[,options] prefix' + # (used for remote backups) $atf= $1; $tm= $2; - $prefix= $3; + $dopts= $3; + $prefix= $4; defined($prefix{$prefix}) or die "prefix $prefix in $tf ?\n"; $rstr= $prefix{$prefix}.' '; + } else { + die "fsys $tf ?"; + } + undef %dopt; + foreach $dopt (split /\,/,$dopts) { + if (grep { $dopt eq $_ } qw(gz)) { + $dopt{$dopt}= 'y'; + } elsif ($dopt =~ m/\=/ && grep { $` eq $_ } qw(gz)) { + $dopt{$`}= $'; + } elsif (length $dopt) { + die "unknown option $dopt (in $dopts $tf)"; + } + } + + if ($dopt{'gz'} eq 'y') { + $gz= '1'; + } elsif ($dopt{'gz'} =~ m/^\d$/) { + $gz= $dopt{'gz'}; + } elsif (defined $dopt{'gz'}) { + die "$tf bad gz"; + } else { + $gz= 0; } }