From: lace <> Date: Wed, 22 Feb 2006 21:48:55 +0000 (+0000) Subject: Workarounded rewriting of '/dev/hda' with the contents of '/dev/hda1'. X-Git-Url: http://git.jankratochvil.net/?p=biosautoraid.git;a=commitdiff_plain;h=bde94578cf10408cdf51e0c42436db9f74e8ef72 Workarounded rewriting of '/dev/hda' with the contents of '/dev/hda1'. - The installation was not working in fact. --- diff --git a/biosautoraid.pl b/biosautoraid.pl index 3dd40cd..6d476f7 100755 --- a/biosautoraid.pl +++ b/biosautoraid.pl @@ -29,10 +29,10 @@ my $options_error=!GetOptions( "i|install" ,\$opt_install, "u|uninstall",\$opt_uninstall, ); -local *BIN; -open BIN,$bin_filename or die "open \"$bin_filename\": $!"; -my $bin=do { local $/; ; } or die "read \"$bin_filename\": $!"; -close BIN or die "close \"$bin_filename\": $!"; +my $BIN; +open $BIN,$bin_filename or die "open \"$bin_filename\": $!"; +my $bin=do { local $/; <$BIN>; } or die "read \"$bin_filename\": $!"; +close $BIN or die "close \"$bin_filename\": $!"; my $bin_len=length($bin); $bin_len>0 && !($bin_len%0x200) or die "Invalid length of \"$bin_filename\": $bin_len"; @@ -66,23 +66,66 @@ die "Type -i|--install or -u|--uninstall" if (!$opt_install die "Both -i|--install and -u|--uninstall forbidden together" if $opt_install && $opt_uninstall; @ARGV<=1 or die; -my $device_filename=$ARGV[0]; - -local *DEVICE; -open DEVICE,"+<".$device_filename or die "open \"$device_filename\": $!"; +my $master_filename=$ARGV[0]; +my $master_is_b=(-b $master_filename); +my $master_is_f=(-f $master_filename); +die "Invalid device file type: $master_filename" if !$master_is_b && !$master_is_f; +my $backup_filename; my $backup_offset=$BACKUP_SECTOR_START*0x200; +if ($master_is_f) { + $backup_filename=$master_filename; + } +if ($master_is_b) { + die "Filename is block device but it is unsupported: $master_filename" + if $master_filename!~m{^/dev/[hs]d[a-z]}; + $backup_filename=$master_filename."1"; + + sub hdparm_g_start_check($$) + { + my($filename,$start_expected)=@_; + + local *HDPARM; + my $cmdname="hdparm -g '$filename'|"; + open HDPARM,$cmdname or die "open \"$cmdname\": $!"; + my $HDPARM=do { local $/; ; } or die "read \"$cmdname\": $!"; + close HDPARM or die "close \"$cmdname\": $!"; + my($start)=($HDPARM=~/^\s*\Q$filename\E:\s*geometry\s*=.*,\s*start\s*=\s*(\d+)\s*$/s) + or die "Unparsable output of \"$cmdname\":\n$HDPARM"; + die "Unexpected 'start' parameter $start (expected $start_expected) of: $filename" + if $start!=$start_expected; + } + + hdparm_g_start_check($master_filename,0); + hdparm_g_start_check($backup_filename,$backup_offset/0x200); + $backup_offset=0; + } + +my $MASTER; +open $MASTER,"+<".$master_filename or die "open \"$master_filename\": $!"; -sysseek DEVICE,0,SEEK_SET or die "Error seeking $device_filename"; +# Do not write to the '/dev/hda' areas being mapped by: /dev/hda1 +# as reboot will rewrite '/dev/hda' with the contents of: /dev/hda1 +my $BACKUP; +if ($master_filename ne $backup_filename) { + open $BACKUP,"+<".$backup_filename or die "open \"$backup_filename\": $!"; + die if $backup_offset; + } +else { + $BACKUP=$MASTER; + die if !$backup_offset; + } + +sysseek $MASTER,0,SEEK_SET or die "Error seeking $master_filename"; my $master; -$bin_len==sysread DEVICE,$master,$bin_len or die "read \"$device_filename\": $!"; -length($master)==$bin_len or die "read \"$device_filename\": ".length($master)."!=$bin_len"; -signature $master,$device_filename,0x1FE,"55AA"; +$bin_len==sysread $MASTER,$master,$bin_len or die "read \"$master_filename\": $!"; +length($master)==$bin_len or die "read \"$master_filename\": ".length($master)."!=$bin_len"; +signature $master,$master_filename,0x1FE,"55AA"; -sysseek DEVICE,$backup_offset,SEEK_SET or die "Error seeking $device_filename"; +sysseek $BACKUP,$backup_offset,SEEK_SET or die "Error seeking $backup_filename"; my $backup; -$bin_len==sysread DEVICE,$backup,$bin_len or die "read \"$device_filename\": $!"; -length($backup)==$bin_len or die "read \"$device_filename\": ".length($backup)."!=$bin_len"; +$bin_len==sysread $BACKUP,$backup,$bin_len or die "read \"$backup_filename\": $!"; +length($backup)==$bin_len or die "read \"$backup_filename\": ".length($backup)."!=$bin_len"; my $zeroes="\x00"x$bin_len; die if length($zeroes)!=$bin_len; @@ -95,10 +138,10 @@ print "Already instaled? ".($installed ? "YES" : "NO")."\n"; die "Nothing to uninstall!\n" if $opt_uninstall && !$installed; if ($installed) { - signature $master,$device_filename,$bin_len-2,"BEEF","Different installed SECTOR_LEN?" if !$bin_short; - signature $master,$device_filename,0x03 ,unpack("H*","BIOSRAI"); - signature $master,$device_filename,0x43 ,"5E81A2".sprintf("%X",$BACKUP_SECTOR_START) if !$bin_short; - signature $backup,"backup",0x1FE,"55AA"; + signature $master,$master_filename,$bin_len-2,"BEEF","Different installed SECTOR_LEN?" if !$bin_short; + signature $master,$master_filename,0x03 ,unpack("H*","BIOSRAI"); + signature $master,$master_filename,0x43 ,"5E81A2".sprintf("%X",$BACKUP_SECTOR_START) if !$bin_short; + signature $backup,$backup_filename,0x1FE,"55AA"; } if ($opt_install) { if (!$installed) { @@ -114,20 +157,24 @@ if ($opt_install) { ); warn "WARNING: Dropping obsolete (but similiar) backup! Use --uninstall next time.\n"; } - sysseek DEVICE,$backup_offset,SEEK_SET or die "Error seeking $device_filename"; - $bin_len==syswrite DEVICE,$master or die "Error backing up the master"; + sysseek $BACKUP,$backup_offset,SEEK_SET or die "Error seeking $backup_filename"; + $bin_len==syswrite $BACKUP,$master or die "Error backing up the master"; } - sysseek DEVICE,0,SEEK_SET or die "Error seeking $device_filename"; - $bin_len==syswrite DEVICE,$bin or die "Error writing new master of BIOSautoRAID"; + sysseek $MASTER,0,SEEK_SET or die "Error seeking $master_filename"; + $bin_len==syswrite $MASTER,$bin or die "Error writing new master of BIOSautoRAID"; } if ($opt_uninstall) { - sysseek DEVICE,0,SEEK_SET or die "Error seeking $device_filename"; - $bin_len==syswrite DEVICE,$backup or die "Error writing backup back to the master"; - sysseek DEVICE,$backup_offset,SEEK_SET or die "Error seeking $device_filename"; - $bin_len==syswrite DEVICE,$zeroes or die "Error clearing the backup area"; + sysseek $MASTER,0,SEEK_SET or die "Error seeking $master_filename"; + $bin_len==syswrite $MASTER,$backup or die "Error writing backup back to the master"; + sysseek $BACKUP,$backup_offset,SEEK_SET or die "Error seeking $backup_filename"; + $bin_len==syswrite $BACKUP,$zeroes or die "Error clearing the backup area"; } -close DEVICE or die "close \"$device_filename\": $!"; +close $MASTER or die "close \"$master_filename\": $!"; +if ($master_filename ne $backup_filename) { + close $BACKUP or die "close \"$backup_filename\": $!"; + } +system("sync") and die "Error running: sync: $!"; print "OK; ".($opt_install ? ($installed ? "re" : "")."installed" : "uninstalled")."\n"; $all_ok=1;