diff options
author | Pascal Rigaux <pixel@mandriva.com> | 2004-09-09 02:28:32 +0000 |
---|---|---|
committer | Pascal Rigaux <pixel@mandriva.com> | 2004-09-09 02:28:32 +0000 |
commit | 71b7853242c9ec0faccd8cfea16209b46cbedeee (patch) | |
tree | ee953d363e1cf2387db0a1ecf05c94420276d271 | |
parent | 4a5bbcf044f6069e9a417f178e103047ba5a93b2 (diff) | |
download | drakx-71b7853242c9ec0faccd8cfea16209b46cbedeee.tar drakx-71b7853242c9ec0faccd8cfea16209b46cbedeee.tar.gz drakx-71b7853242c9ec0faccd8cfea16209b46cbedeee.tar.bz2 drakx-71b7853242c9ec0faccd8cfea16209b46cbedeee.tar.xz drakx-71b7853242c9ec0faccd8cfea16209b46cbedeee.zip |
instead of expanding symlinks in any case, only do it when renaming "linux"
into the kernel version based label (eg: "2681-10")
that way "linux" like entries won't be modified, the way the "linux" is already handled
-rw-r--r-- | perl-install/bootloader.pm | 45 |
1 files changed, 26 insertions, 19 deletions
diff --git a/perl-install/bootloader.pm b/perl-install/bootloader.pm index 2e6b3954b..346c3bcfa 100644 --- a/perl-install/bootloader.pm +++ b/perl-install/bootloader.pm @@ -368,19 +368,33 @@ sub add_entry { } $to_add = $conflicting; - my $new_label = $v->{label} eq 'linux' && kernel_str2label(vmlinuz2kernel_str($to_add->{kernel_or_dev}), 'use_long_name'); - $label = $new_label && $label ne $new_label ? $new_label : do { + if ($to_add->{label} eq 'linux') { + expand_entry_symlinks($bootloader, $to_add); + $label = kernel_str2label(vmlinuz2kernel_str($to_add->{kernel_or_dev}), 'use_long_name'); + } else { $label =~ s/^alt\d*_//; - 'alt' . ($i++ ? $i : '') . "_$label"; - }; + $label = 'alt' . ($i++ ? $i : '') . "_$label"; + } } die 'add_entry'; } +sub expand_entry_symlinks { + my ($bootloader, $entry) = @_; + + foreach my $kind ('kernel_or_dev', 'initrd') { + my $old_long_name = $bootloader->{old_long_names} && $bootloader->{old_long_names}{$entry->{$kind}} or next; + + #- replace all the {$kind} using this symlink to the real file + log::l("replacing $entry->{$kind} with $old_long_name for bootloader label $entry->{label}"); + $entry->{$kind} = $old_long_name; + } +} + sub _do_the_symlink { - my ($bootloader, $entry, $kind, $long_name) = @_; + my ($bootloader, $link, $long_name) = @_; - my $existing_link = readlink("$::prefix$entry->{$kind}"); + my $existing_link = readlink("$::prefix$link"); if ($existing_link && $existing_link eq $long_name) { #- nothing to do :) return; @@ -390,21 +404,14 @@ sub _do_the_symlink { #- replace all the {$kind} using this symlink to the real file my $old_long_name = $existing_link =~ m!^/! ? $existing_link : "/boot/$existing_link"; if (-e "$::prefix$old_long_name") { - foreach (@{$bootloader->{entries}}) { - if ($_->{$kind} eq $entry->{$kind} - #- we don't modify existing failsafe or linux-nonfb unless we overwrite them - && ($_->{label} eq $entry->{label} || !member($_->{label}, 'failsafe', 'linux-nonfb'))) { - log::l("replacing $_->{$kind} with $old_long_name for bootloader label $_->{labe}"); - $_->{$kind} = $old_long_name; - } - } + $bootloader->{old_long_names}{$link} = $old_long_name; } else { - log::l("ERROR: $entry->{$kind} points to $old_long_name which doesn't exist"); + log::l("ERROR: $link points to $old_long_name which doesn't exist"); } #- changing the symlink - symlinkf($long_name, "$::prefix$entry->{$kind}") - or cp_af("$::prefix/boot/$long_name", "$::prefix$entry->{$kind}"); + symlinkf($long_name, "$::prefix$link") + or cp_af("$::prefix/boot/$long_name", "$::prefix$link"); } sub add_kernel { @@ -427,7 +434,7 @@ sub add_kernel { -e "$::prefix$v->{kernel_or_dev}" or log::l("unable to find kernel image $::prefix$v->{kernel_or_dev}"), return; if (!$b_nolink) { $v->{kernel_or_dev} = '/boot/' . kernel_str2vmlinuz_short($kernel_str); - _do_the_symlink($bootloader, $v, 'kernel_or_dev', $vmlinuz_long); + _do_the_symlink($bootloader, $v->{kernel_or_dev}, $vmlinuz_long); } log::l("adding $v->{kernel_or_dev}"); @@ -437,7 +444,7 @@ sub add_kernel { mkinitrd($kernel_str->{version}, $v) or undef $v->{initrd}; if ($v->{initrd} && !$b_nolink) { $v->{initrd} = '/boot/' . kernel_str2initrd_short($kernel_str); - _do_the_symlink($bootloader, $v, 'initrd', $initrd_long); + _do_the_symlink($bootloader, $v->{initrd}, $initrd_long); } } |