diff options
Diffstat (limited to 'perl-install/partition_table/mac.pm')
| -rw-r--r-- | perl-install/partition_table/mac.pm | 72 | 
1 files changed, 38 insertions, 34 deletions
| diff --git a/perl-install/partition_table/mac.pm b/perl-install/partition_table/mac.pm index 2a8fe8df5..78e5469cd 100644 --- a/perl-install/partition_table/mac.pm +++ b/perl-install/partition_table/mac.pm @@ -1,12 +1,13 @@ -package partition_table::mac; # $Id$ +package partition_table::mac;  use diagnostics;  #use strict;   - fixed other PPC code to comply, but program bails on empty partition table - sbenedict -use vars qw(@ISA $freepart $bootstrap_part $macos_part); +use vars qw(@ISA $freepart $bootstrap_part $macos_part $new_bootstrap);  @ISA = qw(partition_table::raw);  use common; +use fs::type;  use partition_table::raw;  use partition_table;  use c; @@ -78,6 +79,8 @@ $p_format = join '', @$p_format;  my $magic = 0x4552;  my $pmagic = 0x504D; +sub use_pt_type { 1 } +  sub first_usable_sector { 1 }  sub adjustStart($$) { @@ -95,7 +98,7 @@ sub adjustEnd($$) {      my ($_hd, $_part) = @_;  } -sub read($$) { +sub read_one {      my ($hd, $sector) = @_;      my $tmp; @@ -139,7 +142,7 @@ sub read($$) {                  $h{start} = ($h{pPBlockStart} * $info{bzBlkSize}) / 512;                  if ($h{pType} =~ /^Apple_UNIX_SVR2/i) { -                    $h{pName} =~ /swap/i ? ($h{type} = 0x82) : ($h{type} = 0x83); +		    $h{fs_type} = $h{pName} =~ /swap/i ? 'swap' : 'ext2';                  } elsif ($h{pType} =~ /^Apple_Free/i) {                  	#- need to locate a 1MB partition to setup a bootstrap on                  	if ($freepart && $freepart->{size} >= 1) { @@ -148,10 +151,10 @@ sub read($$) {  			    $freepart = { start => $h{start}, size => $h{size}/2048, hd => $hd, part => "/dev/$hd->{device}" . ($i+1) };  			    log::l("free apple partition found on drive /dev/$freepart->{hd}{device}, block $freepart->{start}, size $freepart->{size}");                  	} -			$h{type} = 0x0; +			$h{pt_type} = 0x0;  			$h{pName} = 'Extra';                                      } elsif ($h{pType} =~ /^Apple_HFS/i) { -                 	$h{type} = 0x402; +			fs::type::set_pt_type(\%h, 0x402);                   	if (defined $macos_part) {		                   		#- swag at identifying MacOS - 1st HFS partition                   	} else {	 @@ -159,10 +162,10 @@ sub read($$) {                   		log::l("found MacOS at partition $macos_part");                   	}                  } elsif ($h{pType} =~ /^Apple_Partition_Map/i) { -                 	$h{type} = 0x401; +                 	$h{pt_type} = 0x401;                   	$h{isMap} = 1;                  } elsif ($h{pType} =~ /^Apple_Bootstrap/i) { -                 	$h{type} = 0x401; +                 	$h{pt_type} = 0x401;                   	$h{isBoot} = 1;                   	if (defined $bootstrap_part) {                   		#found a bootstrap already - use it, but log the find @@ -172,9 +175,9 @@ sub read($$) {                   		log::l("found apple bootstrap at partition $bootstrap_part");                   	}                  } else { -                 	$h{type} = 0x401; +                 	$h{pt_type} = 0x401;                       $h{isDriver} = 1; -                }; +                }                  # Let's see if this partition is a driver.                  foreach (@{$info{ddMap}}) { @@ -184,13 +187,13 @@ sub read($$) {              }              \%h;          } [ $part ]; -    }; +    }      [ @pt ], \%info;  }  sub write($$$;$) { -    my ($hd, $sector, $pt, $info) = @_; +    my ($hd, $_handle, $sector, $pt, $info) = @_;      #- handle testing for writing partition table on file only!      my $F; @@ -218,24 +221,24 @@ sub write($$$;$) {          if ($last->{start} + $last->{size} < $part->{start}) {              #There is a gap between partitions.  Fill it and move on.              push @partstowrite, { -                type => 0x0, +                pt_type => 0x0,                  start => $last->{start} + $last->{size},                  size => $part->{start} - ($last->{start} + $last->{size}),              };          }          push @partstowrite, $part; -    }; +    }      # now, fill a gap at the end if there is one.      if ($last->{start} + $last->{size} < $hd->{totalsectors}) {          push @partstowrite, { -            type => 0x0, +            pt_type => 0x0,              start => $last->{start} + $last->{size},              size => $hd->{totalsectors} - ($last->{start} + $last->{size}),       	};      } -    # Since we didn't create any new drivers, let's try and match up our driver records with out partitons and see if any are missing. +    # Since we did not create any new drivers, let's try and match up our driver records with out partitons and see if any are missing.      $info->{bzDrvrCnt} = 0;      my @ddstowrite;      foreach my $dd (@{$info->{ddMap}}) { @@ -281,52 +284,52 @@ sub write($$$;$) {              $_->{pBootArgs} = "\0";              $_->{pReserved} = "\0"; -            if ($_->{type} == 0x402) { +            if ($_->{pt_type} == 0x402) {                  $_->{pType} = "Apple_HFS";                  $_->{pName} = "MacOS";                  $_->{pFlags} = 0x4000037F; -            } elsif ($_->{type} == 0x401 && $_->{start} == 1) { +            } elsif ($_->{pt_type} == 0x401 && $_->{start} == 1) {                  $_->{pType} = "Apple_Partition_Map";                  $_->{pName} = "Apple";                  $_->{pFlags} = 0x33; -            } elsif ($_->{type} == 0x401) { +            } elsif ($_->{pt_type} == 0x401) {                  $_->{pType} = "Apple_Bootstrap";                  $_->{pName} = "bootstrap";                  $_->{pFlags} = 0x33;  		$_->{isBoot} = 1;  		log::l("writing a bootstrap at /dev/$_->{device}"); -		$install_steps_interactive::new_bootstrap = 1 if !(defined $partition_table::mac::bootstrap_part); +		$new_bootstrap = 1 if !(defined $bootstrap_part);  		$bootstrap_part = "/dev/" . $_->{device}; -            } elsif ($_->{type} == 0x82) { +            } elsif (isSwap($_)) {                  $_->{pType} = "Apple_UNIX_SVR2";                  $_->{pName} = "swap";                  $_->{pFlags} = 0x33; -            } elsif ($_->{type} == 0x83) { +            } elsif ($_->{fs_type} eq 'ext2') {                  $_->{pType} = "Apple_UNIX_SVR2";                  $_->{pName} = "Linux Native";                  $_->{pFlags} = 0x33; -            } elsif ($_->{type} == 0x183) { +            } elsif ($_->{fs_type} eq 'reiserfs') {                  $_->{pType} = "Apple_UNIX_SVR2";                  $_->{pName} = "Linux ReiserFS";                  $_->{pFlags} = 0x33; -            } elsif ($_->{type} == 0x283) { +            } elsif ($_->{fs_type} eq 'xfs') {                  $_->{pType} = "Apple_UNIX_SVR2";                  $_->{pName} = "Linux XFS";                  $_->{pFlags} = 0x33; -            } elsif ($_->{type} == 0x383) { +            } elsif ($_->{fs_type} eq 'jfs') {                  $_->{pType} = "Apple_UNIX_SVR2";                  $_->{pName} = "Linux JFS";                  $_->{pFlags} = 0x33; -            } elsif ($_->{type} == 0x483) { +            } elsif ($_->{fs_type} eq 'ext3') {                  $_->{pType} = "Apple_UNIX_SVR2";                  $_->{pName} = "Linux ext3";                  $_->{pFlags} = 0x33; -            } elsif ($_->{type} == 0x0) { +            } elsif ($_->{pt_type} == 0x0) {                  $_->{pType} = "Apple_Free";                  $_->{pName} = "Extra";                  $_->{pFlags} = 0x31;              } -        }; +        }          $_->{pMapEntry} = @partstowrite;          syswrite $F, pack($p_format, @$_{@$p_fields}), psizeof($p_format) or return 0;      } @@ -354,20 +357,20 @@ sub info {      $info;  } -sub clear_raw { -    my ($hd) = @_; +sub initialize { +    my ($class, $hd) = @_;      my @oldraw = @{$hd->{primary}{raw}};      my $pt = { raw => [ ({}) x 63 ], info => info($hd) };      #- handle special case for partition 1 which is the partition map.      $pt->{raw}[0] = { -        type => 0x401, +        pt_type => 0x401,          start => 1,          size => 63,          isMap => 1,      };  #	$pt->{raw}[1] = { -#		type => 0x0, +#		pt_type => 0x0,  #		start => 64,  #		size => $hd->{totalsectors} - 64,  #		isMap => 0, @@ -383,10 +386,11 @@ sub clear_raw {              push @{$pt->{normal}}, $pt->{raw}[$i];              $i++;          } -    }; +    }      @{$pt->{info}{ddMap}} = @{$hd->{primary}{info}{ddMap}}; -    $pt; +    $hd->{primary} = $pt; +    bless $hd, $class;  }  1; | 
