X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-utils.git;a=blobdiff_plain;f=backup%2Fbackuplib.pl;h=174dc812c9678320c53328e31c0ea0d50a05cfd0;hp=1163b5a0012be6b0ba157c55aa6ca4bc4a56e236;hb=856172213e27f81e1d3a1a3d5585dd21c706bf90;hpb=6548c05b2f401d9d712acde8d0aff31388c0db70 diff --git a/backup/backuplib.pl b/backup/backuplib.pl index 1163b5a..174dc81 100644 --- a/backup/backuplib.pl +++ b/backup/backuplib.pl @@ -54,7 +54,7 @@ sub startprocess ($$$) { } sub rewind_raw () { - system "mt -f $tape rewind"; $? and die $?; + runsystem("mt -f $tape rewind"); } sub readtapeid_raw () { @@ -66,11 +66,34 @@ sub readtapeid_raw () { "| tar -b$blocksize -vvxf - TAPEID"; } +sub runsystem ($) { + pboth(" $_[0]\n"); + system $_[0]; + $? and die $?; +} + +sub pboth ($) { + my ($str) = @_; + print LOG $str or die $!; + print $str or die $!; +} + +sub nexttapefile ($) { + my ($what) = @_; + $currenttapefilenumber++; + $currenttapefilename= $what; + pboth(sprintf "writing tape file #%d (mt fsf %d): %s\n", + $currenttapefilenumber, $currenttapefilenumber-1, $what); +} + sub writetapeid ($$) { open T, ">TAPEID" or die $!; print T "$_[0]\n$_[1]\n" or die $!; close T or die $!; + $currenttapefilenumber= 0; + nexttapefile('TAPEID'); + system "tar -b$blocksize -vvcf TAPEID.tar TAPEID"; $? and die $?; system "dd if=TAPEID.tar of=$ntape bs=${blocksize}b count=10"; $? and die $?; @@ -84,8 +107,7 @@ sub endprocesses () { delete $processes{$p}; $? && die "error: command gave code $?: $c\n"; } - print LOG " ok\n" or die $!; - print " ok\n" or die $!; + pboth(" ok\n"); } sub killprocesses { @@ -144,26 +166,31 @@ sub readfsys ($) { sub parsefsys () { my ($dopts,$dopt); if ($tf =~ m#^(/\S*)\s+(\w+)([,=0-9a-z]*)$#) { - # Line of form '/file/system dumptype[,options]' + # Line of form '[/device:]/file/system dumptype[,options]' $atf= $1; $tm= $2; $dopts= $3; $prefix= ''; + $pcstr= ''; stat $atf or die "stat $atf: $!"; -d _ or die "not a dir: $atf"; $rstr= ''; } elsif ($tf =~ m#^(/\S*)\s+(\w+)([,=0-9a-z]*)\s+(\w+)$#) { - # Line of form '/file/system dumptype[,options] prefix' + # Line of form '[/device:]/file/system dumptype[,options] prefix' # (used for remote backups) $atf= $1; $tm= $2; $dopts= $3; $prefix= $4; + $pcstr= "$prefix:"; defined($prefix{$prefix}) or die "prefix $prefix in $tf ?\n"; $rstr= $prefix{$prefix}.' '; } else { die "fsys $tf ?"; } + + $dev = $atf =~ s,^(.*)\:,, ? $1 : ''; + undef %dopt; foreach $dopt (split /\,/,$dopts) { if (grep { $dopt eq $_ } qw(gz)) { @@ -175,14 +202,17 @@ sub parsefsys () { } } - 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; + my ($gzo); + foreach $gzo (qw(gz gzi)) { + if ($dopt{$gzo} eq 'y') { + $$gzo= '1'; + } elsif ($dopt{$gzo} =~ m/^\d$/) { + $$gzo= $dopt{$gzo}; + } elsif (defined $dopt{$gzo}) { + die "$tf bad $gzo"; + } else { + $$gzo= ''; + } } }