5 (my $prog = $0) =~ s!^.*/!!;
7 die "usage: $prog ORIG COPY\n" unless @ARGV == 2;
8 my ($orig, $copy) = @ARGV;
10 open my $ofh, "<", $orig; binmode $ofh;
11 open my $cfh, "<", $copy; binmode $cfh;
14 my $ZERO = "\0" x $SECSZ;
19 print STDERR "$prog: $msg\n";
20 $rc = 2 unless $rc > 2;
32 $report .= ", " if $report;
33 if ($st eq 'copy') { $report .= "$prev .. $i"; }
34 elsif ($st eq 'zero') { $report .= "[$prev .. $i]"; }
35 else { $report .= "($st: $prev .. $i)"; }
37 $st = $newst; $prev = $i;
41 my $on = read $ofh, $obuf, $SECSZ;
42 my $cn = read $cfh, $cbuf, $SECSZ;
43 if ($on < $SECSZ || $cn < $SECSZ) {
45 if (!$cn) { bad "premature end at sector #$i in `$copy'"; }
46 else { bad "short sector #$i in `$copy'"; }
48 bad "continuation from sector #$i in `$copy'";
49 } elsif ($on == $cn) {
50 bad "final short sector #$i in both files" if $on;
51 if ($cbuf eq $obuf) { $newst = 'copy'; }
52 elsif ($cbuf eq "\0" x $on) { $newst = 'zero'; }
53 else { bad "corrupted short sector #$i in `$copy'"; }
55 bad "short sector #$i in both files"
61 if ($cbuf eq $obuf) { $newst = 'copy'; }
62 elsif ($cbuf eq $ZERO) { $newst = 'zero'; }
63 else { $newst = 'bogus'; }