summaryrefslogtreecommitdiffstats
path: root/rescue
diff options
context:
space:
mode:
Diffstat (limited to 'rescue')
-rwxr-xr-xrescue/restore_ms_boot97
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
#-