diff options
Diffstat (limited to 'perl-install/resize_fat/fat.pm')
-rw-r--r-- | perl-install/resize_fat/fat.pm | 50 |
1 files changed, 12 insertions, 38 deletions
diff --git a/perl-install/resize_fat/fat.pm b/perl-install/resize_fat/fat.pm index 67c64165c..83426471a 100644 --- a/perl-install/resize_fat/fat.pm +++ b/perl-install/resize_fat/fat.pm @@ -12,17 +12,10 @@ use resize_fat::c_rewritten; sub read($) { my ($fs) = @_; - @{$fs->{fats}} = map { - my $fat = eval { resize_fat::io::read($fs, $fs->{fat_offset} + $_ * $fs->{fat_size}, $fs->{fat_size}) }; - $@ and die "reading fat #$_ failed"; - vec($fat, 0, 8) == $fs->{media} or die "FAT $_ has invalid signature"; - $fat; - } (0 .. $fs->{nb_fats} - 1); - - $fs->{fat} = $fs->{fats}[0]; + resize_fat::c_rewritten::read_fat(fileno $fs->{fd}, $fs->{fat_offset}, $fs->{fat_size}, $fs->{media}); @{$fs->{clusters}{count}}{qw(free bad used)} = - resize_fat::c_rewritten::scan_fat($fs->{fat}, $fs->{nb_clusters}, $fs->{fs_type_size}); + resize_fat::c_rewritten::scan_fat($fs->{nb_clusters}, $fs->{fs_type_size}); } sub write($) { @@ -30,7 +23,7 @@ sub write($) { sysseek $fs->{fd}, $fs->{fat_offset}, 0 or die "write_fat: seek failed"; foreach (1..$fs->{nb_fats}) { - syswrite $fs->{fd}, $fs->{fat} or die "write_fat: write failed"; + resize_fat::c_rewritten::write_fat(fileno $fs->{fd}, $fs->{fat_size}); } } @@ -43,7 +36,7 @@ sub write($) { sub allocate_remap { my ($fs, $cut_point) = @_; my ($cluster, $new_cluster); - my $remap = sub { $fs->{fat_remap}[$cluster] = $new_cluster; }; + my $remap = sub { resize_fat::c_rewritten::set_fat_remap($cluster, $new_cluster) }; my $get_new = sub { $new_cluster = get_free($fs); 0 < $new_cluster && $new_cluster < $cut_point or die "no free clusters"; @@ -51,7 +44,8 @@ sub allocate_remap { #-log::ld("resize_fat: [$cluster,", &next($fs, $cluster), "...]->$new_cluster..."); }; - $fs->{fat_remap}[0] = 0; + resize_fat::c_rewritten::allocate_fat_remap($fs->{fat_size}); + $fs->{last_free_cluster} = 2; for ($cluster = 2; $cluster < $fs->{nb_clusters} + 2; $cluster++) { if ($cluster < $cut_point) { @@ -76,30 +70,19 @@ sub update { for (my $cluster = 2; $cluster < $fs->{nb_clusters} + 2; $cluster++) { if (resize_fat::c_rewritten::flag($cluster)) { my $old_next = &next($fs, $cluster); - my $new = $fs->{fat_remap}[$cluster]; - my $new_next = $fs->{fat_remap}[$old_next]; + my $new = resize_fat::c_rewritten::fat_remap($cluster); + my $new_next = resize_fat::c_rewritten::fat_remap($old_next); set_available($fs, $cluster); is_eof($old_next) ? set_eof($fs, $new) : - set_next($fs, $new, $new_next); + set_next ($fs, $new, $new_next); } } } -#- - compares the two FATs (one's a backup that should match) - skips first entry -#- - its just a signature (already checked above) NOTE: checks for cross-linking -#- are done in count.c -sub check($) { - my ($fs) = @_; - return; - foreach (@{$fs->{fats}}) { - $_ eq $fs->{fats}[0] or die "FAT tables do not match"; - } -} - sub endianness16($) { (($_[0] & 0xff) << 8) + ($_[0] >> 8); } sub endianness($$) { my ($val, $nb_bits) = @_; @@ -113,18 +96,9 @@ sub endianness($$) { $r; } -#-sub next($$) { -#- my ($fs, $cluster) = @_; -#- $cluster > $fs->{nb_clusters} + 2 and die "fat::next: cluster $cluster outside filesystem"; -#- endianness(vec($fs->{fat}, $cluster, $fs->{fs_type_size}), $fs->{fs_type_size}); -#-} *next = \&resize_fat::c_rewritten::next; +*set_next = \&resize_fat::c_rewritten::set_next; -sub set_next($$$) { - my ($fs, $cluster, $new_v) = @_; - $cluster > $fs->{nb_clusters} + 2 and die "fat::set_next: cluster $cluster outside filesystem"; - vec($fs->{fat}, $cluster, $fs->{fs_type_size}) = endianness($new_v, $fs->{fs_type_size}); -} sub get_free($) { @@ -143,7 +117,7 @@ sub is_eof($) { } sub set_eof($$) { my ($fs, $cluster) = @_; - set_next($fs, $cluster, $resize_fat::bad_cluster_value + 1); + set_next ($fs, $cluster, $resize_fat::bad_cluster_value + 1); } #- returns true if <cluster> is empty. Note that this includes bad clusters. @@ -159,5 +133,5 @@ sub is_available($) { } sub set_available($$) { my ($fs, $cluster) = @_; - set_next($fs, $cluster, 0); + set_next ($fs, $cluster, 0); } |