--- dpkg-1.14.29.orig/scripts/update-alternatives.pl 2010-03-08 21:27:35.000000000 +0100
+++ dpkg-1.14.29/scripts/update-alternatives.pl 2011-02-06 20:20:19.000000000 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/perl --
+#!/usr/bin/env perl
BEGIN { # Work-around for bug #479711 in perl
$ENV{PERL_DL_NONLAZY} = 1;
@@ -16,6 +16,7 @@
# Global variables:
my $altdir = '/etc/alternatives';
+my $naltdir = $ENV{D} . $altdir;
# FIXME: this should not override the previous assignment.
$admindir = $admindir . '/alternatives';
@@ -43,6 +44,7 @@
my $alink; # Alternative we are managing (ie the symlink we're making/removing) (install only)
my $name; # Name of the alternative (the symlink) we are processing
my $apath; # Path of alternative we are offering
+my $napath; # Native path of alternative we are offering
my $apriority; # Priority of link (only when we are installing an alternative)
my %aslavelink;
my %aslavepath;
@@ -190,7 +192,7 @@
sub display_link_group
{
pr(sprintf(_g("%s - status is %s."), $name, $mode));
- $linkname = readlink("$altdir/$name");
+ $linkname = readlink("$naltdir/$name");
if (defined($linkname)) {
pr(sprintf(_g(" link currently points to %s"), $linkname));
@@ -226,25 +228,26 @@
sub checked_alternative($$$)
{
my ($name, $link, $path) = @_;
+ my $nlink = $ENV{D} . $link;
- $linkname = readlink($link);
+ $linkname = readlink($nlink);
if (!defined($linkname) && $! != ENOENT) {
pr(sprintf(_g("warning: %s is supposed to be a symlink to %s, \n".
"or nonexistent; however, readlink failed: %s"),
- $link, "$altdir/$name", $!))
+ $nlink, "$altdir/$name", $!))
if $verbosemode > 0;
} elsif (!defined($linkname) ||
(defined($linkname) && $linkname ne "$altdir/$name")) {
- checked_rm("$link.dpkg-tmp");
- checked_symlink("$altdir/$name", "$link.dpkg-tmp");
- checked_mv("$link.dpkg-tmp", $link);
+ checked_rm("$nlink.dpkg-tmp");
+ checked_symlink("$altdir/$name", "$nlink.dpkg-tmp");
+ checked_mv("$nlink.dpkg-tmp", $nlink);
}
- $linkname = readlink("$altdir/$name");
+ $linkname = readlink("$naltdir/$name");
if (defined($linkname) && $linkname eq $path) {
- pr(sprintf(_g("Leaving %s (%s) pointing to %s."), $name, $link, $path))
+ pr(sprintf(_g("Leaving %s (%s) pointing to %s."), $name, $nlink, $path))
if $verbosemode > 0;
} else {
- pr(sprintf(_g("Updating %s (%s) to point to %s."), $name, $link, $path))
+ pr(sprintf(_g("Updating %s (%s) to point to %s."), $name, $nlink, $path))
if $verbosemode > 0;
}
}
@@ -254,8 +257,8 @@
my ($spath, $preferred) = (@_);
printf STDOUT _g("Using '%s' to provide '%s'.") . "\n", $spath, $name;
- checked_symlink("$spath","$altdir/$name.dpkg-tmp");
- checked_mv("$altdir/$name.dpkg-tmp", "$altdir/$name");
+ checked_symlink("$spath","$naltdir/$name.dpkg-tmp");
+ checked_mv("$naltdir/$name.dpkg-tmp", "$naltdir/$name");
# Link slaves...
for (my $slnum = 0; $slnum < @slavenames; $slnum++) {
@@ -264,13 +267,13 @@
checked_alternative($slave, $slavelinks[$slnum],
$slavepath{$preferred, $slnum});
checked_symlink($slavepath{$preferred, $slnum},
- "$altdir/$slave.dpkg-tmp");
- checked_mv("$altdir/$slave.dpkg-tmp", "$altdir/$slave");
+ "$naltdir/$slave.dpkg-tmp");
+ checked_mv("$naltdir/$slave.dpkg-tmp", "$naltdir/$slave");
} else {
pr(sprintf(_g("Removing %s (%s), not appropriate with %s."), $slave,
$slavelinks[$slnum], $versions[$preferred]))
if $verbosemode > 0;
- checked_rm("$altdir/$slave");
+ checked_rm("$naltdir/$slave");
}
}
}
@@ -311,6 +314,14 @@
check_many_actions();
@ARGV >= 4 || &badusage(_g("--install needs "));
($alink,$name,$apath,$apriority,@ARGV) = @ARGV;
+ $napath = $ENV{'D'} . $apath;
+ if (! -e $napath) {
+ $apath = substr($alink, 0, rindex($alink, "/") + 1) . $apath;
+ $napath = $ENV{'D'} . $apath;
+ }
+ if (! -e $napath) {
+ &quit(sprintf(_g("Error: file not found: %s"), $napath));
+ }
$apriority =~ m/^[-+]?\d+/ || &badusage(_g("priority must be an integer"));
$action = 'install';
} elsif (m/^--(remove|set)$/) {
@@ -390,10 +401,10 @@
set_alternatives($name);
}
-if (defined($linkname= readlink("$altdir/$name"))) {
+if (defined($linkname= readlink("$naltdir/$name"))) {
if ($linkname eq $best) {
$state= 'expected';
- } elsif (defined(readlink("$altdir/$name.dpkg-tmp"))) {
+ } elsif (defined(readlink("$naltdir/$name.dpkg-tmp"))) {
$state= 'expected-inprogress';
} else {
$state= 'unexpected';
@@ -413,8 +424,8 @@
if ($action eq 'auto') {
&pr(sprintf(_g("Setting up automatic selection of %s."), $name))
if $verbosemode > 0;
- checked_rm("$altdir/$name.dpkg-tmp");
- checked_rm("$altdir/$name");
+ checked_rm("$naltdir/$name.dpkg-tmp");
+ checked_rm("$naltdir/$name");
$state= 'nonexistent';
$mode = 'auto';
}
@@ -426,7 +437,7 @@
if ($state eq 'unexpected' && $mode eq 'auto') {
&pr(sprintf(_g("%s has been changed (manually or by a script).\n".
- "Switching to manual updates only."), "$altdir/$name"))
+ "Switching to manual updates only."), "$naltdir/$name"))
if $verbosemode > 0;
$mode = 'manual';
}
@@ -438,7 +449,7 @@
# state=unexpected => mode=manual
&pr(sprintf(_g("Checking available versions of %s, updating links in %s ...\n".
- "(You may modify the symlinks there yourself if desired - see \`man ln'.)"), $name, $altdir))
+ "(You may modify the symlinks there yourself if desired - see \`man ln'.)"), $name, $naltdir))
if $verbosemode > 0;
if ($action eq 'install') {
@@ -527,7 +538,7 @@
if ($i > $#versions) {
&pr(sprintf(_g("Discarding obsolete slave link %s (%s)."), $slavenames[$j], $slavelinks[$j]))
if $verbosemode > 0;
- checked_rm("$altdir/$slavenames[$j]");
+ checked_rm("$naltdir/$slavenames[$j]");
checked_rm($slavelinks[$j]);
my $k = $#slavenames;
$slavenum{$slavenames[$k]}= $j;
@@ -544,14 +555,14 @@
}
if ($mode eq 'manual') {
- &pr(sprintf(_g("Automatic updates of %s are disabled, leaving it alone."), "$altdir/$name"))
+ &pr(sprintf(_g("Automatic updates of %s are disabled, leaving it alone."), "$naltdir/$name"))
if $verbosemode > 0;
&pr(sprintf(_g("To return to automatic updates use \`update-alternatives --auto %s'."), $name))
if $verbosemode > 0;
} else {
if ($state eq 'expected-inprogress') {
&pr(sprintf(_g("Recovering from previous failed update of %s ..."), $name));
- checked_mv("$altdir/$name.dpkg-tmp", "$altdir/$name");
+ checked_mv("$naltdir/$name.dpkg-tmp", "$naltdir/$name");
$state= 'expected';
}
}
@@ -589,36 +600,36 @@
if ($best eq '') {
&pr(sprintf(_g("Last package providing %s (%s) removed, deleting it."), $name, $link))
if $verbosemode > 0;
- checked_rm("$altdir/$name");
+ checked_rm("$naltdir/$name");
checked_rm("$link");
checked_rm("$admindir/$name.dpkg-new");
checked_rm("$admindir/$name");
exit(0);
} else {
checked_alternative($name, $link, $best);
- checked_rm("$altdir/$name.dpkg-tmp");
- symlink($best,"$altdir/$name.dpkg-tmp");
+ checked_rm("$naltdir/$name.dpkg-tmp");
+ symlink($best,"$naltdir/$name.dpkg-tmp");
}
}
checked_mv("$admindir/$name.dpkg-new", "$admindir/$name");
if ($mode eq 'auto') {
- checked_mv("$altdir/$name.dpkg-tmp", "$altdir/$name");
+ checked_mv("$naltdir/$name.dpkg-tmp", "$naltdir/$name");
for (my $j = 0; $j <= $#slavenames; $j++) {
$sname= $slavenames[$j];
$slink= $slavelinks[$j];
$spath= $slavepath{$bestnum,$j};
- checked_rm("$altdir/$sname.dpkg-tmp");
+ checked_rm("$naltdir/$sname.dpkg-tmp");
if ($spath eq '') {
&pr(sprintf(_g("Removing %s (%s), not appropriate with %s."), $sname, $slink, $best))
if $verbosemode > 0;
- checked_rm("$altdir/$sname");
+ checked_rm("$naltdir/$sname");
checked_rm("$slink");
} else {
checked_alternative($sname, $slink, $spath);
- checked_symlink("$spath", "$altdir/$sname.dpkg-tmp");
- checked_mv("$altdir/$sname.dpkg-tmp", "$altdir/$sname");
+ checked_symlink("$spath", "$naltdir/$sname.dpkg-tmp");
+ checked_mv("$naltdir/$sname.dpkg-tmp", "$naltdir/$sname");
}
}
}
@@ -643,7 +654,7 @@
$#versions+1, $name);
for (my $i = 0; $i <= $#versions; $i++) {
printf(STDOUT "%s%s %8s %s\n",
- (readlink("$altdir/$name") eq $versions[$i]) ? '*' : ' ',
+ (readlink("$naltdir/$name") eq $versions[$i]) ? '*' : ' ',
($best eq $versions[$i]) ? '+' : ' ',
$i+1, $versions[$i]);
}