I looked closer at the source and all test of the error value are made against $! instead of $|. This patch fix all occurences i found in update-alternatives and restore file openings error messages. That had nothing in termn of functionality. I hope users won't be disturbed by those new errors .
One last note . This patch may cause some postinstall script getting broken , as before all those test on file returned 0 in case of failure. That s an ABI change whihc may have to be discussed a bit on devel before commit. I don t want to have something to do with a new flood of RC bugs for a known issue ... I mistakenly sended those two paragraphs to 246906 (god knows why) and cannot find how to moved them back to this bug. If someone can please help. I also found another perl scripts in dpkg which have the same error "dpkg-divert". I ll retag this bug as normal and retitle it. I guess i will have time to patch the other scripts tomorrow. Regards Alban
--- update-alternatives.orig 2005-01-20 02:28:44.610908162 +0100 +++ update-alternatives 2005-01-20 02:32:45.976432321 +0100 @@ -167,7 +167,7 @@ } close(AF); $dataread=1; -} elsif ($! != &ENOENT) { +} elsif ($| != &ENOENT) { &quit("failed to open $admindir/$name: $!"); } @@ -179,7 +179,7 @@ &pr("$name - status is $manual."); if (defined($linkname= readlink("$altdir/$name"))) { &pr(" link currently points to $linkname"); - } elsif ($! == &ENOENT) { + } elsif ($| == &ENOENT) { &pr(" link currently absent"); } else { &pr(" link unreadable - $!"); @@ -244,7 +244,7 @@ } else { $state= 'unexpected'; } -} elsif ($! == &ENOENT) { +} elsif ($| == &ENOENT) { $state= 'nonexistent'; } else { $state= 'unexpected'; @@ -259,9 +259,9 @@ if ($mode eq 'auto') { &pr("Setting up automatic selection of $name.") if $verbosemode > 0; - unlink("$altdir/$name.dpkg-tmp") || $! == &ENOENT || + unlink("$altdir/$name.dpkg-tmp") || $| == &ENOENT || &quit("unable to remove $altdir/$name.dpkg-tmp: $!"); - unlink("$altdir/$name") || $! == &ENOENT || + unlink("$altdir/$name") || $| == &ENOENT || &quit("unable to remove $altdir/$name.dpkg-tmp: $!"); $state= 'nonexistent'; $manual= 'auto'; @@ -293,7 +293,7 @@ if ($link ne $alink && $link ne '') { &pr("Renaming $name link from $link to $alink.") if $verbosemode > 0; - rename_mv($link,$alink) || $! == &ENOENT || + rename_mv($link,$alink) || $| == &ENOENT || &quit("unable to rename $link to $alink: $!"); } $link= $alink; @@ -315,7 +315,7 @@ if ($newslavelink ne $oldslavelink && $oldslavelink ne '') { &pr("Renaming $sname slave link from $oldslavelink to $newslavelink.") if $verbosemode > 0; - rename_mv($oldslavelink,$newslavelink) || $! == &ENOENT || + rename_mv($oldslavelink,$newslavelink) || $| == &ENOENT || &quit("unable to rename $oldslavelink to $newslavelink: $!"); } $slavelinks[$j]= $newslavelink; @@ -369,9 +369,9 @@ if ($i > $#versions) { &pr("Discarding obsolete slave link $slavenames[$j] ($slavelinks[$j]).") if $verbosemode > 0; - unlink("$altdir/$slavenames[$j]") || $! == &ENOENT || + unlink("$altdir/$slavenames[$j]") || $| == &ENOENT || &quit("unable to remove $slavenames[$j]: $!"); - unlink($slavelinks[$j]) || $! == &ENOENT || + unlink($slavelinks[$j]) || $| == &ENOENT || &quit("unable to remove $slavelinks[$j]: $!"); $k= $#slavenames; $slavenum{$slavenames[$k]}= $j; @@ -435,22 +435,22 @@ if ($best eq '') { &pr("Last package providing $name ($link) removed, deleting it.") if $verbosemode > 0; - unlink("$altdir/$name") || $! == &ENOENT || + unlink("$altdir/$name") || $| == &ENOENT || &quit("unable to remove $altdir/$name: $!"); - unlink("$link") || $! == &ENOENT || + unlink("$link") || $| == &ENOENT || &quit("unable to remove $altdir/$name: $!"); unlink("$admindir/$name.dpkg-new") || &quit("unable to remove $admindir/$name.dpkg-new: $!"); - unlink("$admindir/$name") || $! == &ENOENT || + unlink("$admindir/$name") || $| == &ENOENT || &quit("unable to remove $admindir/$name: $!"); exit(0); } else { - if (!defined($linkname= readlink($link)) && $! != &ENOENT) { + if (!defined($linkname= readlink($link)) && $| != &ENOENT) { &pr("warning: $link is supposed to be a symlink to $altdir/$name\n". " (or nonexistent); however, readlink failed: $!") if $verbosemode > 0; } elsif ($linkname ne "$altdir/$name") { - unlink("$link.dpkg-tmp") || $! == &ENOENT || + unlink("$link.dpkg-tmp") || $| == &ENOENT || &quit("unable to ensure $link.dpkg-tmp nonexistent: $!"); symlink("$altdir/$name","$link.dpkg-tmp") || &quit("unable to make $link.dpkg-tmp a symlink to $altdir/$name: $!"); @@ -464,7 +464,7 @@ &pr("Updating $name ($link) to point to $best.") if $verbosemode > 0; } - unlink("$altdir/$name.dpkg-tmp") || $! == &ENOENT || + unlink("$altdir/$name.dpkg-tmp") || $| == &ENOENT || &quit("unable to ensure $altdir/$name.dpkg-tmp nonexistent: $!"); symlink($best,"$altdir/$name.dpkg-tmp"); } @@ -479,12 +479,12 @@ for ($j=0; $j<=$#slavenames; $j++) { $sname= $slavenames[$j]; $slink= $slavelinks[$j]; - if (!defined($linkname= readlink($slink)) && $! != &ENOENT) { + if (!defined($linkname= readlink($slink)) && $| != &ENOENT) { &pr("warning: $slink is supposed to be a slave symlink to\n". " $altdir/$sname, or nonexistent; however, readlink failed: $!") if $verbosemode > 0; } elsif ($linkname ne "$altdir/$sname") { - unlink("$slink.dpkg-tmp") || $! == &ENOENT || + unlink("$slink.dpkg-tmp") || $| == &ENOENT || &quit("unable to ensure $slink.dpkg-tmp nonexistent: $!"); symlink("$altdir/$sname","$slink.dpkg-tmp") || &quit("unable to make $slink.dpkg-tmp a symlink to $altdir/$sname: $!"); @@ -492,14 +492,14 @@ &quit("unable to install $slink.dpkg-tmp as $slink: $!"); } $spath= $slavepath{$bestnum,$j}; - unlink("$altdir/$sname.dpkg-tmp") || $! == &ENOENT || + unlink("$altdir/$sname.dpkg-tmp") || $| == &ENOENT || &quit("unable to ensure $altdir/$sname.dpkg-tmp nonexistent: $!"); if ($spath eq '') { &pr("Removing $sname ($slink), not appropriate with $best.") if $verbosemode > 0; - unlink("$altdir/$sname") || $! == &ENOENT || + unlink("$altdir/$sname") || $| == &ENOENT || &quit("unable to remove $altdir/$sname: $!"); - unlink("$slink") || $! == &ENOENT || + unlink("$slink") || $| == &ENOENT || &quit("unable to remove $slink: $!"); } else { if (defined($linkname= readlink("$altdir/$sname")) && $linkname eq $spath) { @@ -562,7 +562,7 @@ } else { &pr("Removing $slave ($slavelinks[$slnum]), not appropriate with $versions[$preferred].") if $verbosemode > 0; - unlink("$altdir/$slave") || $! == &ENOENT || + unlink("$altdir/$slave") || $| == &ENOENT || &quit("unable to remove $altdir/$slave: $!"); } } @@ -598,7 +598,7 @@ } else { &pr("Removing $slave ($slavelinks[$slnum]), not appropriate with $versions[$preferred].") if $verbosemode > 0; - unlink("$altdir/$slave") || $! == &ENOENT || + unlink("$altdir/$slave") || $| == &ENOENT || &quit("unable to remove $altdir/$slave: $!"); } } @@ -610,7 +610,7 @@ print(AF "$_[0]\n") || &quit("error writing stdout: $!"); } sub gl { - $!=0; $_= <AF>; + $|=0; $_= <AF>; length($_) || &quit("error or eof reading $admindir/$name for $_[0] ($!)"); s/\n$// || &badfmt("missing newline after $_[0]"); $_;