diff options
Diffstat (limited to 'perl-install')
-rw-r--r-- | perl-install/ChangeLog | 16 | ||||
-rw-r--r-- | perl-install/c/stuff.xs.pm | 18 | ||||
-rw-r--r-- | perl-install/commands.pm | 1 | ||||
-rw-r--r-- | perl-install/devices.pm | 5 | ||||
-rw-r--r-- | perl-install/fs.pm | 85 | ||||
-rw-r--r-- | perl-install/fsedit.pm | 23 | ||||
-rw-r--r-- | perl-install/install2.pm | 26 | ||||
-rw-r--r-- | perl-install/install_any.pm | 1 | ||||
-rw-r--r-- | perl-install/install_steps.pm | 8 | ||||
-rw-r--r-- | perl-install/install_steps_interactive.pm | 21 | ||||
-rw-r--r-- | perl-install/interactive_gtk.pm | 6 | ||||
-rw-r--r-- | perl-install/loopback.pm | 9 | ||||
-rw-r--r-- | perl-install/modules.pm | 5 | ||||
-rw-r--r-- | perl-install/pkgs.pm | 2 | ||||
-rw-r--r-- | perl-install/share/fonts.tar.bz2 | bin | 1105673 -> 1105293 bytes |
15 files changed, 159 insertions, 67 deletions
diff --git a/perl-install/ChangeLog b/perl-install/ChangeLog index 2372bfb23..06f1f5a71 100644 --- a/perl-install/ChangeLog +++ b/perl-install/ChangeLog @@ -1,3 +1,19 @@ +2000-03-11 Pixel <pixel@mandrakesoft.com> + + * devices.pm (set_loop): created, searches for an available + loopback and sets the file to it + + * lilo.pm (dev2grub): fixed a missing slash + + * interactive_gtk.pm (wait_message_nextW): do not update if same + message, otherwise silly gtk won't do anything and we'll wait + forever :( + +2000-03-10 Pixel <pixel@mandrakesoft.com> + + * install2.pm (@install_classes): cleanup, no more i18n (is now in + install_steps_interactive), remove old entries + 2000-03-09 Pixel <pixel@mandrakesoft.com> * modules.pm (write_conf): don't add alias block-major-11 in every case diff --git a/perl-install/c/stuff.xs.pm b/perl-install/c/stuff.xs.pm index cdaa2d292..d8395dc66 100644 --- a/perl-install/c/stuff.xs.pm +++ b/perl-install/c/stuff.xs.pm @@ -255,7 +255,7 @@ set_loop(dev_fd, file) if (file_fd < 0) return; - memset(&loopinfo, 0, sizeof (loopinfo)); + memset(&loopinfo, 0, sizeof(loopinfo)); strncpy(loopinfo.lo_name, file, LO_NAME_SIZE); loopinfo.lo_name[LO_NAME_SIZE - 1] = 0; @@ -269,6 +269,22 @@ set_loop(dev_fd, file) } OUTPUT: RETVAL + +int +del_loop(device) + char *device + CODE: + RETVAL = 0; +{ + int fd; + if ((fd = open(device, O_RDONLY)) < 0) return; + if (ioctl(fd, LOOP_CLR_FD, 0) < 0) return; + close(fd); + RETVAL = 1; +} + OUTPUT: + RETVAL + '; $ENV{C_RPM} and print ' diff --git a/perl-install/commands.pm b/perl-install/commands.pm index ace3cb395..1f2170de2 100644 --- a/perl-install/commands.pm +++ b/perl-install/commands.pm @@ -68,6 +68,7 @@ sub mount { my $fs = $t && shift; @_ == 2 or die "usage: mount [-r] [-t <fs>] <device> <dir>\n", + " (use -r for readonly)\n", " (if /dev/ is left off the device name, a temporary node will be created)\n"; my ($dev, $where) = @_; diff --git a/perl-install/devices.pm b/perl-install/devices.pm index 19baec6f7..29c89a1d5 100644 --- a/perl-install/devices.pm +++ b/perl-install/devices.pm @@ -38,11 +38,12 @@ sub size($) { sub set_loop { my ($file) = @_; - foreach (0..9) { + foreach (0..7) { local *F; my $dev = make("loop$_"); - sysopen F, $dev, 0 or next; + sysopen F, $dev, 2 or next; !ioctl(F, c::LOOP_GET_STATUS(), my $tmp) && $! == 6 or next; #- 6 == ENXIO + log::l("trying with loop $dev"); return c::set_loop(fileno F, $file) && $dev; } } diff --git a/perl-install/fs.pm b/perl-install/fs.pm index 5a506c411..7fc15dcec 100644 --- a/perl-install/fs.pm +++ b/perl-install/fs.pm @@ -37,6 +37,15 @@ sub read_fstab($) { } <F>; } +sub up_mount_point { + my ($mntpoint, $fstab) = @_; + while (1) { + $mntpoint = dirname($mntpoint); + $mntpoint ne "." or return; + $_->{mntpoint} eq $mntpoint and return $_ foreach @$fstab; + } +} + sub check_mounted($) { my ($fstab) = @_; @@ -113,16 +122,39 @@ sub real_format_part { $part->{isFormatted} = 1; } sub format_part { - my ($raid, $part) = @_; + my ($raid, $part, $prefix) = @_; if (raid::is($part)) { raid::format_part($raid, $part); } elsif (isLoopback($part)) { - loopback::format_part($part); + loopback::format_part($part, $prefix); } else { real_format_part($part); } } +sub formatMount_part { + my ($part, $raid, $fstab, $prefix, $callback) = @_; + + if (my $p = up_mount_point($part->{mntpoint}, $fstab)) { + formatMount_part($p, $raid, $fstab, $prefix, $callback); + } + if (isLoopback($part)) { + formatMount_part($part->{device}, $raid, $fstab, $prefix, $callback); + } + + if ($part->{toFormat}) { + $callback->($part) if $callback; + format_part($raid, $part, $prefix); + } + mount_part($part, $prefix); +} + +sub formatMount_all { + my ($raid, $fstab, $prefix, $callback) = @_; + formatMount_part($_, $raid, $fstab, $prefix, $callback) + foreach sort { isLoopback($a) ? 1 : -1 } grep { $_->{mntpoint} } @$fstab; +} + sub mount($$$;$) { my ($dev, $where, $fs, $rdonly) = @_; log::l("mounting $dev on $where as type $fs"); @@ -173,11 +205,15 @@ sub mount_part($;$$) { $part->{isMounted} and return; unless ($::testing) { - local $part->{device} = devices::set_loop(loopback::file($part)) || die if isLoopback($part); if (isSwap($part)) { - swap::swapon($part->{device}); + swap::swapon(isLoopback($part) ? $prefix . loopback::file($part) : $part->{device}); } else { $part->{mntpoint} or die "missing mount point"; + + eval { modules::load('loop') } if isLoopback($part); + $part->{real_device} = devices::set_loop($prefix . loopback::file($part)) || die if isLoopback($part); + local $part->{device} = $part->{real_device} if isLoopback($part); + mount(devices::make($part->{device}), ($prefix || '') . $part->{mntpoint}, type2fs($part->{type}), $rdonly); } } @@ -190,9 +226,12 @@ sub umount_part($;$) { $part->{isMounted} or return; unless ($::testing) { - isSwap($part) ? - swap::swapoff($part->{device}) : - umount(($prefix || '') . ($part->{mntpoint} || devices::make($part->{device}))); + if (isSwap($part)) { + swap::swapoff($part->{device}); + } else { + umount(($prefix || '') . $part->{mntpoint} || devices::make($part->{device})); + c::del_loop(delete $part->{real_device}) if isLoopback($part); + } } $part->{isMounted} = 0; } @@ -308,19 +347,19 @@ sub write_fstab($;$$) { print F join(" ", @$_), "\n" foreach sort { $a->[1] cmp $b->[1] } @to_add; } -sub check_mount_all_fstab($;$) { - my ($fstab, $prefix) = @_; - $prefix ||= ''; - - foreach (sort { ($a->{mntpoint} || '') cmp ($b->{mntpoint} || '') } @$fstab) { - #- avoid unwanted mount in fstab. - next if ($_->{device} =~ /none/ || $_->{type} =~ /nfs|smbfs|ncpfs|proc/ || $_->{options} =~ /noauto|ro/); - - #- TODO fsck - - eval { mount(devices::make($_->{device}), $prefix . $_->{mntpoint}, $_->{type}, 0); }; - if ($@) { - log::l("unable to mount partition $_->{device} on $prefix/$_->{mntpoint}"); - } - } -} +#sub check_mount_all_fstab($;$) { +# my ($fstab, $prefix) = @_; +# $prefix ||= ''; +# +# foreach (sort { ($a->{mntpoint} || '') cmp ($b->{mntpoint} || '') } @$fstab) { +# #- avoid unwanted mount in fstab. +# next if ($_->{device} =~ /none/ || $_->{type} =~ /nfs|smbfs|ncpfs|proc/ || $_->{options} =~ /noauto|ro/); +# +# #- TODO fsck +# +# eval { mount(devices::make($_->{device}), $prefix . $_->{mntpoint}, $_->{type}, 0); }; +# if ($@) { +# log::l("unable to mount partition $_->{device} on $prefix/$_->{mntpoint}"); +# } +# } +#} diff --git a/perl-install/fsedit.pm b/perl-install/fsedit.pm index 96d572cb5..e8b045d04 100644 --- a/perl-install/fsedit.pm +++ b/perl-install/fsedit.pm @@ -230,7 +230,7 @@ sub has_mntpoint($$) { #- do this before modifying $part->{mntpoint} #- $part->{mntpoint} should not be used here, use $mntpoint instead sub check_mntpoint { - my ($mntpoint, $hd, $part, $hds) = @_; + my ($mntpoint, $hd, $part, $hds, $loopbackDevice) = @_; $mntpoint eq '' || isSwap($part) || isRAID($part) and return; @@ -238,7 +238,23 @@ sub check_mntpoint { m|^/| or die _("Mount points must begin with a leading /"); #- m|(.)/$| and die "The mount point $_ is illegal.\nMount points may not end with a /"; - has_mntpoint($mntpoint, $hds) and die _("There is already a partition with mount point %s", $mntpoint); + has_mntpoint($mntpoint, $hds) and die _("There is already a partition with mount point %s\n", $mntpoint); + + my $fake_part = { mntpoint => $mntpoint, device => $loopbackDevice }; + $fake_part->{loopback_file} = 1 if $loopbackDevice; + my $fstab = [ get_fstab(@$hds), $fake_part ]; + my $check; $check = sub { + my ($p, @seen) = @_; + push @seen, $p->{mntpoint} || return; + @seen > 1 && $p->{mntpoint} eq $mntpoint and die _("Circular mounts %s\n", join(", ", @seen)); + if (my $part = fs::up_mount_point($p->{mntpoint}, $fstab)) { + $check->($part, @seen); + } + if (isLoopback($p)) { + $check->($p->{device}, @seen); + } + }; + $check->($fake_part); #- if ($part->{start} + $part->{size} > 1024 * $hd->cylinder_size() && arch() =~ /i386/) { #- die "/boot ending on cylinder > 1024" if $mntpoint eq "/boot"; @@ -267,12 +283,9 @@ sub allocatePartitions($$) { while (suggest_part($hd, $part = { start => $start, size => 0, maxsize => $size }, $hds, $to_add)) { - log::l("partsize " . ($part->{size}+ $part->{start})); - log::l("size " . ($size+ $start)); add($hd, $part, $hds); $size -= $part->{size} + $part->{start} - $start; $start = $part->{start} + $part->{size}; - log::l("size " . ($size+ $start)); } } } diff --git a/perl-install/install2.pm b/perl-install/install2.pm index bc00a3e6e..e658953dd 100644 --- a/perl-install/install2.pm +++ b/perl-install/install2.pm @@ -81,8 +81,7 @@ arch() =~ /alpha/ ? ( #-INTERNAL CONSTANT #-##################################################################################### -#- these strings are used in quite a lot of places and must not be changed!!!!! -my @install_classes = (__("beginner"), __("developer"), __("server"), __("expert")); +my @install_classes = qw(normal developer server); #-##################################################################################### #-Default value @@ -327,13 +326,7 @@ Then choose action ``Mount point'' and set it to `/'"); sub formatPartitions { unless ($o->{lnx4win} || $o->{isUpgrade}) { $o->choosePartitionsToFormat($o->{fstab}); - - unless ($::testing) { - $o->formatPartitions(@{$o->{fstab}}); - fs::mount_all([ grep { isSwap($_) } @{$o->{fstab}} ], $o->{prefix}); - die _("Not enough swap to fulfill installation, please add some") if availableMemory < 40 * 1024; - fs::mount_all([ grep { isExt2($_) } @{$o->{fstab}} ], $o->{prefix}, $o->{hd_dev}); - } + $o->formatMountPartitions($o->{fstab}) unless $::testing; eval { $o = $::o = install_any::loadO($o) } if $_[1] == 1; } @@ -546,11 +539,16 @@ sub main { symlinkf $root, "/tmp/rhimage" or die "unable to create link /tmp/rhimage"; } - unlink "/sbin/insmod" unless $::testing; - unlink "/modules/pcmcia_core.o" unless $::testing; #- always use module from archive. - unlink "/modules/i82365.o" unless $::testing; - unlink "/modules/tcic.o" unless $::testing; - unlink "/modules/ds.o" unless $::testing; + unless ($::testing) { + unlink $_ foreach ( + "/sbin/insmod", "/sbin/rmmod", "/sbin/install", + "/modules/modules.cgz", + "/modules/pcmcia_core.o", #- always use module from archive. + "/modules/i82365.o", + "/modules/tcic.o", + "/modules/ds.o", + ); + } print STDERR "in second stage install\n"; log::openLog(($::testing || $o->{localInstall}) && 'debug.log'); diff --git a/perl-install/install_any.pm b/perl-install/install_any.pm index 5e1232f90..41a46f93b 100644 --- a/perl-install/install_any.pm +++ b/perl-install/install_any.pm @@ -178,6 +178,7 @@ sub setPackages($) { push @{$o->{default_packages}}, "apmd" if $o->{pcmcia}; push @{$o->{default_packages}}, "raidtools" if $o->{raid} && !is_empty_array_ref($o->{raid}{raid}); push @{$o->{default_packages}}, "cdrecord" if detect_devices::getIDEBurners(); + push @{$o->{default_packages}}, "alsa" if modules::get_alias("sound") =~ /^snd-card-/; pkgs::getDeps($o->{packages}); diff --git a/perl-install/install_steps.pm b/perl-install/install_steps.pm index 6004096b1..a867b8155 100644 --- a/perl-install/install_steps.pm +++ b/perl-install/install_steps.pm @@ -165,11 +165,9 @@ sub choosePartitionsToFormat($$) { } } -sub formatPartitions { - my $o = shift; - foreach (@_) { - fs::format_part($o->{raid}, $_) if $_->{toFormat}; - } +sub formatMountPartitions { + my ($o) = @_; + fs::formatMount_all($o->{raid}, $o->{fstab}, $o->{prefix}); } #------------------------------------------------------------------------------ diff --git a/perl-install/install_steps_interactive.pm b/perl-install/install_steps_interactive.pm index 86bed9004..3fa598da9 100644 --- a/perl-install/install_steps_interactive.pm +++ b/perl-install/install_steps_interactive.pm @@ -25,6 +25,7 @@ use mouse; use modules; use lang; use services; +use loopback; use keyboard; use any; use fs; @@ -223,15 +224,17 @@ sub choosePartitionsToFormat($$) { [ map { \$_->{toFormatCheck} } @l ]) or goto &choosePartitionsToFormat if $::expert; } -sub formatPartitions { - my $o = shift; - my $w = $o->wait_message('', ''); - foreach (@_) { - if ($_->{toFormat}) { - $w->set(_("Formatting partition %s", $_->{device})); - fs::format_part($o->{raid}, $_); - } - } + +sub formatMountPartitions { + my ($o, $fstab) = @_; + my $w = $o->wait_message('', _("Formatting partitions")); + fs::formatMount_all($o->{raid}, $o->{fstab}, $o->{prefix}, sub { + my ($part) = @_; + $w->set(isLoopback($part) ? + _("Creating and formatting loopback file %s", loopback::file($part)) : + _("Formatting partition %s", $part->{device})); + }); + die _("Not enough swap to fulfill installation, please add some") if availableMemory < 40 * 1024; } #------------------------------------------------------------------------------ diff --git a/perl-install/interactive_gtk.pm b/perl-install/interactive_gtk.pm index 250700578..3a9feefb8 100644 --- a/perl-install/interactive_gtk.pm +++ b/perl-install/interactive_gtk.pm @@ -297,14 +297,16 @@ sub wait_messageW($$$) { @$messages, $w->{wait_messageW} = new Gtk::Label($W))); $w->{rwindow}->set_position('center') if $::isStandalone; - $w->{wait_messageW}->signal_connect(expose_event => sub { $w->{displayed} = 1 }); + $w->{wait_messageW}->signal_connect(expose_event => sub { print "expose_event\n"; $w->{displayed} = 1 }); $w->sync until $w->{displayed}; $w; } sub wait_message_nextW { my ($o, $messages, $w) = @_; + my $msg = join "\n", @$messages; + return if $msg eq $w->{wait_messageW}->get; #- needed otherwise no expose_event :( $w->{displayed} = 0; - $w->{wait_messageW}->set(join "\n", @$messages); + $w->{wait_messageW}->set($msg); $w->flush until $w->{displayed}; } sub wait_message_endW { diff --git a/perl-install/loopback.pm b/perl-install/loopback.pm index 0fdebebaf..32bb62b3a 100644 --- a/perl-install/loopback.pm +++ b/perl-install/loopback.pm @@ -24,17 +24,16 @@ sub loopbacks { } sub format_part { - my ($part) = @_; - my $prefix = $::isStandalone ? '' : $::o->{prefix}; + my ($part, $prefix) = @_; fs::mount_part($part->{device}, $prefix); - my $f = create($part); + my $f = create($part, $prefix); local $part->{device} = $f; fs::real_format_part($part); } sub create { - my ($part) = @_; - my $f = "$part->{device}{mntpoint}$part->{loopback_file}"; + my ($part, $prefix) = @_; + my $f = "$prefix$part->{device}{mntpoint}$part->{loopback_file}"; return $f if -e $f; eval { commands::mkdir_("-p", dirname($f)) }; diff --git a/perl-install/modules.pm b/perl-install/modules.pm index 8ed1be0c9..c288168dd 100644 --- a/perl-install/modules.pm +++ b/perl-install/modules.pm @@ -338,6 +338,11 @@ sub text2driver($) { die "$text is not a valid module description"; } +sub get_alias { + my ($alias) = @_; + $conf{$alias}{alias}; +} + sub add_alias($$) { my ($alias, $name) = @_; /\Q$alias/ && $conf{$_}{alias} && $conf{$_}{alias} eq $name and return $_ foreach keys %conf; diff --git a/perl-install/pkgs.pm b/perl-install/pkgs.pm index d30d0e408..c6d7f402e 100644 --- a/perl-install/pkgs.pm +++ b/perl-install/pkgs.pm @@ -788,7 +788,7 @@ sub install($$$;$$) { foreach @transToInstall; my $close = sub { - c::headerFree(delete $_->{header}) foreach @transToInstall; +# c::headerFree(delete $_->{header}) foreach @transToInstall; c::rpmtransFree($trans); }; diff --git a/perl-install/share/fonts.tar.bz2 b/perl-install/share/fonts.tar.bz2 Binary files differindex ef771a167..66dcc9053 100644 --- a/perl-install/share/fonts.tar.bz2 +++ b/perl-install/share/fonts.tar.bz2 |