#!/usr/bin/perl
#
# Guillaume Cottenceau
#
# Copyright 2001-2005 Mandriva
#
# This software may be freely redistributed under the terms of the GNU
# public license.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#

use lib qw(/usr/lib/libDrakX);
use common;
use fs;
use fs::proc_partitions;
use fs::type;


my @proc_mounts = fs::read_fstab('', '/proc/mounts');

my $target = '/mnt';

if (fs::get::mntpoint2part($target, \@proc_mounts)) {
    print STDERR "$target is already mounted (according to /proc/mounts)\n";
    exit 0;
}

system('drvinst', 'STORAGE');

print STDERR "\nPlease wait, trying to find your root device...\n";

mkdir_p($target);

my @parts = map {
    $_->{device} = delete $_->{dev};
    put_in_hash($_, fs::type::type_subpart_from_magic($_));   
} fs::proc_partitions::read_raw();
my ($raid_parts, $normal_parts) = partition { isRawRAID($_) } @parts;

if (@$raid_parts) {
    require raid;
    raid::detect_during_install_once(@$raid_parts);
    my $raids = raid::get_existing(@$raid_parts);
    push @$normal_parts, @$raids;
}

my @fstab;
my $root;

foreach (@$normal_parts) {
    my $dev = devices::make($_->{device});

    my $fs = find {
	system("mount -t $_ $dev $target 2>/dev/null") == 0;
    } fs::type::true_local_fs_types() or next;

    if (my $release_file = common::release_file($target)) {
	print STDERR "=> found a Mandriva Linux root partition on $dev\n=> type $fs, version `",
	  chomp_(cat_("$target$release_file")), "'\n";
	@fstab = fs::read_fstab($target, '/etc/fstab');
	$root = $dev;
	last;
    } else {
	system('umount', $target) == 0 or die "error unmounting $target\n";
    }
}

if ($root) {
    print STDERR "\nMounting other partitions from fstab on $target...\n";
    foreach (@fstab) {
	my ($valued_options, $options) = fs::mount_options::unpack($_);

	next if 
	  !$_->{fs_type} || $_->{device} eq 'none'
	    || $valued_options->{noauto}
	    || $_->{mntpoint} eq '/'
	    || member($_->{fs_type}, 'swap', 'nfs', 'ntfs');

	delete $valued_options->{'iocharset='};
	delete $valued_options->{'codepage='};
	fs::mount_options::pack($_, $valued_options, $options); #- vfat opts, we don't have the modules in rescue

	my $where = "$target$_->{mntpoint}";
	mkdir_p($where);
	print STDERR "\t$_->{device} on $where type $_->{fs_type} options $_->{options}\n";
	system("mount -t $_->{fs_type} /dev/$_->{device} $where -o $_->{options}");
	system("cp -f /etc/mtab $target/etc/mtab"); #- to allow a nice chrooted "mount" or "df"
    }
    print STDERR "\nYour system is ready on $target.\n\n";
} else {
    die "Could not find your root device :-(.\n";
}