summaryrefslogtreecommitdiffstats
path: root/perl-install/partition_table.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/partition_table.pm')
-rw-r--r--perl-install/partition_table.pm41
1 files changed, 31 insertions, 10 deletions
diff --git a/perl-install/partition_table.pm b/perl-install/partition_table.pm
index c3e0da79e..f7e1d55ad 100644
--- a/perl-install/partition_table.pm
+++ b/perl-install/partition_table.pm
@@ -25,6 +25,16 @@ use Data::Dumper;
my %types = (
0x0 => 'Empty',
+arch() =~ /^sparc/ ? (
+ 0x1 => 'SunOS boot',
+ 0x2 => 'SunOS root',
+ 0x3 => 'SunOS swap',
+ 0x4 => 'SunOS usr',
+ 0x5 => 'Whole disk',
+ 0x6 => 'SunOS stand',
+ 0x7 => 'SunOS var',
+ 0x8 => 'SunOS home',
+) : (
0x1 => 'DOS 12-bit FAT',
0x2 => 'XENIX root',
0x3 => 'XENIX /usr',
@@ -33,6 +43,7 @@ my %types = (
0x6 => 'DOS FAT16',
0x7 => 'OS/2 IFS (e.g., HPFS) / Windows NT NTFS / Advanced Unix / QNX2.x pre-1988 (see below under IDs 4d-4f)',
0x8 => 'OS/2 (v1.0-1.3 only) / AIX boot partition / SplitDrive / Commodore DOS / DELL partition spanning multiple drives / QNX 1.x and 2.x ("qny")',
+),
0x9 => 'AIX data partition / Coherent filesystem / QNX 1.x and 2.x ("qnz")',
0xa => 'OS/2 Boot Manager / Coherent swap partition / OPUS',
0xb => 'Win98 FAT32',
@@ -140,11 +151,13 @@ my %types = (
);
my %type2fs = (
+arch() !~ /^sparc/ ? (
0x01 => 'vfat',
0x04 => 'vfat',
0x05 => 'ignore',
0x06 => 'vfat',
0x07 => 'hpfs',
+) : (),
0x0b => 'vfat',
0x0c => 'vfat',
0x0e => 'vfat',
@@ -171,7 +184,8 @@ sub name2type($) {
/0x(.*)/ ? hex $1 : $types_rev{$_} || $_;
}
-sub isExtended($) { $_[0]{type} == 5 || $_[0]{type} == 0xf || $_[0]{type} == 0x85 }
+sub isWholedisk($) { arch() =~ /^sparc/ && $_[0]{type} == 5 }
+sub isExtended($) { (arch() !~ /^sparc/ && $_[0]{type} == 5) || $_[0]{type} == 0xf || $_[0]{type} == 0x85 }
sub isRAID($) { $_[0]{type} == 0xfd }
sub isSwap($) { $type2fs{$_[0]{type}} eq 'swap' }
sub isExt2($) { $type2fs{$_[0]{type}} eq 'ext2' }
@@ -211,8 +225,10 @@ sub adjustEnd($$) {
$part->{size} = $end2 - $part->{start};
}
sub adjustStartAndEnd($$) {
- &adjustStart;
- &adjustEnd;
+ my ($hd, $part) = @_;
+
+ $hd->adjustStart($part);
+ $hd->adjustEnd($part);
}
sub verifyNotOverlap($$) {
@@ -225,9 +241,14 @@ sub verifyInside($$) {
}
sub verifyParts_ {
- foreach my $i (@_) { foreach (@_) {
- $i != $_ and verifyNotOverlap($i, $_) || cdie sprintf "partitions sector #$i->{start} (%dMB) and sector #$_->{start} (%dMB) are overlapping!", $i->{size} >> 9, $_->{size} >> 9;
- }}
+ foreach my $i (@_) {
+ foreach (@_) {
+ next if !$i || !$_ || $i == $_ || isWholedisk($i); #- avoid testing twice on whole disk for simplicity :-)
+ isWholedisk($_) ?
+ verifyInside($i, $_) || cdie sprintf "partitions sector #$i->{start} (%dMB) is not inside whole disk (%dMB)!", $i->{size} >> 9, $_->{size} >> 9:
+ verifyNotOverlap($i, $_) || cdie sprintf "partitions sector #$i->{start} (%dMB) and sector #$_->{start} (%dMB) are overlapping!", $i->{size} >> 9, $_->{size} >> 9;
+ }
+ }
}
sub verifyParts($) {
my ($hd) = @_;
@@ -235,7 +256,7 @@ sub verifyParts($) {
}
sub verifyPrimary($) {
my ($pt) = @_;
- $_->{start} > 0 || arch() eq "sparc" || die "partition must NOT start at sector 0" foreach @{$pt->{normal}};
+ $_->{start} > 0 || arch() =~ /^sparc/ || die "partition must NOT start at sector 0" foreach @{$pt->{normal}};
verifyParts_(@{$pt->{normal}}, $pt->{extended});
}
@@ -338,7 +359,6 @@ sub read_one($$) {
bless $hd, "partition_table_$_";
($pt, $info) = $hd->read($sector);
};
- print ">>> $@\n";
$@ or last;
}
@@ -416,7 +436,8 @@ sub write($) {
$_->{normal}{local_start} = $_->{normal}{start} - $_->{start};
$_->{extended} and $_->{extended}{local_start} = $_->{extended}{start} - $hd->{primary}{extended}{start};
- $hd->write($_->{start}, $_->{raw}) or die "writing of partition table failed";
+ print "Trying to write an extended partition table, bad !!!\n";
+ #$hd->write($_->{start}, $_->{raw}) or die "writing of partition table failed";
}
$hd->{isDirty} = 0;
@@ -535,7 +556,7 @@ sub add($$;$$) {
$part->{isFormatted} = 0;
$part->{rootDevice} = $hd->{device};
$hd->{isDirty} = $hd->{needKernelReread} = 1;
- $part->{start} ||= 1; #- starting at sector 0 is not allowed
+ $part->{start} ||= 1 if arch() !~ /^sparc/; #- starting at sector 0 is not allowed
adjustStartAndEnd($hd, $part) unless $forceNoAdjust;
my $e = $hd->{primary}{extended};