diff options
-rw-r--r-- | perl-install/Xconfigurator.pm | 3 | ||||
-rw-r--r-- | perl-install/any.pm | 26 | ||||
-rw-r--r-- | perl-install/bootloader.pm | 3 | ||||
-rw-r--r-- | perl-install/common.pm | 2 | ||||
-rw-r--r-- | perl-install/detect_devices.pm | 9 | ||||
-rw-r--r-- | perl-install/fs.pm | 6 | ||||
-rw-r--r-- | perl-install/fsedit.pm | 25 | ||||
-rw-r--r-- | perl-install/install2.pm | 8 | ||||
-rw-r--r-- | perl-install/install_any.pm | 49 | ||||
-rw-r--r-- | perl-install/install_interactive.pm | 50 | ||||
-rw-r--r-- | perl-install/install_steps.pm | 12 | ||||
-rw-r--r-- | perl-install/install_steps_auto_install.pm | 2 | ||||
-rw-r--r-- | perl-install/install_steps_interactive.pm | 122 | ||||
-rw-r--r-- | perl-install/loopback.pm | 25 | ||||
-rw-r--r-- | perl-install/modules.pm | 104 | ||||
-rw-r--r-- | perl-install/printerdrake.pm | 2 |
16 files changed, 216 insertions, 232 deletions
diff --git a/perl-install/Xconfigurator.pm b/perl-install/Xconfigurator.pm index 4fd969ef4..5c61322c0 100644 --- a/perl-install/Xconfigurator.pm +++ b/perl-install/Xconfigurator.pm @@ -148,8 +148,9 @@ sub keepOnlyLegalModes { sub cardConfigurationAuto() { my $card; - if (my ($c) = (detect_devices::matching_type("DISPLAY"))) { + if (my ($c) = detect_devices::probeall()) { local $_ = $c->{driver}; + /(Card|Server):/ or next; $card->{type} = $1 if /Card:(.*)/; $card->{server} = $1 if /Server:(.*)/; $card->{flags}{needVideoRam} &&= /86c368/; diff --git a/perl-install/any.pm b/perl-install/any.pm index 1c0d9c368..68f7ac515 100644 --- a/perl-install/any.pm +++ b/perl-install/any.pm @@ -10,7 +10,9 @@ use vars qw(@users); use common qw(:common :system :file :functional); use commands; use detect_devices; +use partition_table qw(:types); use fsedit; +use fs; use run_program; use log; @@ -253,6 +255,30 @@ sub shells { grep { -x "$prefix$_" } map { chomp; $_ } cat_("$prefix/etc/shells"); } +sub inspect { + my ($part, $prefix, $rw) = @_; + + isMountableRW($part) or return; + + my $dir = "/tmp/inspect_tmp_dir"; + + 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) { + fs::umount($dir); + unlink($dir) + } + }; + $h->{dir} = $dir; + $h; +} 1; diff --git a/perl-install/bootloader.pm b/perl-install/bootloader.pm index f3fe2cd59..97e3ecd04 100644 --- a/perl-install/bootloader.pm +++ b/perl-install/bootloader.pm @@ -10,6 +10,7 @@ use vars qw(%vga_modes); use common qw(:common :file :functional :system); use partition_table qw(:types); use log; +use any; use fsedit; use loopback; use commands; @@ -632,7 +633,7 @@ sub install_loadlin { my ($winpart) = grep { $_->{device_windobe} eq 'C' } @$fstab; log::l("winpart is $winpart->{device}"); - my $winhandle = loopback::inspect($winpart, $prefix, 'rw'); + my $winhandle = any::inspect($winpart, $prefix, 'rw'); my $windrive = $winhandle->{dir}; log::l("windrive is $windrive"); diff --git a/perl-install/common.pm b/perl-install/common.pm index 779cec099..89d41b516 100644 --- a/perl-install/common.pm +++ b/perl-install/common.pm @@ -337,7 +337,7 @@ sub list_home() { } sub list_skels { my ($prefix, $suffix) = @_; - map { "$prefix$_$suffix" } '/etc/skel', '/root', list_home() } + map { "$prefix$_/$suffix" } '/etc/skel', '/root', list_home() } sub translate { my ($s) = @_; diff --git a/perl-install/detect_devices.pm b/perl-install/detect_devices.pm index 5aa50aeeb..54893ade3 100644 --- a/perl-install/detect_devices.pm +++ b/perl-install/detect_devices.pm @@ -192,21 +192,12 @@ sub hasNetDevice($) { c::hasNetDevice($_[0]) } # pci_probing::main::probe with $probe_type is unsafe for pci! (bug in kernel&hardware) # get_pcmcia_devices provides field "device", used in network.pm # => probeall with $probe_type is unsafe -# => matching_type is unsafe sub probeall { my ($probe_type, $pcic) = @_; require pci_probing::main; require sbus_probing::main; pci_probing::main::probe($probe_type), sbus_probing::main::probe(), modules::get_pcmcia_devices($pcic); } -sub matching_type { - my ($type, $pcic) = @_; - grep { - my $ok = $_->{driver} !~ /(unknown|ignore)/; - $ok or log::l("skipping $_->{description}, no module available (if you know one, please mail pixel\@linux-mandrake.com)"); - $ok - } grep { $_->{type} =~ /$type/i } probeall($type, $pcic); -} sub matching_desc { my ($regexp) = @_; grep { $_->{description} =~ /$regexp/i } probeall(); diff --git a/perl-install/fs.pm b/perl-install/fs.pm index 3d9628071..c23ee948f 100644 --- a/perl-install/fs.pm +++ b/perl-install/fs.pm @@ -60,10 +60,10 @@ sub check_mounted($) { } } -sub get_mntpoints_from_fstab($) { - my ($fstab) = @_; +sub get_mntpoints_from_fstab { + my ($fstab, $prefix) = @_; - foreach (read_fstab('/etc/fstab')) { + foreach (read_fstab("$prefix/etc/fstab")) { foreach my $p (@$fstab) { $p->{device} eq $_->{device} or next; $p->{mntpoint} ||= $_->{mntpoint}; diff --git a/perl-install/fsedit.pm b/perl-install/fsedit.pm index edaadab88..813eb37e8 100644 --- a/perl-install/fsedit.pm +++ b/perl-install/fsedit.pm @@ -44,12 +44,12 @@ arch() !~ /^sparc/ ? ( ) : (), ); -sub typeOfPart($) { typeFromMagic(devices::make($_[0]), @partitions_signatures) } +sub typeOfPart { typeFromMagic(devices::make($_[0]), @partitions_signatures) } #-###################################################################################### #- Functions #-###################################################################################### -sub hds($$) { +sub hds { my ($drives, $flags) = @_; my @hds; my $rc; @@ -98,16 +98,16 @@ sub readProcPartitions { } #- get all normal partition including special ones as found on sparc. -sub get_fstab(@) { +sub get_fstab { loopback::loopbacks(@_), map { partition_table::get_normal_parts($_) } @_ } #- get normal partition that should be visible for working on. -sub get_visible_fstab(@) { +sub get_visible_fstab { grep { $_ && !partition_table::isWholedisk($_) && !partition_table::isHiddenMacPart($_) } map { partition_table::get_normal_parts($_) } @_; } -sub free_space(@) { +sub free_space { sum map { $_->{size} } map { partition_table::get_holes($_) } @_; } @@ -117,7 +117,7 @@ sub hasRAID { $b; } -sub get_root($;$) { +sub get_root { my ($fstab, $boot) = @_; if ($boot) { $_->{mntpoint} eq "/boot" and return $_ foreach @$fstab; } $_->{mntpoint} eq "/" and return $_ foreach @$fstab; @@ -134,7 +134,7 @@ sub is_one_big_fat { } -sub computeSize($$$$) { +sub computeSize { my ($part, $best, $hds, $suggestions) = @_; my $max = $part->{maxsize} || $part->{size}; return min($max, $best->{size}) unless $best->{ratio}; @@ -170,8 +170,8 @@ sub computeSize($$$$) { if (grep { $_->{size} < $max - $size } @L) { $size } else { $max } } -sub suggest_part($$$;$) { - my ($hd, $part, $hds, $suggestions) = @_; +sub suggest_part { + my ($part, $hds, $suggestions) = @_; $suggestions ||= \@suggestions; @@ -181,7 +181,7 @@ sub suggest_part($$$;$) { grep { !$_->{maxsize} || $part->{size} <= $_->{maxsize} } grep { $_->{size} <= ($part->{maxsize} || $part->{size}) } grep { !has_mntpoint($_->{mntpoint}, $hds) || isSwap($_) && !$has_swap } - grep { !$_->{hd} || $_->{hd} eq $hd->{device} } + grep { !$_->{hd} || $_->{hd} eq $part->{rootDevice} } grep { !$part->{type} || $part->{type} == $_->{type} || isTrueFS($part) && isTrueFS($_) } @$suggestions or return; @@ -199,7 +199,7 @@ sub suggest_part($$$;$) { 1; } -sub suggestions_mntpoint($) { +sub suggestions_mntpoint { my ($hds) = @_; sort grep { !/swap/ && !has_mntpoint($_, $hds) } (@suggestions_mntpoints, map { $_->{mntpoint} } @suggestions); @@ -291,8 +291,7 @@ sub allocatePartitions($$) { foreach (partition_table::get_holes($hd)) { my ($start, $size) = @$_{"start", "size"}; my $part; - while (suggest_part($hd, - $part = { start => $start, size => 0, maxsize => $size }, + while (suggest_part($part = { start => $start, size => 0, maxsize => $size, rootDevice => $hd->{device} }, $hds, $to_add)) { add($hd, $part, $hds); $size -= $part->{size} + $part->{start} - $start; diff --git a/perl-install/install2.pm b/perl-install/install2.pm index 41824979c..9fa20092c 100644 --- a/perl-install/install2.pm +++ b/perl-install/install2.pm @@ -294,8 +294,6 @@ sub selectInstallClass { #------------------------------------------------------------------------------ sub doPartitionDisks { - return $o->searchAndMount4Upgrade if $o->{isUpgrade}; - $o->{steps}{formatPartitions}{done} = 0; $o->doPartitionDisksBefore; $o->doPartitionDisks; @@ -445,10 +443,8 @@ sub addUser { } #------------------------------------------------------------------------------ -#-PADTODO sub createBootdisk { modules::write_conf($o->{prefix}); - $o->createBootdisk($_[1] == 1); } @@ -662,6 +658,10 @@ sub main { eval { modules::load("af_packet") }; + map_index { + modules::add_alias("snd-slot-$::i", $_->{driver}); + } modules::get_that_type('sound'); + lang::set($o->{lang}); #-the main cycle diff --git a/perl-install/install_any.pm b/perl-install/install_any.pm index 25fbdbf79..596f5191a 100644 --- a/perl-install/install_any.pm +++ b/perl-install/install_any.pm @@ -535,10 +535,9 @@ sub g_auto_install(;$) { $_ = { %{$_ || {}} }, delete @$_{qw(oldu oldg password password2)} foreach $o->{superuser}, @{$o->{users} || []}; - local *F; - open F, ">$f" or log::l("can't output the auto_install script in $f"), return; - print F "# You should always check the syntax with 'perl -cw auto_inst.cfg.pl' before testing\n"; - print F Data::Dumper->Dump([$o], ['$o']), "\0"; + output($f, + "# You should always check the syntax with 'perl -cw auto_inst.cfg.pl' before testing\n", + Data::Dumper->Dump([$o], ['$o']), "\0"); } sub loadO { @@ -597,4 +596,46 @@ sub generate_ks_cfg { $ks; } +sub suggest_mount_points { + my ($hds, $prefix) = @_; + my @parts = grep { isTrueFS($_) } fsedit::get_fstab(@$hds); + + my (%mntpoints, $user); + + my %l = ( + '/' => 'etc/fstab', + '/boot' => 'vmlinuz', + '/tmp' => '.X11-unix', + '/usr' => 'X11R6', + '/var' => 'catman', + ); + + foreach my $part (@parts) { + $part->{mntpoint} and next; #- if already found via an fstab + + my $handle = any::inspect($part, $prefix) or return; + my $d = $handle->{dir}; + my ($mnt) = grep { -e "$d/$l{$_}" } keys %l; + $mnt ||= (stat("$d/.bashrc"))[4] ? '/root' : '/home/user' . ++$user if -e "$d/.bashrc"; + + $part->{mntpoint} = $mnt; + + # try to find other mount points via fstab + fs::get_mntpoints_from_fstab(\@parts, $d) if $mnt eq '/'; + } + $_->{mntpoint} and fsedit::suggest_part($_, $hds) foreach @parts; +} + +#- mainly for finding the root partitions for upgrade +sub find_root_parts { + my ($hds, $prefix) = @_; + suggest_mount_points($hds, $prefix); + grep { delete($_->{mntpoint}) eq '/' } fsedit::get_fstab(@$hds); +} +sub use_root_part { + my ($fstab, $part, $prefix) = @_; + my $handle = any::inspect($part, $prefix) or die; + fs::get_mntpoints_from_fstab($fstab, $handle->{dir}); +} + 1; diff --git a/perl-install/install_interactive.pm b/perl-install/install_interactive.pm index d6eeae823..6e60b8f6f 100644 --- a/perl-install/install_interactive.pm +++ b/perl-install/install_interactive.pm @@ -13,6 +13,7 @@ use partition_table qw(:types); use partition_table_raw; use detect_devices; use devices; +use modules; sub getHds { @@ -270,4 +271,53 @@ When you are done, don't forget to save using `w'", partition_table_raw::descrip %solutions; } +#------------------------------------------------------------------------------ +sub load_thiskind { + my ($o, $type) = @_; + my $w; #- needed to make the wait_message stay alive + my $pcmcia = $o->{pcmcia} + unless !$::beginner && modules::pcmcia_need_config($o->{pcmcia}) && + !$o->ask_yesorno('', _("Try to find PCMCIA cards?"), 1); + $w = $o->wait_message(_("PCMCIA"), _("Configuring PCMCIA cards...")) if modules::pcmcia_need_config($pcmcia); + + modules::load_thiskind($type, $pcmcia, sub { $w = $o->wait_load_module($type, @_) }); +} + +#------------------------------------------------------------------------------ +sub setup_thiskind { + my ($o, $type, $auto, $at_least_one) = @_; + + return if arch() eq "ppc"; + + my @l; + my $allow_probe = !$::expert || $o->ask_yesorno('', _("Try to find %s devices?", "PCI" . (arch() =~ /sparc/ && "/SBUS")), 1); + + if ($allow_probe) { + @l = $o->load_thiskind($type); + if (my @err = grep { $_->{error} } map { $_->{error} } @l) { + $o->ask_warn('', join("\n", @err)); + } + return if $auto && (@l || !$at_least_one); + } + @l = map { $_->{driver} } @l; + while (1) { + my $msg = @l ? + [ _("Found %s %s interfaces", join(", ", @l), $type), + _("Do you have another one?") ] : + _("Do you have any %s interfaces?", $type); + + my $opt = [ __("Yes"), __("No") ]; + push @$opt, __("See hardware info") if $::expert; + my $r = "Yes"; + $r = $o->ask_from_list_('', $msg, $opt, "No") unless $at_least_one && @l == 0; + if ($r eq "No") { return } + if ($r eq "Yes") { + push @l, $o->load_module($type) || next; + } else { + #-eval { commands::modprobe("isapnp") }; + $o->ask_warn('', [ detect_devices::stringlist() ]); #-, scalar cat_("/proc/isapnp") ]); + } + } +} + 1; diff --git a/perl-install/install_steps.pm b/perl-install/install_steps.pm index 709764a1e..fb7d24f4c 100644 --- a/perl-install/install_steps.pm +++ b/perl-install/install_steps.pm @@ -127,7 +127,7 @@ sub setupSCSI { sub doPartitionDisksBefore { my ($o) = @_; - if (cat_("/proc/mounts") =~ m|/\w+/(\S+)\s+/tmp/hdimage\s+(\S+)|) { + if (cat_("/proc/mounts") =~ m|/\w+/(\S+)\s+/tmp/hdimage\s+(\S+)| && !$o->{partitioning}{readonly}) { $o->{stage1_hd} = { dev => $1, fs => $2 }; install_any::getFile("XXX"); #- close still opened filehandle eval { fs::umount("/tmp/hdimage") }; @@ -159,7 +159,15 @@ sub doPartitionDisksAfter { #------------------------------------------------------------------------------ sub doPartitionDisks { - my ($o, $hds) = @_; + my ($o) = @_; + + if ($o->{isUpgrade}) { + # either one root is defined (and all is ok), or we take the first one we find + my $p = fsedit::get_root($o->{fstab}) || first(install_any::find_root_parts($o->{hds}, $o->{prefix})) or die; + install_any::use_root_part($o->{fstab}, $p, $o->{prefix}); + } else { + #TODO; + } } #------------------------------------------------------------------------------ diff --git a/perl-install/install_steps_auto_install.pm b/perl-install/install_steps_auto_install.pm index 19a4358d9..3fc5fcd09 100644 --- a/perl-install/install_steps_auto_install.pm +++ b/perl-install/install_steps_auto_install.pm @@ -33,7 +33,7 @@ sub new { sub configureNetwork { my ($o) = @_; - modules::load_thiskind('net', sub {}, $o->{pcmcia}); + modules::load_thiskind('net', $o->{pcmcia}); install_steps::configureNetwork($o); } diff --git a/perl-install/install_steps_interactive.pm b/perl-install/install_steps_interactive.pm index 20a23e7cc..ca54f9d87 100644 --- a/perl-install/install_steps_interactive.pm +++ b/perl-install/install_steps_interactive.pm @@ -86,16 +86,6 @@ sub selectKeyboard($) { install_steps::selectKeyboard($o); } #------------------------------------------------------------------------------ -sub selectRootPartition($@) { - my ($o, @parts) = @_; - $o->{upgradeRootPartition} = - $o->ask_from_list(_("Root Partition"), - _("What is the root partition (/) of your system?"), - [ @parts ], $o->{upgradeRootPartition}); -#- TODO check choice, then mount partition in $o->{prefix} and autodetect. -#- install_steps::selectRootPartition($o); -} - sub selectInstallClass1 { my ($o, $verif, $l, $def, $l2, $def2) = @_; $verif->($o->ask_from_list(_("Install Class"), _("Which installation class do you want?"), $l, $def)); @@ -182,9 +172,11 @@ sub selectMouse { #------------------------------------------------------------------------------ sub setupSCSI { my ($o) = @_; - { my $w = $o->wait_message(_("IDE"), _("Configuring IDE")); - modules::load_ide() } - setup_thiskind($_[0], 'scsi|raid', $_[1], $_[2]); + { + my $w = $o->wait_message(_("IDE"), _("Configuring IDE")); + modules::load_ide(); + } + install_interactive::setup_thiskind($o, 'scsi|raid', $_[1], $_[2]); } sub ask_mntpoint_s { @@ -216,18 +208,28 @@ sub ask_mntpoint_s { #------------------------------------------------------------------------------ sub doPartitionDisks { my ($o) = @_; - my %solutions = install_interactive::partitionWizard($o, $o->{hds}, $o->{fstab}, $o->{partitioning}{readonly}); - my @solutions = sort { $b->[0] <=> $a->[0] } values %solutions; - - my $level = $::beginner ? 2 : -9999; - my @sol = grep { $_->[0] >= $level } @solutions; - @solutions = @sol if @sol > 1; - - my $ok; while (!$ok) { - my $sol = $o->ask_from_listf('', _("The DrakX Partitioning wizard found the following solutions:"), sub { $_->[1] }, \@solutions) or redo; - eval { $ok = $sol->[2]->() }; - $ok &&= !$@; - $@ and $o->ask_warn('', _("Partitioning failed: %s", $@)); + if ($o->{isUpgrade}) { + # either one root is defined (and all is ok), or we take the first one we find + my @p = fsedit::get_root($o->{fstab}); + @p = install_any::find_root_parts($o->{hds}, $o->{prefix}) if !@p; + my $p = $o->ask_from_listf(_("Root Partition"), + _("What is the root partition (/) of your system?"), + \&partition_table_raw::description, [ @p ]) or die "setstep exitInstall\n"; + install_any::use_root_part($o->{fstab}, $p, $o->{prefix}); + } else { + my %solutions = install_interactive::partitionWizard($o, $o->{hds}, $o->{fstab}, $o->{partitioning}{readonly}); + my @solutions = sort { $b->[0] <=> $a->[0] } values %solutions; + + my $level = $::beginner ? 2 : -9999; + my @sol = grep { $_->[0] >= $level } @solutions; + @solutions = @sol if @sol > 1; + + my $ok; while (!$ok) { + my $sol = $o->ask_from_listf('', _("The DrakX Partitioning wizard found the following solutions:"), sub { $_->[1] }, \@solutions) or redo; + eval { $ok = $sol->[2]->() }; + $ok &&= !$@; + $@ and $o->ask_warn('', _("Partitioning failed: %s", $@)); + } } } @@ -1158,75 +1160,7 @@ sub load_thiskind { !$o->ask_yesorno('', _("Try to find PCMCIA cards?"), 1); $w = $o->wait_message(_("PCMCIA"), _("Configuring PCMCIA cards...")) if modules::pcmcia_need_config($pcmcia); - modules::load_thiskind($type, sub { $w = wait_load_module($o, $type, @_) }, $pcmcia); -} - -#------------------------------------------------------------------------------ -# (dam's) is not anymore used by setupSCSI -sub setup_thiskind { - my ($o, $type, $auto, $at_least_one) = @_; - - return if arch() eq "ppc"; - - my @l; - my $allow_probe = !$::expert || $o->ask_yesorno('', _("Try to find %s devices?", "PCI" . (arch() =~ /sparc/ && "/SBUS")), 1); - - if ($allow_probe) { - eval { @l = grep { !/ide-/ } $o->load_thiskind($type) }; - $o->ask_warn('', $@) if $@; - return if $auto && (@l || !$at_least_one); - } - while (1) { - my $msg = @l ? - [ _("Found %s %s interfaces", join(", ", @l), $type), - _("Do you have another one?") ] : - _("Do you have any %s interfaces?", $type); - - my $opt = [ __("Yes"), __("No") ]; - push @$opt, __("See hardware info") if $::expert; - my $r = "Yes"; - $r = $o->ask_from_list_('', $msg, $opt, "No") unless $at_least_one && @l == 0; - if ($r eq "No") { return } - if ($r eq "Yes") { - push @l, $o->load_module($type) || next; - } else { - #-eval { commands::modprobe("isapnp") }; - $o->ask_warn('', [ detect_devices::stringlist() ]); #-, scalar cat_("/proc/isapnp") ]); - } - } -} - -sub setup_scsi_raid { - my ($o, $type, $auto, $at_least_one) = @_; - - return if arch() eq "ppc"; - - my @l; - my $allow_probe = !$::expert || $o->ask_yesorno('', _("Try to find %s devices?", "PCI" . (arch() =~ /sparc/ && "/SBUS")), 1); - - if ($allow_probe) { - eval { @l = grep { !/ide-/ } $o->load_thiskind($type) }; - $o->ask_warn('', $@) if $@; - return if $auto && (@l || !$at_least_one); - } - while (1) { - my $msg = @l ? - [ _("Found %s %s interfaces", join(", ", @l), $type), - _("Do you have another one?") ] : - _("Do you have any %s interfaces?", $type); - - my $opt = [ __("Yes"), __("No") ]; - push @$opt, __("See hardware info") if $::expert; - my $r = "Yes"; - $r = $o->ask_from_list_('', $msg, $opt, "No") unless $at_least_one && @l == 0; - if ($r eq "No") { return } - if ($r eq "Yes") { - push @l, $o->load_module($type) || next; - } else { - #-eval { commands::modprobe("isapnp") }; - $o->ask_warn('', [ detect_devices::stringlist() ]); #-, scalar cat_("/proc/isapnp") ]); - } - } + modules::load_thiskind($type, $pcmcia, sub { $w = wait_load_module($o, $type, @_) }); } sub upNetwork { diff --git a/perl-install/loopback.pm b/perl-install/loopback.pm index 1a90e1091..4eb14a9dc 100644 --- a/perl-install/loopback.pm +++ b/perl-install/loopback.pm @@ -72,31 +72,6 @@ sub create { $f; } -sub inspect { - my ($part, $prefix, $rw) = @_; - - isMountableRW($part) or return; - - my $dir = "/tmp/loopback_tmp"; - - 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) { - fs::umount($dir); - unlink($dir) - } - }; - $h->{dir} = $dir; - $h; -} - sub getFree { my ($dir, $part) = @_; my $freespace = $dir ? diff --git a/perl-install/modules.pm b/perl-install/modules.pm index b4a6206f6..facef09c9 100644 --- a/perl-install/modules.pm +++ b/perl-install/modules.pm @@ -1,6 +1,6 @@ package modules; -use vars qw(%loaded %drivers); +use vars qw(%drivers); use common qw(:common :file :system); use detect_devices; @@ -9,7 +9,6 @@ use log; my %conf; -my %loaded; #- array of loaded modules for each types (scsi/net/...) my $scsi = 0; my %deps = (); @@ -322,9 +321,6 @@ while (my ($k, $v) = each %drivers) { $drivers{$k} = \%l; } - -1; - sub module_of_type__4update_kernel { my ($type) = @_; my %skip; @skip{@skip_modules_on_stage1} = (); @@ -380,8 +376,10 @@ sub load { eval { load($_, 'prereq') } foreach @{$deps{$name}}; load_raw([ $name, @options ]); } - push @{$loaded{$type}}, $name; - + if ($name eq "usb-storage") { + sleep(2); + -d "/proc/scsi/usb" or return; + } if ($type) { add_alias('usb-interface', $name) if $type =~ /SERIAL_USB/i; add_alias('scsi_hostadapter', $name), load('sd_mod') if $type =~ /scsi/ || $type eq $type_aliases{scsi}; @@ -409,9 +407,6 @@ sub unload($;$) { delete $conf{$m}{loaded}; } } - foreach (keys %loaded) { - @{$loaded{$_}} = grep { $m ne $_ } @{$loaded{$_}}; - } remove_alias($m) if $remove_alias; } @@ -431,11 +426,15 @@ sub load_raw { } } @l; - #- this is a hack to make plip go foreach (@l) { - $_->[0] eq "parport_pc" or next; - foreach (@{$_->[1]}) { - /^irq=(\d+)/ and eval { output "/proc/parport/0/irq", $1 }; + if ($_->[0] eq "parport_pc") { + #- this is a hack to make plip go + foreach (@{$_->[1]}) { + /^irq=(\d+)/ and eval { output "/proc/parport/0/irq", $1 }; + } + } elsif ($_->[0] =~ /usb-[uo]hci/) { + #- ensure keyboard is working, the kernel must do the job the BIOS was doing + load_multi("usbkbd", "keybdev"); } } die "insmod'ing module " . join(", ", map { $_->[0] } @failed) . " failed" if @failed; @@ -445,7 +444,6 @@ sub read_already_loaded() { foreach (cat_("/proc/modules")) { my ($name) = split; $conf{$name}{loaded} = 1; - my $l = $loaded{($drivers{$name} || next)->{type}} ||= []; push @$l, $name unless member($name, @$l); } } @@ -524,48 +522,26 @@ sub read_stage1_conf { } sub load_thiskind { - my ($type, $f, $pcic) = @_; - show_load_thiskind($type, $f, $pcic, 1); -} - -sub show_load_thiskind { - my ($type, $f, $pcic, $load) = @_; - my %loaded_text; - - my @devs = grep { my $l = $drivers{$_->{driver}}; $l && $l->{type} eq $type } detect_devices::probeall('', $pcip); - log::l("probe found " . scalar @devs . " $type devices"); + my ($type, $pcic, $f) = @_; - my %devs; foreach (@devs) { - my ($text, $mod) = ($_->{description}, $_->{driver}); - $devs{$mod}++ and log::l("multiple $mod devices found"), next; - log::l("found driver for $mod"); - &$f($text, $mod) if $f; - $load ? load($mod, $type) : push @{$loaded{$type}}, $mod; - $loaded_text{$mod} = $text; - } - if ($load && $type =~ /scsi/) { - #- hey, we're allowed to pci probe :) let's do a lot of probing! + grep { + $f->($_->{description}, $_->{driver}) if $f; + eval { load($_->{driver}) }; + $_->{error} = $@; - #- probe for USB SCSI. - if (detect_devices::probeUSB()) { - eval { load("usb-storage", $type); sleep(2); }; - -d "/proc/scsi/usb" or unload("usb-storage"); - } - #- probe for parport SCSI. - if (arch() !~ /sparc/) { - foreach ("imm", "ppa") { - eval { load($_, $type) }; - last if !$@; - } - } - if (my ($c) = (show_load_thiskind ('audio'))) { #detect_devices::matching_type('AUDIO'))) { - add_alias("sound", $c->{driver}); #- (dam's) this should be changed, we shouldn't use alias sound - } - } + !($@ && $_->{try}); + } get_that_type($type, $pcic), + $type =~ /scsi/ && arch() !~ /sparc/ ? + (map { +{ driver => $_, description => $_, try => 1 } } "usb-storage", "imm", "ppa") : (); +} - my @loaded = map { $loaded_text{$_} || $_ } @{$loaded{$type} || []}; - $type =~ /scsi/ and @loaded and $load and eval { load("sd_mod") }; - @loaded; +sub get_that_type { + my ($type, $pcic) = @_; + + grep { + my $l = $drivers{$_->{driver}}; + $l && $l->{type} eq $type && detect_devices::check($_); + } detect_devices::probeall('', $pcic); } sub pcmcia_need_config($) { @@ -617,23 +593,5 @@ sub load_ide { } -sub load_bordel { - - #- probe for USB SCSI. - if (detect_devices::probeUSB()) { - eval { load("usb-storage", $type); sleep(2); }; - -d "/proc/scsi/usb" or unload("usb-storage"); - } - #- probe for parport SCSI. - if (arch() !~ /sparc/) { - foreach ("imm", "ppa") { - eval { load($_, $type) }; - last if !$@; - } - } -# if (my ($c) = (show_load_thiskind ('audio'))) { #detect_devices::matching_type('AUDIO'))) { -# add_alias("sound", $c->{driver}); #- (dam's) this should be changed, we shouldn't use alias sound - } - } -} +1; diff --git a/perl-install/printerdrake.pm b/perl-install/printerdrake.pm index 9d7349740..d1cfabc0d 100644 --- a/perl-install/printerdrake.pm +++ b/perl-install/printerdrake.pm @@ -18,7 +18,7 @@ sub auto_detect { { my $w = $in->wait_message(_("Test ports"), _("Detecting devices...")); detect_devices::probeUSB() and eval { modules::load("printer"); sleep(1); }; - eval { modules::load("parport_pc"); modules::load("parport_probe"); modules::load("lp"); }; + eval { modules::load_multi("parport_pc", "parport_probe", "lp"); }; } my $b = before_leaving { eval { modules::unload("parport_probe") } }; detect_devices::whatPrinter(); |