summaryrefslogtreecommitdiffstats
path: root/perl-install/fsedit.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/fsedit.pm')
-rw-r--r--perl-install/fsedit.pm335
1 files changed, 0 insertions, 335 deletions
diff --git a/perl-install/fsedit.pm b/perl-install/fsedit.pm
deleted file mode 100644
index c4e43e148..000000000
--- a/perl-install/fsedit.pm
+++ /dev/null
@@ -1,335 +0,0 @@
-package fsedit;
-
-use diagnostics;
-use strict;
-
-#-######################################################################################
-#- misc imports
-#-######################################################################################
-use common qw(:common :constant :functional);
-use partition_table qw(:types);
-use partition_table_raw;
-use Data::Dumper;
-use devices;
-use log;
-
-#-#####################################################################################
-#- Globals
-#-#####################################################################################
-my @suggestions = (
- { mntpoint => "/boot", minsize => 10 << 11, size => 16 << 11, type => 0x83 },
- { mntpoint => "/", minsize => 50 << 11, size => 100 << 11, type => 0x83 },
- { mntpoint => "swap", minsize => 30 << 11, size => 60 << 11, type => 0x82 },
- { mntpoint => "/usr", minsize => 200 << 11, size => 600 << 11, type => 0x83 },
- { mntpoint => "/home", minsize => 50 << 11, size => 200 << 11, type => 0x83 },
- { mntpoint => "/var", minsize => 200 << 11, size => 250 << 11, type => 0x83 },
- { mntpoint => "/tmp", minsize => 50 << 11, size => 100 << 11, type => 0x83 },
- { mntpoint => "/mnt/iso", minsize => 700 << 11, size => 800 << 11, type => 0x83 },
-);
-my @suggestions_mntpoints = qw(/mnt/dos);
-
-
-#-######################################################################################
-#- Functions
-#-######################################################################################
-sub suggestions_mntpoint($) {
- my ($hds) = @_;
- sort grep { !/swap/ && !has_mntpoint($_, $hds) }
- (@suggestions_mntpoints, map { $_->{mntpoint} } @suggestions);
-}
-
-sub hds($$) {
- my ($drives, $flags) = @_;
- my @hds;
- my $rc;
-
- foreach (@$drives) {
- my $file = devices::make($_->{device});
-
- my $hd = partition_table_raw::get_geometry($file) or die _("An error occurred while getting the geometry of block device %s: %s", $file, "$!");
- $hd = { (%$_, %$hd) };
- $hd->{file} = $file;
- $hd->{prefix} = $hd->{device};
- # for RAID arrays of format c0d0p1
- $hd->{prefix} .= "p" if $hd->{prefix} =~ m,(rd|ida)/,;
-
- eval { partition_table::read($hd, $flags->{clearall}) };
- if ($@) {
- cdie($@) unless $flags->{eraseBadPartitions};
- partition_table_raw::zero_MBR($hd);
- }
- push @hds, $hd;
- }
- [ @hds ];
-}
-
-sub get_fstab(@) {
- map { partition_table::get_normal_parts($_) } @_;
-}
-
-sub get_root($) {
- my ($fstab) = @_;
- $_->{mntpoint} eq "/" and return $_ foreach @$fstab;
- undef;
-}
-sub get_root_ { get_root([ get_fstab(@{$_[0]}) ]) }
-
-sub suggest_part($$$;$) {
- my ($hd, $part, $hds, $suggestions) = @_;
- $suggestions ||= \@suggestions;
- foreach (@$suggestions) { $_->{minsize} ||= $_->{size} }
-
- my $has_swap = grep { isSwap($_) } get_fstab(@$hds);
-
- my ($best, $second) =
- grep { $part->{size} >= $_->{minsize} }
- grep { ! has_mntpoint($_->{mntpoint}, $hds) || isSwap($_) && !$has_swap }
- @$suggestions or return;
-
- $best = $second if
- $best->{mntpoint} eq '/boot' &&
- $part->{start} + $best->{minsize} > 1024 * partition_table::cylinder_size($hd); #- if the empty slot is beyond the 1024th cylinder, no use having /boot
-
- defined $best or return; #- sorry no suggestion :(
-
- $part->{mntpoint} = $best->{mntpoint};
- $part->{type} = $best->{type};
- $part->{size} = min($part->{size}, $best->{size});
- 1;
-}
-
-
-#-sub partitionDrives {
-#-
-#- my $cmd = "/sbin/fdisk";
-#- -x $cmd or $cmd = "/usr/bin/fdisk";
-#-
-#- my $drives = findDrivesPresent() or die "You don't have any hard drives available! You probably forgot to configure a SCSI controller.";
-#-
-#- foreach (@$drives) {
-#- my $text = "/dev/" . $_->{device};
-#- $text .= " - SCSI ID " . $_->{id} if $_->{device} =~ /^sd/;
-#- $text .= " - Model " . $_->{info};
-#- $text .= " array" if $_->{device} =~ /^c.d/;
-#-
-#- #- truncate at 50 columns for now
-#- $text = substr $text, 0, 50;
-#- }
-#- #-TODO TODO
-#-}
-
-
-sub has_mntpoint($$) {
- my ($mntpoint, $hds) = @_;
- scalar grep { $mntpoint eq $_->{mntpoint} } get_fstab(@$hds);
-}
-
-#- do this before modifying $part->{mntpoint}
-#- $part->{mntpoint} should not be used here, use $mntpoint instead
-sub check_mntpoint {
- my ($mntpoint, $hd, $part, $hds) = @_;
-
- $mntpoint eq '' || isSwap($part) and return;
-
- local $_ = $mntpoint;
- m|^/| or die _("Mount points must begin with a leading /");
-#- m|(.)/$| and die "The mount point $_ is illegal.\nMount points may not end with a /";
-
- has_mntpoint($mntpoint, $hds) and die _("There is already a partition with mount point %s", $mntpoint);
-
- if ($part->{start} + $part->{size} > 1024 * partition_table::cylinder_size($hd)) {
- die "/boot ending on cylinder > 1024" if $mntpoint eq "/boot";
- die "/ ending on cylinder > 1024" if $mntpoint eq "/" && !has_mntpoint("/boot", $hds);
- }
-}
-
-sub add($$$;$) {
- my ($hd, $part, $hds, $options) = @_;
-
- isSwap($part) ?
- ($part->{mntpoint} = 'swap') :
- $options->{force} || check_mntpoint($part->{mntpoint}, $hd, $part, $hds);
-
- partition_table::add($hd, $part, $options->{primaryOrExtended});
-}
-
-sub removeFromList($$$) {
- my ($start, $end, $list) = @_;
- my $err = "error in removeFromList: removing an non-free block";
-
- for (my $i = 0; $i < @$list; $i += 2) {
- $start < $list->[$i] and die $err;
- $start > $list->[$i + 1] and next;
-
- if ($start == $list->[$i]) {
- $end > $list->[$i + 1] and die $err;
- if ($end == $list->[$i + 1]) {
- #- the free block is just the same size, removing it
- splice(@$list, 0, 2);
- } else {
- #- the free block now start just after this block
- $list->[$i] = $end;
- }
- } else {
- $end <= $list->[$i + 1] or die $err;
- if ($end < $list->[$i + 1]) {
- splice(@$list, $i + 2, 0, $end, $list->[$i + 1]);
- }
- $list->[$i + 1] = $start; #- shorten the free block
- }
- return;
- }
-}
-
-
-sub allocatePartitions($$) {
- my ($hds, $to_add) = @_;
- my %free_sectors = map { $_->{device} => [1, $_->{totalsectors} ] } @$hds; #- first sector is always occupied by the MBR
- my $remove = sub { removeFromList($_[0]{start}, $_[0]->{start} + $_[0]->{size}, $free_sectors{$_[0]->{rootDevice}}) };
- my $success = 0;
-
- foreach (get_fstab(@$hds)) { &$remove($_); }
-
- FSTAB: foreach (@$to_add) {
- my %e = %$_;
- foreach my $hd (@$hds) {
- my $v = $free_sectors{$hd->{device}};
- for (my $i = 0; $i < @$v; $i += 2) {
- my $size = $v->[$i + 1] - $v->[$i];
- $e{size} > $size and next;
-
- if ($v->[$i] + $e{size} > 1024 * partition_table::cylinder_size($hd)) {
- next if $e{mntpoint} eq "/boot" ||
- $e{mntpoint} eq "/" && !has_mntpoint("/boot", $hds);
- }
- $e{start} = $v->[$i];
- $e{rootDevice} = $hd->{device};
- partition_table::adjustStartAndEnd($hd, \%e);
- &$remove(\%e);
- partition_table::add($hd, \%e);
- $success++;
- next FSTAB;
- }
- }
- log::ld("can't allocate partition $e{mntpoint} of size $e{size}, not enough room");
- }
- $success;
-}
-
-sub auto_allocate($;$) {
- my ($hds, $suggestions) = @_;
- allocatePartitions($hds, [
- grep { ! has_mntpoint($_->{mntpoint}, $hds) }
- @{ $suggestions || \@suggestions }
- ]);
- map { partition_table::assign_device_numbers($_) } @$hds;
-}
-
-sub undo_prepare($) {
- my ($hds) = @_;
- $Data::Dumper::Purity = 1;
- foreach (@$hds) {
- my @h = @{$_}{@partition_table::fields2save};
- push @{$_->{undo}}, Data::Dumper->Dump([\@h], ['$h']);
- }
-}
-sub undo_forget($) {
- my ($hds) = @_;
- pop @{$_->{undo}} foreach @$hds;
-}
-
-sub undo($) {
- my ($hds) = @_;
- foreach (@$hds) {
- my $h; eval pop @{$_->{undo}} || next;
- @{$_}{@partition_table::fields2save} = @$h;
-
- $_->{isDirty} = $_->{needKernelReread} = 1;
- }
-}
-
-sub move {
- my ($hd, $part, $hd2, $sector2) = @_;
-
- my $part2 = { %$part };
- $part2->{start} = $sector2;
- $part2->{size} += partition_table::cylinder_size($hd2) - 1;
- partition_table::remove($hd, $part);
- {
- local ($part2->{notFormatted}, $part2->{isFormatted}); #- do not allow partition::add to change this
- partition_table::add($hd2, $part2);
- }
-
- return if $part2->{notFormatted} && !$part2->{isFormatted} || $::testing;
-
- local (*F, *G);
- sysopen F, $hd->{file}, 0 or die '';
- sysopen G, $hd2->{file}, 2 or die _("Error opening %s for writing: %s", $hd2->{file}, "$!");
-
- my $base = $part->{start};
- my $base2 = $part2->{start};
- my $step = 1 << 10;
- if ($hd eq $hd2) {
- $part->{start} == $part2->{start} and return;
- $step = min($step, abs($part->{start} - $part2->{start}));
-
- if ($part->{start} < $part2->{start}) {
- $base += $part->{size} - $step;
- $base2 += $part->{size} - $step;
- $step = -$step;
- }
- }
-
- my $f = sub {
- c::lseek_sector(fileno(F), $base, 0) or die "seeking to sector $base failed on drive $hd->{device}";
- c::lseek_sector(fileno(G), $base2, 0) or die "seeking to sector $base2 failed on drive $hd2->{device}";
-
- my $buf;
- sysread F, $buf, $SECTORSIZE * abs($_[0]) or die '';
- syswrite G, $buf;
- };
-
- for (my $i = 0; $i < $part->{size} / abs($step); $i++, $base += $step, $base2 += $step) {
- &$f($step);
- }
- if (my $v = $part->{size} % abs($step) * sign($step)) {
- $base += $v;
- $base2 += $v;
- &$f($v);
- }
-}
-
-sub rescuept($) {
- my ($hd) = @_;
- my ($ext, @hd);
-
- my $dev = devices::make($hd->{device});
- open F, "rescuept $dev|";
- foreach (<F>) {
- my ($st, $si, $id) = /start=\s*(\d+),\s*size=\s*(\d+),\s*Id=\s*(\d+)/ or next;
- my $part = { start => $st, size => $si, type => hex($id) };
- if (isExtended($part)) {
- $ext = $part;
- } else {
- push @hd, $part;
- }
- }
- close F or die "rescuept failed";
-
- partition_table_raw::zero_MBR($hd);
- foreach (@hd) {
- my $b = partition_table::verifyInside($_, $ext);
- if ($b) {
- $_->{start}--;
- $_->{size}++;
- }
- local $b->{notFormatted};
-
- partition_table::add($hd, $_, ($b ? 'Extended' : 'Primary'), 1);
- }
-}
-
-#-######################################################################################
-#- Wonderful perl :(
-#-######################################################################################
-1; #