summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--perl-install/Xconfigurator.pm2
-rw-r--r--perl-install/common.pm3
-rw-r--r--perl-install/fsedit.pm4
-rw-r--r--perl-install/interactive.pm5
-rw-r--r--perl-install/my_gtk.pm5
-rw-r--r--perl-install/partition_table.pm27
-rw-r--r--perl-install/partition_table_bsd.pm133
-rw-r--r--perl-install/partition_table_dos.pm86
-rw-r--r--perl-install/partition_table_raw.pm73
9 files changed, 248 insertions, 90 deletions
diff --git a/perl-install/Xconfigurator.pm b/perl-install/Xconfigurator.pm
index 9db1dcdd5..14f0c8c68 100644
--- a/perl-install/Xconfigurator.pm
+++ b/perl-install/Xconfigurator.pm
@@ -82,6 +82,7 @@ sub readCardsDB {
#- this entry is broken in X11R6 cards db
$cards{I128}{flags}{noclockprobe} = 1;
+ \%cards;
}
sub readMonitorsDB {
@@ -174,6 +175,7 @@ sub cardConfiguration(;$$$) {
unless ($card->{type}) {
$card->{flags}{noclockprobe} = member($card->{server}, qw(I128 S3 S3V Mach64));
}
+ $card->{options}{power_saver} = 1;
$card->{flags}{needVideoRam} and
$card->{memory} ||=
diff --git a/perl-install/common.pm b/perl-install/common.pm
index 9f7117254..441440033 100644
--- a/perl-install/common.pm
+++ b/perl-install/common.pm
@@ -7,7 +7,7 @@ use vars qw(@ISA %EXPORT_TAGS @EXPORT_OK $printable_chars $sizeof_int $bitof_int
@ISA = qw(Exporter);
%EXPORT_TAGS = (
common => [ qw(__ even odd min max sqr sum and_ or_ sign product bool invbool listlength bool2text text2bool to_int to_float ikeys member divide is_empty_array_ref is_empty_hash_ref add2hash add2hash_ set_new set_add round round_up round_down first second top uniq translate untranslate warp_text formatAlaTeX formatLines deref) ],
- functional => [ qw(fold_left compose map_index grep_index map_each grep_each map_tab_hash mapn mapn_ difference2 before_leaving catch_cdie cdie) ],
+ functional => [ qw(fold_left compose map_index grep_index map_each grep_each list2kv map_tab_hash mapn mapn_ difference2 before_leaving catch_cdie cdie) ],
file => [ qw(dirname basename touch all glob_ cat_ output symlinkf chop_ mode typeFromMagic) ],
system => [ qw(sync makedev unmakedev psizeof strcpy gettimeofday syscall_ salt getVarsFromSh setVarsInSh setVarsInCsh substInFile availableRam availableMemory removeXiBSuffix template2file formatTime) ],
constant => [ qw($printable_chars $sizeof_int $bitof_int $SECTORSIZE) ],
@@ -129,6 +129,7 @@ sub grep_each(&%) {
while (($::a, $::b) = each %h) { $l{$::a} = $::b if &$f($::a, $::b) }
%l;
}
+sub list2kv { [ grep_index { even($::i) } @_ ], [ grep_index { odd($::i) } @_ ] }
#- pseudo-array-hash :)
sub map_tab_hash(&$@) {
diff --git a/perl-install/fsedit.pm b/perl-install/fsedit.pm
index 6060a1cc7..5bcabddeb 100644
--- a/perl-install/fsedit.pm
+++ b/perl-install/fsedit.pm
@@ -110,8 +110,8 @@ sub is_one_big_fat {
my ($hds) = @_;
@$hds == 1 or return;
- my @l = fsedit::get_fstab(@$hds);
- @l == 1 && isFat($l[0]) && fsedit::free_space(@$hds) < 10 << 11;
+ my @l = get_fstab(@$hds);
+ @l == 1 && isFat($l[0]) && free_space(@$hds) < 10 << 11;
}
diff --git a/perl-install/interactive.pm b/perl-install/interactive.pm
index 4e1f9662b..79df5be2c 100644
--- a/perl-install/interactive.pm
+++ b/perl-install/interactive.pm
@@ -145,9 +145,8 @@ sub ask_from_entries($$$$;$%) {
sub ask_from_entries_refH($$$;$%) {
my ($o, $title, $message, $h, %callback) = @_;
- ask_from_entries_ref($o, $title, $message,
- [ grep_index { even($::i) } @$h ],
- [ grep_index { odd($::i) } @$h ],
+ ask_from_entries_ref($o, $title, $message,
+ list2kv(@$h),
%callback);
}
diff --git a/perl-install/my_gtk.pm b/perl-install/my_gtk.pm
index 84f285ba0..988045458 100644
--- a/perl-install/my_gtk.pm
+++ b/perl-install/my_gtk.pm
@@ -143,10 +143,7 @@ sub gtkroot {
sub gtkcolor($$$) {
my ($r, $g, $b) = @_;
- my $color = bless {}, 'Gtk::Gdk::Color';
- $color->red ($r);
- $color->green($g);
- $color->blue ($b);
+ my $color = bless { red => $r, green => $g, blue => $b }, 'Gtk::Gdk::Color';
gtkroot()->get_colormap->color_alloc($color);
}
diff --git a/perl-install/partition_table.pm b/perl-install/partition_table.pm
index 18c9c9a14..3bf6506bc 100644
--- a/perl-install/partition_table.pm
+++ b/perl-install/partition_table.pm
@@ -12,7 +12,8 @@ use vars qw(@ISA %EXPORT_TAGS @EXPORT_OK @important_types @fields2save);
use common qw(:common :system :functional);
-use partition_table_raw;
+use partition_table_dos;
+use partition_table_bsd;
use Data::Dumper;
@@ -326,7 +327,15 @@ sub get_holes($) {
sub read_one($$) {
my ($hd, $sector) = @_;
- my $pt = partition_table_raw::read($hd, $sector) or return;
+ my ($pt, $info);
+ foreach ('dos', 'bsd') {
+ eval {
+ bless $hd, "partition_table_$_";
+ ($pt, $info) = $hd->read($sector);
+ };
+ print ">>> $@\n";
+ $@ or last;
+ }
my @extended = grep { isExtended($_) } @$pt;
my @normal = grep { $_->{size} && $_->{type} && !isExtended($_) } @$pt;
@@ -334,13 +343,13 @@ sub read_one($$) {
@extended > 1 and die "more than one extended partition";
$_->{rootDevice} = $hd->{device} foreach @normal, @extended;
- { raw => $pt, extended => $extended[0], normal => \@normal };
+ { raw => $pt, extended => $extended[0], normal => \@normal, info => $info };
}
sub read($;$) {
my ($hd, $clearall) = @_;
my $pt = $clearall ?
- partition_table_raw::clear_raw() :
+ $hd->clear_raw :
read_one($hd, 0) || return 0;
$hd->{primary} = $pt;
@@ -394,21 +403,21 @@ sub write($) {
for ($hd->{primary}{raw}) {
(grep { $_->{local_start} = $_->{start}; $_->{active} ||= 0 } @$_) or $_->[0]{active} = 0x80;
}
- partition_table_raw::write($hd, 0, $hd->{primary}{raw}) or die "writing of partition table failed";
+ $hd->write(0, $hd->{primary}{raw}, $hd->{primary}{info}) or die "writing of partition table failed";
foreach (@{$hd->{extended}}) {
# in case of extended partitions, the start sector must be local to the partition
$_->{normal}{local_start} = $_->{normal}{start} - $_->{start};
$_->{extended} and $_->{extended}{local_start} = $_->{extended}{start} - $hd->{primary}{extended}{start};
- partition_table_raw::write($hd, $_->{start}, $_->{raw}) or die "writing of partition table failed";
+ $hd->write($_->{start}, $_->{raw}) or die "writing of partition table failed";
}
$hd->{isDirty} = 0;
#- now sync disk and re-read the partition table
if ($hd->{needKernelReread}) {
sync();
- partition_table_raw::kernel_read($hd);
+ $hd->kernel_read;
$hd->{needKernelReread} = 0;
}
}
@@ -530,8 +539,8 @@ sub add($$;$$) {
eval { add_primary($hd, $part) };
return unless $@;
}
- eval { add_extended($hd, $part) }; #- try adding extended
- if (my $err = $@) {
+ eval { add_extended($hd, $part) } if $hd->hasExtended; #- try adding extended
+ if ($@ || !$hd->hasExtended) {
eval { add_primary($hd, $part) };
die $@ if $@; #- send the add extended error which should be better
}
diff --git a/perl-install/partition_table_bsd.pm b/perl-install/partition_table_bsd.pm
new file mode 100644
index 000000000..0b03249c1
--- /dev/null
+++ b/perl-install/partition_table_bsd.pm
@@ -0,0 +1,133 @@
+package partition_table_bsd;
+
+use diagnostics;
+use strict;
+use vars qw(@ISA);
+
+@ISA = qw(partition_table_raw);
+
+use common qw(:common :system :file :functional);
+use partition_table_raw;
+use partition_table;
+use c;
+
+#- very bad and rough handling :(
+my %typeToDos = (
+ 8 => 0x83,
+ 1 => 0x82,
+);
+my %typeFromDos = reverse %typeToDos;
+
+my ($main_format, $main_fields) = list2kv(
+ I => 'magic',
+ S => 'type',
+ S => 'subtype',
+ a16 => 'typename',
+ a16 => 'packname',
+ I => 'secsize',
+ I => 'nsectors',
+ I => 'ntracks',
+ I => 'ncylinders',
+ I => 'secpercyl',
+ I => 'secprtunit',
+ S => 'sparespertrack',
+ S => 'sparespercyl',
+ I => 'acylinders',
+ S => 'rpm',
+ S => 'interleave',
+ S => 'trackskew',
+ S => 'cylskew',
+ I => 'headswitch',
+ I => 'trkseek',
+ I => 'flags',
+ a20 => 'drivedata',
+ a20 => 'spare',
+ I => 'magic2',
+ S => 'checksum',
+ S => 'npartitions',
+ I => 'bbsize',
+ I => 'sbsize',
+);
+$main_format = join '', @$main_format;
+
+my @fields = qw(size start fsize type frag cpg);
+my $format = "I I I C C S";
+my $magic = 0x82564557;
+my $nb_primary = 8;
+my $offset = 0x40;
+
+sub read($$) {
+ my ($hd, $sector) = @_;
+ my $tmp;
+
+ local *F; partition_table_raw::openit($hd, *F) or die "failed to open device";
+ c::lseek_sector(fileno(F), $sector, $offset) or die "reading of partition in sector $sector failed";
+
+ sysread F, $tmp, psizeof($main_format) or die "error while reading partition table in sector $sector";
+ my %info; @info{@$main_fields} = unpack $main_format, $tmp;
+
+ my @pt = map {
+ sysread F, $tmp, psizeof($format) or die "error while reading partition table in sector $sector";
+ my %h; @h{@fields} = unpack $format, $tmp;
+ $h{type} = $typeToDos{$h{type}} || $h{type};
+ \%h;
+ } (1..$nb_primary);
+
+ #- check magic number
+ $info{magic} == $magic or die "bad magic number";
+ $info{magic2} == $magic or die "bad magic number";
+
+ [ @pt ], \%info;
+}
+
+# write the partition table (and extended ones)
+# for each entry, it uses fields: start, size, type, active
+sub write($$$;$) {
+ my ($hd, $sector, $pt, $info) = @_;
+
+ print "Her\n";
+ local *F; partition_table_raw::openit($hd, *F, 2) or die "error opening device $hd->{device} for writing";
+ c::lseek_sector(fileno(F), $sector, $offset) or return 0;
+
+ $info->{npartitions} = $nb_primary; #- is it ok?
+
+ syswrite F, pack($main_format, @$info{@$main_fields}), psizeof($main_format) or return 0;
+
+ @$pt == $nb_primary or die "partition table does not have $nb_primary entries";
+ foreach (@$pt) {
+ local $_->{type} = $typeFromDos{$_->{type}} || $_->{type};
+ syswrite F, pack($format, @$_{@fields}), psizeof($format) or return 0;
+ }
+ 1;
+}
+
+sub info {
+ my ($hd) = @_;
+ my $dtype_scsi = 4; #- taken from fdisk, removed unused one,
+ my $dtype_ST506 = 6; #- see fdisk for more
+
+ {
+ magic => $magic,
+ magic2 => $magic,
+ dtype => $hd->{device} =~ /^sd/ ? $dtype_scsi : $dtype_ST506,
+ secsize => $common::SECTORSIZE,
+ ncylinders => $hd->{geom}{cylinders},
+ secpercyl => partition_table::cylinder_size($hd),
+ secprtunit => $hd->{geom}{totalsectors},
+ rpm => 3600,
+ interleave => 1,
+ trackskew => 0,
+ cylskew => 0,
+ headswitch => 0,
+ trkseek => 0,
+ bbsize => 8192, #- size of boot area, with label
+ sbsize => 8192, #- max size of fs superblock
+ };
+}
+
+sub clear_raw {
+ my ($hd) = @_;
+ { raw => [ ({}) x $nb_primary ], info => info($hd) };
+}
+
+1;
diff --git a/perl-install/partition_table_dos.pm b/perl-install/partition_table_dos.pm
new file mode 100644
index 000000000..1b25a8f0b
--- /dev/null
+++ b/perl-install/partition_table_dos.pm
@@ -0,0 +1,86 @@
+package partition_table_dos;
+
+use diagnostics;
+use strict;
+use vars qw(@ISA);
+
+@ISA = qw(partition_table_raw);
+
+use common qw(:common :system :file);
+use partition_table_raw;
+use c;
+
+my @fields = qw(active start_head start_sec start_cyl type end_head end_sec end_cyl start size);
+my $format = "C8 I2";
+my $magic = "\x55\xAA";
+my $nb_primary = 4;
+
+my $offset = $common::SECTORSIZE - length($magic) - $nb_primary * common::psizeof($format);
+
+sub hasExtended { 1 }
+
+sub compute_CHS($$) {
+ my ($hd, $e) = @_;
+ my @l = qw(cyl head sec);
+ @$e{map { "start_$_" } @l} = $e->{start} || $e->{type} ? CHS2rawCHS(sector2CHS($hd, $e->{start})) : (0,0,0);
+ @$e{map { "end_$_" } @l} = $e->{start} || $e->{type} ? CHS2rawCHS(sector2CHS($hd, $e->{start} + $e->{size} - 1)) : (0,0,0);
+ 1;
+}
+
+sub CHS2rawCHS($$$) {
+ my ($c, $h, $s) = @_;
+ $c = min($c, 1023); #- no way to have a #cylinder >= 1024
+ ($c & 0xff, $h, $s | ($c >> 2 & 0xc0));
+}
+
+# returns (cylinder, head, sector)
+sub sector2CHS($$) {
+ my ($hd, $start) = @_;
+ my ($s, $h);
+ ($start, $s) = divide($start, $hd->{geom}{sectors});
+ ($start, $h) = divide($start, $hd->{geom}{heads});
+ ($start, $h, $s + 1);
+}
+
+sub read($$) {
+ my ($hd, $sector) = @_;
+ my $tmp;
+
+ local *F; partition_table_raw::openit($hd, *F) or die "failed to open device";
+ c::lseek_sector(fileno(F), $sector, $offset) or die "reading of partition in sector $sector failed";
+
+ my @pt = map {
+ sysread F, $tmp, psizeof($format) or die "error while reading partition table in sector $sector";
+ my %h; @h{@fields} = unpack $format, $tmp;
+ \%h;
+ } (1..$nb_primary);
+
+ #- check magic number
+ sysread F, $tmp, length $magic or die "error reading magic number";
+ $tmp eq $magic or die "bad magic number";
+
+ [ @pt ];
+}
+
+# write the partition table (and extended ones)
+# for each entry, it uses fields: start, size, type, active
+sub write($$$;$) {
+ my ($hd, $sector, $pt) = @_;
+
+ local *F; partition_table_raw::openit($hd, *F, 2) or die "error opening device $hd->{device} for writing";
+ c::lseek_sector(fileno(F), $sector, $offset) or return 0;
+
+ @$pt == $nb_primary or die "partition table does not have $nb_primary entries";
+ foreach (@$pt) {
+ compute_CHS($hd, $_);
+ local $_->{start} = $_->{local_start} || 0;
+ $_->{active} ||= 0; $_->{type} ||= 0; $_->{size} ||= 0; #- for no warning
+ syswrite F, pack($format, @$_{@fields}), psizeof($format) or return 0;
+ }
+ syswrite F, $magic, length $magic or return 0;
+ 1;
+}
+
+sub clear_raw { { raw => [ ({}) x $nb_primary ] } }
+
+1;
diff --git a/perl-install/partition_table_raw.pm b/perl-install/partition_table_raw.pm
index 50d6a0b3e..9aa790aee 100644
--- a/perl-install/partition_table_raw.pm
+++ b/perl-install/partition_table_raw.pm
@@ -7,13 +7,6 @@ use common qw(:common :system :file);
use devices;
use c;
-my @fields = qw(active start_head start_sec start_cyl type end_head end_sec end_cyl start size);
-my $format = "C8 I2";
-my $magic = "\x55\xAA";
-my $nb_primary = 4;
-
-my $offset = $common::SECTORSIZE - length($magic) - $nb_primary * common::psizeof($format);
-
my @MBR_signatures = (
[ 'empty', 0, "\0\0\0\0" ],
[ 'lilo', 0x2, "LILO" ],
@@ -36,28 +29,7 @@ my @MBR_signatures = (
sub typeOfMBR($) { typeFromMagic(devices::make($_[0]), @MBR_signatures) }
sub typeOfMBR_($) { typeFromMagic($_[0], @MBR_signatures) }
-sub compute_CHS($$) {
- my ($hd, $e) = @_;
- my @l = qw(cyl head sec);
- @$e{map { "start_$_" } @l} = $e->{start} || $e->{type} ? CHS2rawCHS(sector2CHS($hd, $e->{start})) : (0,0,0);
- @$e{map { "end_$_" } @l} = $e->{start} || $e->{type} ? CHS2rawCHS(sector2CHS($hd, $e->{start} + $e->{size} - 1)) : (0,0,0);
- 1;
-}
-
-sub CHS2rawCHS($$$) {
- my ($c, $h, $s) = @_;
- $c = min($c, 1023); #- no way to have a #cylinder >= 1024
- ($c & 0xff, $h, $s | ($c >> 2 & 0xc0));
-}
-
-# returns (cylinder, head, sector)
-sub sector2CHS($$) {
- my ($hd, $start) = @_;
- my ($s, $h);
- ($start, $s) = divide($start, $hd->{geom}{sectors});
- ($start, $h) = divide($start, $hd->{geom}{heads});
- ($start, $h, $s + 1);
-}
+sub hasExtended { 0 }
sub get_geometry($) {
my ($dev) = @_;
@@ -80,51 +52,10 @@ sub kernel_read($) {
$hd->{rebootNeeded} = !ioctl(F, c::BLKRRPART(), 0);
}
-sub read($$) {
- my ($hd, $sector) = @_;
- my $tmp;
-
- local *F; openit($hd, *F) or return;
- c::lseek_sector(fileno(F), $sector, $offset) or die "reading of partition in sector $sector failed";
-
- my @pt = map {
- sysread F, $tmp, psizeof($format) or return "error while reading partition table in sector $sector";
- my %h; @h{@fields} = unpack $format, $tmp;
- \%h;
- } (1..$nb_primary);
-
- #- check magic number
- sysread F, $tmp, length $magic or die "error reading magic number";
- $tmp eq $magic or die "bad magic number";
-
- [ @pt ];
-}
-
-# write the partition table (and extended ones)
-# for each entry, it uses fields: start, size, type, active
-sub write($$$) {
- my ($hd, $sector, $pt) = @_;
-
- local *F; openit($hd, *F, 2) or die "error opening device $hd->{device} for writing";
- c::lseek_sector(fileno(F), $sector, $offset) or return 0;
-
- @$pt == $nb_primary or die "partition table does not have $nb_primary entries";
- foreach (@$pt) {
- compute_CHS($hd, $_);
- local $_->{start} = $_->{local_start} || 0;
- $_->{active} ||= 0; $_->{type} ||= 0; $_->{size} ||= 0; #- for no warning
- syswrite F, pack($format, @$_{@fields}), psizeof($format) or return 0;
- }
- syswrite F, $magic, length $magic or return 0;
- 1;
-}
-
-sub clear_raw { { raw => [ ({}) x $nb_primary ] } }
-
sub zero_MBR($) {
my ($hd) = @_;
$hd->{isDirty} = $hd->{needKernelReread} = 1;
- $hd->{primary} = clear_raw();
+ $hd->{primary} = $hd->clear_raw();
delete $hd->{extended};
}