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&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&id=39d9f894f15d207182b4758122db934ed55a59f5'>tree</a><a class='active' href='/software/drakx/commit/perl-install/c/sbus.c?h=18.33&id=39d9f894f15d207182b4758122db934ed55a59f5'>commit</a><a href='/software/drakx/diff/perl-install/c/sbus.c?h=18.33&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&id=39d9f894f15d207182b4758122db934ed55a59f5'>root</a>/<a href='/software/drakx/commit/perl-install?h=18.33&id=39d9f894f15d207182b4758122db934ed55a59f5'>perl-install</a>/<a href='/software/drakx/commit/perl-install/c?h=18.33&id=39d9f894f15d207182b4758122db934ed55a59f5'>c</a>/<a href='/software/drakx/commit/perl-install/c/sbus.c?h=18.33&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 <pablo@mandriva.com></td><td class='right'>2004-08-23 09:48:02 +0000</td></tr> <tr><th>committer</th><td>Pablo Saratxaga <pablo@mandriva.com></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&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&id=39d9f894f15d207182b4758122db934ed55a59f5'>98634b70a7297927c5b0af3c2ebde20f21540262</a> /<a href='/software/drakx/tree/perl-install/c/sbus.c?h=18.33&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&id=9d61bc13d96576e3aa02c6efff5bdad822c81cd8'>9d61bc13d96576e3aa02c6efff5bdad822c81cd8</a> (<a href='/software/drakx/diff/perl-install/c/sbus.c?h=18.33&id=39d9f894f15d207182b4758122db934ed55a59f5&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'>