package fs::loopback; # $Id$

use diagnostics;
use strict;

#-######################################################################################
#- misc imports
#-######################################################################################
use common;
use fs::type;
use fs;
use log;


sub check_circular_mounts {
    my ($part, $all_hds) = @_;

    my $fstab = [ fs::get::fstab($all_hds), $part ]; # no pb if $part is already in $all_hds

    my $base_mntpoint = $part->{mntpoint};
    my $check; $check = sub {
	my ($part, @seen) = @_;
	push @seen, $part->{mntpoint} || return;
	@seen > 1 && $part->{mntpoint} eq $base_mntpoint and die N("Circular mounts %s\n", join(", ", @seen));
	if (my $part = fs::get::up_mount_point($part->{mntpoint}, $fstab)) {
	    #- '/' carrier is a special case, it will be mounted first
	    $check->($part, @seen) if !fs::type::carry_root_loopback($part);
	}
	if (isLoopback($part)) {
	    $check->($part->{loopback_device}, @seen);
	}
    };
    $check->($part) if !($base_mntpoint eq '/' && isLoopback($part)); #- '/' is a special case, no loop check
}

sub carryRootCreateSymlink {
    my ($part) = @_;

    fs::type::carry_root_loopback($part) or return;

    my $mntpoint = fs::get::mntpoint_prefixed($part);
    unless (-e $mntpoint) {
	eval { mkdir_p(dirname($mntpoint)) };
	#- do non-relative link for install, should be changed to relative link before rebooting
	symlink "/initrd/loopfs", $mntpoint;

	mkdir_p("/initrd/loopfs/lnx4win/boot");
	symlink "/initrd/loopfs/lnx4win/boot", "$::prefix/boot";
    }
    #- indicate kernel to keep initrd
    mkdir_p("$::prefix/initrd");
}


sub format_part {
    my ($part) = @_;
    fs::mount::part($part->{loopback_device});
    create($part);
    fs::format::part_raw($part, undef);
}

sub create {
    my ($part) = @_;
    my $f = $part->{device} = fs::get::mntpoint_prefixed($part->{loopback_device}) . $part->{loopback_file};
    return if -e $f;

    eval { mkdir_p(dirname($f)) };

    log::l("creating loopback file $f ($part->{size} sectors)");

    my $block_size = 128;
    my $s = "\0" x (512 * $block_size);
    sysopen(my $F, $f, 2 | c::O_CREAT()) or die "failed to create loopback file";
    for (my $i = 0; $i < $part->{size}; $i += $block_size) {
	syswrite $F, $s or die "failed to create loopback file";
    }
}

sub getFree {
    my ($dir, $part) = @_;
    my $freespace = $dir ? 
      2 * (MDK::Common::System::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 not 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 $r = readlink "$::prefix/boot"; 
    unlink "$::prefix/boot"; 
    mkdir_p("$::prefix/boot");
    [$r, $::prefix];
}

sub save_boot {
    my ($loop_boot, $prefix) = @{$_[0]};
    
    $loop_boot or return;

    my @files = glob_("$prefix/boot/*");
    cp_af(@files, $loop_boot) if @files;
    rm_rf("$prefix/boot");
    symlink $loop_boot, "$prefix/boot";
}


1;

ion value='topic/mlcd4'>topic/mlcd4</option>
<option value='topic/ppp'>topic/ppp</option>
<option value='topic/rp-pppoe'>topic/rp-pppoe</option>
<option value='topic/switching_to_dnf'>topic/switching_to_dnf</option>
<option value='topic/switching_to_urpmi'>topic/switching_to_urpmi</option>
<option value='topic/unlabeled-1.1.1'>topic/unlabeled-1.1.1</option>
<option value='topic/v_webmin_0_87'>topic/v_webmin_0_87</option>
<option value='topic/x86_64-branch'>topic/x86_64-branch</option>
<option value='user/animtim/designWork'>user/animtim/designWork</option>
<option value='user/colin/rescue-systemd'>user/colin/rescue-systemd</option>
<option value='user/ennael/mga6'>user/ennael/mga6</option>
<option value='user/erwan/bug-13680'>user/erwan/bug-13680</option>
<option value='user/jibz/aarch64'>user/jibz/aarch64</option>
<option value='user/martinw/mga6'>user/martinw/mga6</option>
<option value='user/pterjan/arm64'>user/pterjan/arm64</option>
</select> <input type='submit' value='switch'/></form></td></tr>
<tr><td class='sub'>Mageia Installer and base platform for many utilities</td><td class='sub right'>Thierry Vignaud [tv]</td></tr></table>
<table class='tabs'><tr><td>
<a href='/software/drakx/?h=18.33'>summary</a><a href='/software/drakx/refs/?h=18.33&amp;id=39d9f894f15d207182b4758122db934ed55a59f5'>refs</a><a href='/software/drakx/log/perl-install/c/sbus.c?h=18.33'>log</a><a href='/software/drakx/tree/perl-install/c/sbus.c?h=18.33&amp;id=39d9f894f15d207182b4758122db934ed55a59f5'>tree</a><a class='active' href='/software/drakx/commit/perl-install/c/sbus.c?h=18.33&amp;id=39d9f894f15d207182b4758122db934ed55a59f5'>commit</a><a href='/software/drakx/diff/perl-install/c/sbus.c?h=18.33&amp;id=39d9f894f15d207182b4758122db934ed55a59f5'>diff</a><a href='/software/drakx/stats/perl-install/c/sbus.c?h=18.33'>stats</a></td><td class='form'><form class='right' method='get' action='/software/drakx/log/perl-install/c/sbus.c'>
<input type='hidden' name='h' value='18.33'/><input type='hidden' name='id' value='39d9f894f15d207182b4758122db934ed55a59f5'/><select name='qt'>
<option value='grep'>log msg</option>
<option value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='search' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='path'>path: <a href='/software/drakx/commit/?h=18.33&amp;id=39d9f894f15d207182b4758122db934ed55a59f5'>root</a>/<a href='/software/drakx/commit/perl-install?h=18.33&amp;id=39d9f894f15d207182b4758122db934ed55a59f5'>perl-install</a>/<a href='/software/drakx/commit/perl-install/c?h=18.33&amp;id=39d9f894f15d207182b4758122db934ed55a59f5'>c</a>/<a href='/software/drakx/commit/perl-install/c/sbus.c?h=18.33&amp;id=39d9f894f15d207182b4758122db934ed55a59f5'>sbus.c</a></div><div class='content'><div class='cgit-panel'><b>diff options</b><form method='get'><input type='hidden' name='h' value='18.33'/><input type='hidden' name='id' value='39d9f894f15d207182b4758122db934ed55a59f5'/><table><tr><td colspan='2'/></tr><tr><td class='label'>context:</td><td class='ctrl'><select name='context' onchange='this.form.submit();'><option value='1'>1</option><option value='2'>2</option><option value='3' selected='selected'>3</option><option value='4'>4</option><option value='5'>5</option><option value='6'>6</option><option value='7'>7</option><option value='8'>8</option><option value='9'>9</option><option value='10'>10</option><option value='15'>15</option><option value='20'>20</option><option value='25'>25</option><option value='30'>30</option><option value='35'>35</option><option value='40'>40</option></select></td></tr><tr><td class='label'>space:</td><td class='ctrl'><select name='ignorews' onchange='this.form.submit();'><option value='0' selected='selected'>include</option><option value='1'>ignore</option></select></td></tr><tr><td class='label'>mode:</td><td class='ctrl'><select name='dt' onchange='this.form.submit();'><option value='0' selected='selected'>unified</option><option value='1'>ssdiff</option><option value='2'>stat only</option></select></td></tr><tr><td/><td class='ctrl'><noscript><input type='submit' value='reload'/></noscript></td></tr></table></form></div><table summary='commit info' class='commit-info'>
<tr><th>author</th><td>Pablo Saratxaga &lt;pablo@mandriva.com&gt;</td><td class='right'>2004-08-23 09:48:02 +0000</td></tr>
<tr><th>committer</th><td>Pablo Saratxaga &lt;pablo@mandriva.com&gt;</td><td class='right'>2004-08-23 09:48:02 +0000</td></tr>
<tr><th>commit</th><td colspan='2' class='sha1'><a href='/software/drakx/commit/perl-install/c/sbus.c?h=18.33&amp;id=39d9f894f15d207182b4758122db934ed55a59f5'>39d9f894f15d207182b4758122db934ed55a59f5</a> (<a href='/software/drakx/patch/perl-install/c/sbus.c?id=39d9f894f15d207182b4758122db934ed55a59f5'>patch</a>)</td></tr>
<tr><th>tree</th><td colspan='2' class='sha1'><a href='/software/drakx/tree/?h=18.33&amp;id=39d9f894f15d207182b4758122db934ed55a59f5'>98634b70a7297927c5b0af3c2ebde20f21540262</a> /<a href='/software/drakx/tree/perl-install/c/sbus.c?h=18.33&amp;id=39d9f894f15d207182b4758122db934ed55a59f5'>perl-install/c/sbus.c</a></td></tr>
<tr><th>parent</th><td colspan='2' class='sha1'><a href='/software/drakx/commit/perl-install/c/sbus.c?h=18.33&amp;id=9d61bc13d96576e3aa02c6efff5bdad822c81cd8'>9d61bc13d96576e3aa02c6efff5bdad822c81cd8</a> (<a href='/software/drakx/diff/perl-install/c/sbus.c?h=18.33&amp;id=39d9f894f15d207182b4758122db934ed55a59f5&amp;id2=9d61bc13d96576e3aa02c6efff5bdad822c81cd8'>diff</a>)</td></tr><tr><th>download</th><td colspan='2' class='sha1'><a href='/software/drakx/snapshot/drakx-39d9f894f15d207182b4758122db934ed55a59f5.tar'>drakx-39d9f894f15d207182b4758122db934ed55a59f5.tar</a><br/><a href='/software/drakx/snapshot/drakx-39d9f894f15d207182b4758122db934ed55a59f5.tar.gz'>drakx-39d9f894f15d207182b4758122db934ed55a59f5.tar.gz</a><br/><a href='/software/drakx/snapshot/drakx-39d9f894f15d207182b4758122db934ed55a59f5.tar.bz2'>drakx-39d9f894f15d207182b4758122db934ed55a59f5.tar.bz2</a><br/><a href='/software/drakx/snapshot/drakx-39d9f894f15d207182b4758122db934ed55a59f5.tar.xz'>drakx-39d9f894f15d207182b4758122db934ed55a59f5.tar.xz</a><br/><a href='/software/drakx/snapshot/drakx-39d9f894f15d207182b4758122db934ed55a59f5.zip'>drakx-39d9f894f15d207182b4758122db934ed55a59f5.zip</a><br/></td></tr></table>
<div class='commit-subject'>updated pot file</div><div class='commit-msg'>