diff options
author | Pascal Rigaux <pixel@mandriva.com> | 2005-05-19 08:59:54 +0000 |
---|---|---|
committer | Pascal Rigaux <pixel@mandriva.com> | 2005-05-19 08:59:54 +0000 |
commit | e996d2f2ae7e6c8e82d78da45fef6749ca6ba2b2 (patch) | |
tree | 4e70feaace6bb55f62f9412ba1a206d323d5b154 /rescue | |
parent | 0502cdfe87e81175cd2e1900761082e791be3b82 (diff) | |
download | drakx-e996d2f2ae7e6c8e82d78da45fef6749ca6ba2b2.tar drakx-e996d2f2ae7e6c8e82d78da45fef6749ca6ba2b2.tar.gz drakx-e996d2f2ae7e6c8e82d78da45fef6749ca6ba2b2.tar.bz2 drakx-e996d2f2ae7e6c8e82d78da45fef6749ca6ba2b2.tar.xz drakx-e996d2f2ae7e6c8e82d78da45fef6749ca6ba2b2.zip |
rewrite using DrakX modules
Diffstat (limited to 'rescue')
-rwxr-xr-x | rescue/restore_ms_boot | 97 |
1 files changed, 26 insertions, 71 deletions
diff --git a/rescue/restore_ms_boot b/rescue/restore_ms_boot index 86350d7bc..c9eaf550e 100755 --- a/rescue/restore_ms_boot +++ b/rescue/restore_ms_boot @@ -12,96 +12,51 @@ # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # -sub arch() { - my $t = `uname -m`; - chomp $t; - $t; -} -sub if_($@) { - my $b = shift; - $b or return (); - wantarray || @_ <= 1 or die("if_ called in scalar context with more than one argument " . join(":", caller())); - wantarray ? @_ : $_[0]; -} -sub cat_ { local *F; open F, $_[0] or $_[1] ? die "cat of file $_[0] failed: $!\n" : return; my @l = <F>; wantarray ? @l : join '', @l } -sub member { my $e = shift; foreach (@_) { $e eq $_ and return 1 } 0 } - -@known_boot_loaders = qw(lilo grub yaboot); - -# keep this in sync with DrakX -@MBR_signatures = ( - [ 'empty', 0, "\0\0\0\0" ], - [ 'grub', 0x6, "GRUB" ], - [ 'grub', 0, "\xEBG", 0x17d, "stage1 \0" ], - [ 'grub', 0, "\xEBH", 0x17e, "stage1 \0" ], - [ 'grub', 0, "\xEBH", 0x18a, "stage1 \0" ], - [ 'grub', 0, "\xEBH", 0x181, "GRUB \0" ], - [ 'lilo', 0x2, "LILO" ], - [ 'lilo', 0x6, "LILO" ], -if_(arch() =~ /ppc/, - map { [ 'yaboot', 0, "PM", 0x200 * $_ + 0x10, "bootstrap\0" ] } 0 .. 61 -), -); +use lib qw(../perl-install /usr/lib/libDrakX); +use common; +use bootloader; +use fs; -sub typeFromMagic { - my $f = shift; - local *F; sysopen F, $f, 0 or return; - - my $tmp; - M: foreach (@MBR_signatures) { - my ($name, @l) = @$_; - while (@l) { - my ($offset, $signature) = splice(@l, 0, 2); - sysseek(F, $offset, 0) or next M; - sysread(F, $tmp, length $signature); - $tmp eq $signature or next M; - } - return $name; - } - return 0; -} - -my (undef, undef, @parts) = cat_('/proc/partitions'); - -my @possibilities; - -P: foreach (@parts) { - my (undef, undef, $blocks, $dev) = split or next; - next if $blocks <= 1; - my $type = typeFromMagic("/dev/$dev"); - $type && member($type, @known_boot_loaders) and push @possibilities, [ $dev, $type ]; -} +my @choices = map { + my $type = typeFromMagic(devices::make($_->{dev})); + if_($type && member($type, bootloader::main_method_choices()) , [ $_->{dev}, $type ]); +} devices::read_proc_partitions_raw(); my $choice; -if (!@possibilities) { +if (!@choices) { print "No known Linux bootloader has been found, nothing to do.\n"; -} elsif (@possibilities == 1) { - print "I've found a Linux bootloader only on </dev/$possibilities[0]->[0]>.\n\n"; - $choice = $possibilities[0]; +} elsif (@choices == 1) { + print "I've found a Linux bootloader only on <$choices[0][0]>.\n\n"; + $choice = $choices[0]; } else { - print "I've found the following Linux bootloaders:\n"; - my $i; - print "\t", ++$i, ": <$_->[1]> \ton <$_->[0]>\n" foreach @possibilities; - print "\n"; - print "Which disk/partition do you want to overwrite with the Windows bootloader?\n"; - print "\t<enter the number or press 'n' and Enter to cancel> "; - <STDIN> !~ /^(\d+)$/i && $1 >= 1 and $choice = $possibilities[$1-1]; + print "I've found the following Linux bootloaders:\n", + (map_index { "\t" . $::i . ": <$_->[1]> \ton <$_->[0]>\n" } @choices), + "\n", + "Which disk/partition do you want to overwrite with the Windows bootloader?\n", + "\t<enter the number or press 'n' and Enter to cancel> "; + if (<STDIN> =~ /^(\d+)$/i && $1 >= 1) { + $choice = $choices[$1 - 1]; + } } if ($choice) { - print "I'm going to overwrite bootloader on </dev/$choice->[0]> with + print "I'm going to overwrite bootloader on <$choice->[0]> with Windows bootloader. Ok? <press Enter to continue, 'n' and Enter to cancel> "; <STDIN> =~ /^n/i and exit 0; - system("/bin/dd if=/usr/lib/extipl/aldebaran.bin of=/dev/$choice->[0]\n") and print "\tFailed!\n"; + system('dd', 'if=/usr/lib/extipl/aldebaran.bin', "of=/dev/$choice->[0]") == 0 + or print "\tFailed!\n"; } #------------------------------------------------- #- $Log$ +#- Revision 1.4 2005/05/19 08:59:54 prigaux +#- rewrite using DrakX modules +#- #- Revision 1.3 2005/04/19 12:49:39 prigaux #- update copyright #- |