diff options
Diffstat (limited to 'perl-install/partition_table')
-rw-r--r-- | perl-install/partition_table/bsd.pm | 5 | ||||
-rw-r--r-- | perl-install/partition_table/dmcrypt.pm | 2 | ||||
-rw-r--r-- | perl-install/partition_table/dos.pm | 111 | ||||
-rw-r--r-- | perl-install/partition_table/empty.pm | 2 | ||||
-rw-r--r-- | perl-install/partition_table/gpt.pm | 161 | ||||
-rw-r--r-- | perl-install/partition_table/lvm.pm | 2 | ||||
-rw-r--r-- | perl-install/partition_table/mac.pm | 4 | ||||
-rw-r--r-- | perl-install/partition_table/raw.pm | 83 | ||||
-rw-r--r-- | perl-install/partition_table/readonly.pm | 2 | ||||
-rw-r--r-- | perl-install/partition_table/sun.pm | 4 |
10 files changed, 286 insertions, 90 deletions
diff --git a/perl-install/partition_table/bsd.pm b/perl-install/partition_table/bsd.pm index 9421eae17..ec2a2edf4 100644 --- a/perl-install/partition_table/bsd.pm +++ b/perl-install/partition_table/bsd.pm @@ -1,4 +1,4 @@ -package partition_table::bsd; # $Id$ +package partition_table::bsd; use diagnostics; use strict; @@ -90,7 +90,7 @@ sub read_one { # write the partition table (and extended ones) # for each entry, it uses fields: start, size, pt_type, active sub write($$$;$) { - my ($hd, $sector, $pt, $info) = @_; + my ($hd, $_handle, $sector, $pt, $info) = @_; #- handle testing for writing partition table on file only! my $F; @@ -144,7 +144,6 @@ sub initialize { my ($class, $hd) = @_; $hd->{primary} = { raw => [ ({}) x $nb_primary ], info => info($hd) }; bless $hd, $class; -; } sub first_usable_sector { 2048 } diff --git a/perl-install/partition_table/dmcrypt.pm b/perl-install/partition_table/dmcrypt.pm index 3eae783c6..eb35eb41c 100644 --- a/perl-install/partition_table/dmcrypt.pm +++ b/perl-install/partition_table/dmcrypt.pm @@ -1,4 +1,4 @@ -package partition_table::dmcrypt; # $Id: $ +package partition_table::dmcrypt; # dmcrypt on full disk diff --git a/perl-install/partition_table/dos.pm b/perl-install/partition_table/dos.pm index 2376fce11..aa020131a 100644 --- a/perl-install/partition_table/dos.pm +++ b/perl-install/partition_table/dos.pm @@ -1,4 +1,4 @@ -package partition_table::dos; # $Id$ +package partition_table::dos; use diagnostics; use strict; @@ -6,12 +6,24 @@ use vars qw(@ISA); @ISA = qw(partition_table::raw); +use Time::HiRes qw(usleep); use common; use partition_table::raw; use partition_table; +use fs::proc_partitions; use fs::type; use c; +=head1 SYNOPSYS + +Read/write MBR partition tables + +=head1 Functions + +=over + +=cut + my @fields = qw(active start_head start_sec start_cyl pt_type end_head end_sec end_cyl start size); my $format = "C8 V2"; my $magic = "\x55\xAA"; @@ -29,7 +41,7 @@ sub geometry_to_string { sub last_usable_sector { my ($hd) = @_; - #- do not use totalsectors, see gi/docs/Partition-ends-after-end-of-disk.txt for more + #- do not use totalsectors, see docs/Partition-ends-after-end-of-disk.txt for more $hd->{geom}{sectors} * $hd->{geom}{heads} * $hd->{geom}{cylinders}; } @@ -93,7 +105,12 @@ sub CHS2rawCHS { [ $c & 0xff, $h, ($s + 1) | (($c >> 2) & 0xc0) ]; } -# returns (cylinder, head, sector) +=item sector2CHS($geom, $start) + +returns (cylinder, head, sector) + +=cut + sub sector2CHS { my ($geom, $start) = @_; my ($s, $h); @@ -212,6 +229,7 @@ sub read_one { sysread $F, $tmp, psizeof($format) or die "error while reading partition table in sector $sector"; my %h; @h{@fields} = unpack $format, $tmp; + $h{pt_type} = 'BIOS_GRUB' if $h{pt_type} == 0 && $h{size} > 0; fs::type::set_pt_type(\%h, $h{pt_type}); \%h; } (1..$nb_primary); @@ -220,13 +238,30 @@ sub read_one { sysread $F, $tmp, length $magic or die "error reading magic number on disk $hd->{device}"; $tmp eq $magic or die "bad magic number on disk $hd->{device}"; + if ($hd->{current_pt_table_type} ne "dos") { + # libparted may have ignored it because of overlapping partitions or other error + # while it is actually a partition table. + $hd->{fs_type_from_magic} and die "unpartitionned disk"; + my $primary = partition_table::raw::pt_info_to_primary($hd, [ @pt ]); + foreach my $i (@{$primary->{normal}}) { + if ($i->{active} && $i->{active} != 0x80 || + $hd->{totalsectors} && $i->{start} > $hd->{totalsectors}) { + die "Invalid DOS partition table"; + } + } + } + [ @pt ]; } -# write the partition table (and extended ones) -# for each entry, it uses fields: start, size, pt_type, active -sub write { - my ($hd, $sector, $pt) = @_; +=item start_write($hd) + +Prepare to write the partition table (and extended ones) + +=cut + +sub start_write { + my ($hd) = @_; log::l("partition::dos::write $hd->{device}"); @@ -237,6 +272,27 @@ sub write { open $F, ">$file" or die "error opening test file $file"; } else { $F = partition_table::raw::openit($hd, 2) or die "error opening device $hd->{device} for writing"; + if ($hd->{was_hybrid_iso}) { + log::l("partition::dos::start_write erasing hybrid iso9660 signature"); + c::lseek_sector(fileno($F), 0, 0x8001) or return 0; + syswrite $F, "\0\0\0\0\0", 5 or return 0; + $hd->{was_hybrid_iso} = 0; + } + } + $F; +} + +=item start_write($hd, $F, $sector, $pt) + +Write the partition table (and extended ones). +For each entry, it uses fields: start, size, pt_type, active + +=cut + +sub write { + my ($hd, $F, $sector, $pt) = @_; + + if (!$::testing) { c::lseek_sector(fileno($F), $sector, $offset) or return 0; } @@ -251,10 +307,51 @@ sub write { 1; } +sub end_write { + my ($hd, $F) = @_; + close $F; +} + +sub need_to_tell_kernel { + my ($hd) = @_; + # Whenever udevd receives a change event for a raw disk device it is watching, it asks the kernel to + # rescan the partition table on that device by calling the BLKRRPART ioctl. This is only successful + # if none of the partitions on that device are currently mounted. So if any partitions are mounted, + # we need to tell the kernel what has changed ourselves. + # The udev/rules.d/60-block.rules file causes the raw disk devices to be watched by udev. This file is + # not present in the cut-down system used to run the classic installer, so we always need to tell the + # kernel in that case. + # diskdrake will not let the user delete an individual partition that is mounted, but will let the + # user clear all partitions. So initialize() records if any partitions were mounted and we take note + # of that here. + return 1 if ! -e '/usr/lib/udev/rules.d/60-block.rules' || delete $hd->{hadMountedPartitions} || any { $_->{isMounted} } partition_table::get_normal_parts($hd); + + # No further actions must be performed until the kernel has been informed of the changes. There is + # no easy way to check that udevd has received the uevent and called the BLKRRPART ioctl, so do it + # the hard way. + my $tries = 0; + do { + usleep(100000); + log::l("checking that udevd has informed the kernel of partition table changes"); + eval { fs::proc_partitions::compare($hd) }; + return 0 if !$@; + $tries++; + } while $tries < 5; + + # We don't expect to get here, but fail safe if so. + log::l("udevd failed to inform kernel of partition table changes"); + $hd->{rebootNeeded} = 1; + 1; +} + sub empty_raw { { raw => [ ({}) x $nb_primary ] } } sub initialize { my ($class, $hd) = @_; + # Remember whether any existing partitions are mounted, for use by need_to_tell_kernel(). + $hd->{hadMountedPartitions} = 1 if any { $_->{isMounted} } partition_table::get_normal_parts($hd); + # Remember whether this was a hybrid ISO so we can wipe the iso9660 signature. + $hd->{was_hybrid_iso} = 1 if $hd->{primary}{is_hybrid_iso}; $hd->{primary} = empty_raw(); bless $hd, $class; } diff --git a/perl-install/partition_table/empty.pm b/perl-install/partition_table/empty.pm index fe4550f47..fe4ad4317 100644 --- a/perl-install/partition_table/empty.pm +++ b/perl-install/partition_table/empty.pm @@ -1,4 +1,4 @@ -package partition_table::empty; # $Id$ +package partition_table::empty; #- this is a mainly dummy partition table. If we find it's empty, we just call - #- ->clear which will take care of bless'ing us to the partition table type best diff --git a/perl-install/partition_table/gpt.pm b/perl-install/partition_table/gpt.pm index 10eab253b..af5509f27 100644 --- a/perl-install/partition_table/gpt.pm +++ b/perl-install/partition_table/gpt.pm @@ -1,4 +1,4 @@ -package partition_table::gpt; # $Id$ +package partition_table::gpt; use diagnostics; use strict; @@ -6,73 +6,156 @@ use vars qw(@ISA); @ISA = qw(partition_table::raw); +use fs::type; use partition_table::raw; use c; -#sub use_pt_type { 1 } +=head1 SYNOPSYS + +Read/write GUID partition tables (GPT) + +See https://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_type_GUIDs for a list of exitings GUIDs + +=head1 Functions + +=over + +=cut +my $nb_primary = 128; + + +sub first_usable_sector { 34 } + +sub last_usable_sector { + my ($hd) = @_; + #- do not use totalsectors because backup GPT is at end + $hd->{totalsectors} - 33; +} + +my %parted_mapping = ( + 'linux-swap(v1)' => 'swap', + 'ntfs' => 'ntfs-3g', + 'fat16' => 'vfat', + 'fat32' => 'vfat', + ); +my %rev_parted_mapping = reverse %parted_mapping; +# prefer 'fat32' over 'fat16': +$rev_parted_mapping{vfat} = 'fat32'; sub read_one { - my ($hd, $sector) = @_; - my $info; - - c::get_disk_type($hd->{file}) eq "gpt" or die "not a GPT disk"; - my @pt = map { - my %p; - print $_; - if (/^([^ ]*) ([^ ]*) ([^ ]*) (.*) \((\d*),(\d*),(\d*)\)$/) { - $p{part_number} = $1; - $p{real_device} = $2; - $p{fs_type} = $3; - $p{pt_type} = 0xba; - $p{start} = $5; - $p{size} = $7; + my ($hd, $_sector) = @_; + + $hd->{current_pt_table_type} eq "gpt" or die "$hd->{device} not a GPT disk ($hd->{file})"; + + my @pt; + foreach (c::get_disk_partitions($hd->{file})) { + # compatibility with MBR partitions tables: + $_->{pt_type} = 0x82 if $_->{fs_type} eq 'swap'; + $_->{pt_type} = 0x0b if $_->{fs_type} eq 'vfat'; + $_->{pt_type} = 0x83 if $_->{fs_type} =~ /^ext/; + + # fix detecting ESP (special case are they're detected through pt_type): + if ($_->{flag} eq 'ESP') { + $_->{pt_type} = 0xef; + } elsif ($_->{flag} eq 'BIOS_GRUB') { + $_->{fs_type} = $_->{flag}; # hack to prevent it to land in hd->{raw} + $_->{pt_type} = $_->{flag}; # hack... + } elsif ($_->{flag} eq 'LVM') { + $_->{pt_type} = 0x8e; + } elsif ($_->{flag} eq 'RAID') { + $_->{pt_type} = 0xfd; + } elsif ($_->{flag} eq 'RECOVERY') { + $_->{pt_type} = 0x12; } - \%p; - } c::get_disk_partitions($hd->{file}); + $_->{fs_type} = $parted_mapping{$_->{fs_type}} if $parted_mapping{$_->{fs_type}}; - use Data::Dumper; - print Dumper(@pt); + @pt[$_->{part_number}-1] = $_; + } - [ @pt ], $info; + for (my $part_number = 1; $part_number < $nb_primary; $part_number++) { + next if exists($pt[$part_number-1]); + $pt[$part_number-1] = { part_number => $part_number }; + } + + \@pt; } sub write { - my ($hd, $sector, $pt, $info) = @_; + my ($hd, $_handle, $_sector, $pt, $_info) = @_; + + my $ped_disk; + my $partitions_killed; # Initialize the disk if current partition table is not gpt - if (c::get_disk_type($hd->{file}) ne "gpt") { - c::set_disk_type($hd->{file}, "gpt"); + if ($hd->{current_pt_table_type} ne "gpt") { + $ped_disk = c::disk_open($hd->{file}, "gpt") or die "failed to create new partition table on $hd->{file}"; + $partitions_killed = 1; + } else { + $ped_disk = c::disk_open($hd->{file}) or die "failed to open partition table on $hd->{file}"; } foreach (@{$hd->{will_tell_kernel}}) { my ($action, $part_number, $o_start, $o_size) = @$_; - my $part; - print "($action, $part_number, $o_start, $o_size)\n"; + my ($part) = grep { $_->{start} == $o_start && $_->{size} == $o_size } @$pt; + log::l("GPT partitioning: ($action, $part_number, $o_start, $o_size)"); if ($action eq 'add') { - c::disk_add_partition($hd->{file}, $o_start, $o_size, $part->{fs_type}) or die "failed to add partition"; - } elsif ($action eq 'del') { - c::disk_del_partition($hd->{file}, $part_number) or die "failed to del partition"; + local $part->{fs_type} = $rev_parted_mapping{$part->{fs_type}} if $rev_parted_mapping{$part->{fs_type}}; + c::disk_add_partition($ped_disk, $o_start, $o_size, $part->{fs_type}) or die "failed to add partition #$part_number on $hd->{file}"; + my $flag; + if (isESP($part)) { + $flag = 'ESP'; + } elsif (isBIOS_GRUB($part)) { + $flag = 'BIOS_GRUB'; + } elsif (isRawLVM($part)) { + $flag = 'LVM'; + } elsif (isRawRAID($part)) { + $flag = 'RAID'; + } + if ($flag) { + c::set_partition_flag($ped_disk, $part_number, $flag) + or die "failed to set type '$flag' for $part->{file} on $part->{mntpoint}"; + } + } elsif ($action eq 'del' && !$partitions_killed) { + c::disk_del_partition($ped_disk, $part_number) or die "failed to del partition #$part_number on $hd->{file}"; + } elsif ($action eq 'init' && !$partitions_killed) { + c::disk_delete_all($ped_disk) or die "failed to delete all partitions on $hd->{file}"; } } - common::sync(); - 1; + + # Commit changes to the disk and inform the kernel + my $commit_level = c::disk_commit($ped_disk); + # Updating the kernel partition table will fail if any of the deleted partitions were mounted + $hd->{rebootNeeded} = 1 if $commit_level < 2; + $commit_level; +} + +=item need_to_tell_kernel($hd) + +Hint partition_table::write() that telling the kernel to reread the +partition_table is not needed if we already succeeded in that + +=cut + +sub need_to_tell_kernel { + my ($hd) = @_; + # If we failed, try again (partion_table::tell_kernel() will unmount some partitions first) + $hd->{rebootNeeded}; } sub initialize { my ($class, $hd) = @_; - $hd->{primary} = { raw => [] }; + # part_number starts at 1 + my @raw = map { +{ part_number => $_ + 1 } } 0..$nb_primary-2; + $hd->{primary} = { raw => \@raw }; bless $hd, $class; } sub can_add { &can_raw_add } -sub can_raw_add { 1 } -sub raw_add { - my ($hd, $raw, $part) = @_; - $hd->can_raw_add or die "raw_add: partition table already full"; - push @$raw, $part; -} - sub adjustStart {} sub adjustEnd {} +=back + +=cut + 1; diff --git a/perl-install/partition_table/lvm.pm b/perl-install/partition_table/lvm.pm index 8a28a4c2a..920507fa5 100644 --- a/perl-install/partition_table/lvm.pm +++ b/perl-install/partition_table/lvm.pm @@ -1,4 +1,4 @@ -package partition_table::lvm; # $Id: $ +package partition_table::lvm; # LVM on full disk diff --git a/perl-install/partition_table/mac.pm b/perl-install/partition_table/mac.pm index 2922bc7a3..78e5469cd 100644 --- a/perl-install/partition_table/mac.pm +++ b/perl-install/partition_table/mac.pm @@ -1,4 +1,4 @@ -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 @@ -193,7 +193,7 @@ sub read_one { } sub write($$$;$) { - my ($hd, $sector, $pt, $info) = @_; + my ($hd, $_handle, $sector, $pt, $info) = @_; #- handle testing for writing partition table on file only! my $F; diff --git a/perl-install/partition_table/raw.pm b/perl-install/partition_table/raw.pm index 1346eeac4..453a19c6c 100644 --- a/perl-install/partition_table/raw.pm +++ b/perl-install/partition_table/raw.pm @@ -1,4 +1,4 @@ -package partition_table::raw; # $Id$ +package partition_table::raw; use diagnostics; use strict; @@ -11,16 +11,12 @@ use log; use c; my @MBR_signatures = ( -if_(arch() =~ /ppc/, - (map { [ 'yaboot', 0, "PM", 0x200 * $_ + 0x10, "bootstrap\0" ] } 0 .. 61), #- "PM" is a Partition Map - [ 'yaboot', 0x400, "BD", 0x424, "\011bootstrap" ], #- "BD" is a HFS filesystem -), [ 'empty', 0, "\0\0\0\0" ], [ 'grub', 0, "\xEBG", 0x17d, "stage1 \0" ], [ 'grub', 0, "\xEBH", 0x17e, "stage1 \0" ], [ 'grub', 0, "\xEBH", 0x18a, "stage1 \0" ], sub { my ($F) = @_; - #- standard grub has no good magic (Mandriva's grub is patched to have "GRUB" at offset 6) + #- standard grub has no good magic (Mageia's grub is patched to have "GRUB" at offset 6) #- so scanning a range of possible places where grub can have its string #- 0x176 found on Conectiva 10 my ($min, $max, $magic) = (0x176, 0x181, "GRUB \0"); @@ -29,6 +25,14 @@ if_(arch() =~ /ppc/, substr($tmp, 0, 2) eq "\xEBH" or return; index($tmp, $magic, $min) >= 0 && "grub"; }, + sub { my ($F) = @_; + #- similar to grub-legacy, grub2 doesn't seem to have good magic + #- so scanning a range of possible places where grub can have its string + my ($min, $max, $magic) = (0x176, 0x188, "GRUB"); + my $tmp; + sysseek($F, 0, 0) && sysread($F, $tmp, $max + length($magic)) or return; + index($tmp, $magic, $min) >= 0 && "grub2"; + }, [ 'lilo', 0x2, "LILO" ], [ 'lilo', 0x6, "LILO" ], [ 'lilo', 0x6 + 0x40, "LILO" ], #- when relocated in lilo's bsect_update(), variable "space" on paragraph boundary gives 0x40 @@ -73,20 +77,9 @@ sub last_usable_sector { sub max_partition_start { 1e99 } sub max_partition_size { 1e99 } -#- default method for starting a partition, only head size or twice -#- is allowed for starting a partition after a cylinder boundarie. -sub adjustStart($$) { - my ($hd, $part) = @_; - my $end = $part->{start} + $part->{size}; +#- default method for starting a partition +sub adjustStart($$) {} - if (cylinder_size($hd)) { - $part->{start} = round_up($part->{start}, - $part->{start} % cylinder_size($hd) < 2 * $hd->{geom}{sectors} ? - $hd->{geom}{sectors} : cylinder_size($hd)); - $part->{size} = $end - $part->{start}; - $part->{size} > 0 or die "adjustStart get a too small partition to handle correctly"; - } -} #- adjusting end to match a cylinder boundary, two methods are used and must #- match at the end, else something is wrong and nothing will be done on #- partition table. @@ -124,7 +117,19 @@ sub get_geometries { my (@hds) = @_; @hds = grep { - if (my $h = get_geometry($_->{file})) { + if ($_->{bus} =~ /dmraid/) { + sysopen(my $F, $_->{file}, 0); + my $total = c::total_sectors(fileno $F); + my %geom; + $geom{heads} = 255; + $geom{sectors} = 63; + $geom{start} = 1; + compute_nb_cylinders(\%geom, $total); + $geom{totalcylinders} = $geom{cylinders}; + log::l("Fake geometry on " . $_->{file} . ": heads=$geom{heads} sectors=$geom{sectors} cylinders=$geom{cylinders} start=$geom{start}"); + add2hash_($_, { totalsectors => $total, geom => \%geom }); + 1; + } elsif (my $h = get_geometry($_->{file})) { add2hash_($_, $h); 1; } else { @@ -221,23 +226,25 @@ sub raw_add { sub zero_MBR { &partition_table::initialize } #- deprecated -sub clear_existing { - my ($hd) = @_; - my @parts = (partition_table::get_normal_parts($hd), if_($hd->{primary}{extended}, $hd->{primary}{extended})); - partition_table::will_tell_kernel($hd, del => $_) foreach @parts; -} - #- deprecated sub zero_MBR_and_dirty { my ($hd) = @_; fsedit::partition_table_clear_and_initialize([], $hd); } +#- by default, we assume the kernel doesn't automatically reread partition table: +sub need_to_tell_kernel { + my ($_hd) = @_; + 1; +} + sub read_primary { my ($hd) = @_; - my ($pt, $info) = eval { $hd->read_one(0) } or return; + my ($pt, $info) = eval { $hd->read_one(0) }; + $pt or return; my $primary = partition_table::raw::pt_info_to_primary($hd, $pt, $info); + $primary->{is_hybrid_iso} = $hd->{current_pt_table_type} eq 'dos' && $hd->{fs_type_from_magic} eq 'iso9660'; $hd->{primary} = $primary; undef $hd->{extended}; partition_table::verifyPrimary($primary); @@ -261,7 +268,7 @@ sub pt_info_to_primary { #- try writing what we've just read, yells if it fails #- testing on last sector of head #0 (unused in 99% cases) #- -#- return false if the device can not be written to (especially for Smartmedia) +#- return false if the device cannot be written to (especially for Smartmedia) sub test_for_bad_drives { my ($hd) = @_; @@ -270,23 +277,33 @@ sub test_for_bad_drives { sub error { die "$_[0] error: $_[1]" } - my $F = openit($hd, $::testing ? 0 : 2) or error(openit($hd) ? 'write' : 'read', "can not open device"); + my $F = openit($hd, $::testing ? 0 : 2) or error(openit($hd) ? 'write' : 'read', "cannot open device"); my $seek = sub { c::lseek_sector(fileno($F), $sector, 0) or error('read', "seeking to sector $sector failed"); }; my $tmp; - &$seek; sysread $F, $tmp, $SECTORSIZE or error('read', "can not even read ($!)"); + &$seek; sysread $F, $tmp, $SECTORSIZE or error('read', "cannot even read ($!)"); return if $hd->{readonly} || $::testing; - &$seek; syswrite $F, $tmp or error('write', "can not even write ($!)"); + &$seek; syswrite $F, $tmp or error('write', "cannot even write ($!)"); my $tmp2; - &$seek; sysread $F, $tmp2, $SECTORSIZE or die "test_for_bad_drives: can not even read again ($!)"; + &$seek; sysread $F, $tmp2, $SECTORSIZE or die "test_for_bad_drives: cannot even read again ($!)"; $tmp eq $tmp2 or die -N("Something bad is happening on your drive. +N("Something bad is happening on your hard disk drive. A test to check the integrity of data has failed. It means writing anything on the disk will end up with random, corrupted data."); } +sub start_write { + my ($_hd) = @_; + 1; +} + +sub end_write { + my ($_hd, $_handle) = @_; + 1; +} + 1; diff --git a/perl-install/partition_table/readonly.pm b/perl-install/partition_table/readonly.pm index f36b60e4a..ee3624f88 100644 --- a/perl-install/partition_table/readonly.pm +++ b/perl-install/partition_table/readonly.pm @@ -1,4 +1,4 @@ -package partition_table::readonly; # $Id: $ +package partition_table::readonly; use diagnostics; use strict; diff --git a/perl-install/partition_table/sun.pm b/perl-install/partition_table/sun.pm index 1532c04a9..e665d0168 100644 --- a/perl-install/partition_table/sun.pm +++ b/perl-install/partition_table/sun.pm @@ -1,4 +1,4 @@ -package partition_table::sun; # $Id$ +package partition_table::sun; use diagnostics; use strict; @@ -119,7 +119,7 @@ sub read_one { # write the partition table (and extended ones) # for each entry, it uses fields: start, size, pt_type, active sub write($$$;$) { - my ($hd, $sector, $pt, $info) = @_; + my ($hd, $_handle, $sector, $pt, $info) = @_; # my ($csize, $wdsize) = (0, 0); #- handle testing for writing partition table on file only! |