#!/usr/bin/perl use strict; use warnings; use IO::Handle; $|=1; my ($disksize,$disk,$filename,$pos,$posbad); $disk=$ARGV[0]; if (!defined $disk || ! -b $disk) { print "$0 /dev/partition [startpos] [blocksize in ko] ddrs takes the last component of the partition name as a result filename, if this does not suit you, make a symlink "; exit 0; } $pos=0; my $skipsize=1024; if (defined $ARGV[1]) { $pos=$ARGV[1]; } if (defined $ARGV[2]) { $skipsize=$ARGV[2]; } $disk =~ m#/dev/(.*)#; $filename=$1; $disksize=`fdisk -s $disk`; $posbad=0; print "$disk $filename $disksize\n"; while ($pos < $disksize) { my $out; print "-$pos\n"; $out=`dd_rescue -e 1 -b 512 -B 512 -l $filename.log $disk $filename -s $pos.0k 2>&1`; # if ($out =~ /ipos:\s+(\d+)\.0k/ms) { if ($out =~ /\s\((\d+)\.0k\): Input\/output error!/ms) { $pos=$1+$skipsize; } else { print "no ipos found, exiting\n"; exit 1; } #print "got $pos\n"; #print $out; flush STDOUT; $out=`dd_rescue -e 1 -b 512 -B 512 -l $filename.log $disk $filename -s $pos.0k -r 2>&1`; # if ($out =~ /ipos:\s+(\d+)\.0k/ms) { if ($out =~ /\s\((\d+)\.0k\): Input\/output error!/ms) { print "$1"; } else { print "X"; } flush STDOUT; }