diff options
Diffstat (limited to 'perl-install/loopback.pm')
-rw-r--r-- | perl-install/loopback.pm | 128 |
1 files changed, 35 insertions, 93 deletions
diff --git a/perl-install/loopback.pm b/perl-install/loopback.pm index 1a90e1091..d992f4dec 100644 --- a/perl-install/loopback.pm +++ b/perl-install/loopback.pm @@ -6,7 +6,7 @@ use strict; #-###################################################################################### #- misc imports #-###################################################################################### -use common qw(:common :system :file :functional); +use common qw(:common :system :file); use partition_table qw(:types); use commands; use fs; @@ -19,123 +19,65 @@ sub file { $part->{loopback_file}; } +sub ffile { "$_[0]{device}{mntpoint}$_[0]{loopback_file}" } + sub loopbacks { map { map { @{$_->{loopback} || []} } partition_table::get_normal_parts($_) } @_; } -sub carryRootLoopback { - my ($part) = @_; - $_->{mntpoint} eq '/' and return 1 foreach @{$part->{loopback} || []}; - 0; -} - -sub carryRootCreateSymlink { - my ($part, $prefix) = @_; - - carryRootLoopback($part) or return; - - my $mntpoint = "$prefix$part->{mntpoint}"; - unless (-e $mntpoint) { - eval { commands::mkdir_("-p", dirname($mntpoint)) }; - #- do non-relative link for install, should be changed to relative link before rebooting - symlink "/initrd/loopfs", $mntpoint; - - commands::mkdir_("-p", "/initrd/loopfs/lnx4win/boot"); - symlink "/initrd/loopfs/lnx4win/boot", "$prefix/boot"; - } - #- indicate kernel to keep initrd - mkdir "$prefix/initrd", 0755; -} - - sub format_part { - my ($part, $prefix) = @_; + my ($part) = @_; + my $prefix = $::isStandalone ? '' : $::o->{prefix}; fs::mount_part($part->{device}, $prefix); - my $f = create($part, $prefix); + my $f = create($part); local $part->{device} = $f; fs::real_format_part($part); } sub create { - my ($part, $prefix) = @_; - my $f = "$prefix$part->{device}{mntpoint}$part->{loopback_file}"; + my ($part) = @_; + my $f = "$part->{device}{mntpoint}$part->{loopback_file}"; return $f if -e $f; eval { commands::mkdir_("-p", dirname($f)) }; - - log::l("creating loopback file $f ($part->{size} sectors)"); - + local *F; - sysopen F, $f, 2 | c::O_CREAT() or die "failed to create loopback file"; - sysseek F, ($part->{size} << 9) - 1, 0 or die "failed to create loopback file"; - syswrite F, "\0" or die "failed to create loopback file"; + open F, ">$f" or die "failed to create loopback file"; + for (my $nb = $part->{size}; $nb >= 0; $nb -= 8) { #- 8 * 512 = 4096 :) + print F "\0" x 4096; + } $f; } -sub inspect { - my ($part, $prefix, $rw) = @_; +sub getFree { + my ($part, $prefix) = @_; - isMountableRW($part) or return; + unless ($part->{freespace}) { + $part->{isFormatted} || !$part->{notFormatted} or return; + isMountableRW($part) or return; - my $dir = "/tmp/loopback_tmp"; + my $dir = "/tmp/loopback_tmp"; + if ($part->{isMounted}) { + $dir = ($prefix || '') . $part->{mntpoint}; + } else { + mkdir $dir, 0700; + fs::mount($part->{device}, $dir, type2fs($part->{type}), 'rdonly'); + } + my $buf = ' ' x 20000; + syscall_('statfs', $dir, $buf) or return; + my (undef, $blocksize, $size, undef, $free, undef) = unpack "L2L4", $buf; + $_ *= $blocksize / 512 foreach $size, $free; - if ($part->{isMounted}) { - $dir = ($prefix || '') . $part->{mntpoint}; - } elsif ($part->{notFormatted} && !$part->{isFormatted}) { - $dir = ''; - } else { - mkdir $dir, 0700; - fs::mount($part->{device}, $dir, type2fs($part->{type}), !$rw); - } - my $h = before_leaving { - if (!$part->{isMounted} && $dir) { + + unless ($part->{isMounted}) { fs::umount($dir); - unlink($dir) + unlink $dir; } - }; - $h->{dir} = $dir; - $h; -} - -sub getFree { - my ($dir, $part) = @_; - my $freespace = $dir ? - 2 * (common::df($dir))[1] : #- df in KiB - $part->{size}; - - $freespace - sum map { $_->{size} } @{$part->{loopback} || []}; -} - -#- returns the size of the loopback file if it already exists -#- returns -1 is the loopback file can't be used -sub verifFile { - my ($dir, $file, $part) = @_; - -e "$dir$file" and return -s "$dir$file"; - $_->{loopback_file} eq $file and return -1 foreach @{$part->{loopback} || []}; - - undef; -} - -sub prepare_boot { - my ($prefix) = @_; - my $r = readlink "$prefix/boot"; - unlink "$prefix/boot"; - mkdir "$prefix/boot", 0755; - [$r, $prefix]; -} - -sub save_boot { - my ($loop_boot, $prefix) = @{$_[0]}; - - $loop_boot or return; - - my @files = glob_("$prefix/boot/*"); - commands::cp("-f", @files, $loop_boot) if @files; - commands::rm("-rf", "$prefix/boot"); - symlink $loop_boot, "$prefix/boot"; + $part->{freespace} = $free; + } + $part->{freespace} - sum map { $_->{size} } @{$part->{loopback} || []}; } - 1; |