152 lines
3.8 KiB
Bash
Executable File
152 lines
3.8 KiB
Bash
Executable File
#!/bin/dash
|
|
set -e
|
|
|
|
# $1: dfile, $2: link target, $3: distrib
|
|
replace_with_link() {
|
|
dfile="$DPKG_ROOT$1"; ltarget=$2; distrib="$DPKG_ROOT$3"
|
|
temp="$dfile.tmp"
|
|
# Safely create a symlink to $ltarget at $dfile, first
|
|
# making a backup of $dfile (the file being diverted)
|
|
# in $distrib (if specified).
|
|
#
|
|
# The cp / ln -s / mv dance avoids having to live without
|
|
# $dfile (think: /bin/sh) for even a moment, so applications
|
|
# running in parallel can continue without trouble.
|
|
# See dash.preinst for details.
|
|
if [ -n "$distrib" ] && [ -e "$dfile" ]; then
|
|
cp -dp "$dfile" "$distrib"
|
|
fi
|
|
ln -sf "$ltarget" "$temp"
|
|
mv -f "$temp" "$dfile"
|
|
}
|
|
|
|
claim_binsh() {
|
|
dfile=$1 ltarget=$2 distrib=${3:-$dfile.distrib}
|
|
diverter=$(dpkg-divert --listpackage $dfile)
|
|
truename=$(dpkg-divert --truename $dfile)
|
|
|
|
if [ "$diverter" = dash ]; then
|
|
# good.
|
|
return
|
|
fi
|
|
|
|
if [ "$diverter" = LOCAL ]; then
|
|
# The sysadmin wants it this way. Who am I to argue?
|
|
return
|
|
fi
|
|
|
|
if [ -n "$diverter" ] && [ "$diverter" != bash ]; then
|
|
# Let dpkg-divert error out; we are not taking
|
|
# over the diversion, unless we added it
|
|
# ourselves on behalf of bash.
|
|
dpkg-divert --package dash --no-rename --remove $dfile
|
|
echo "This should never be reached"
|
|
exit 1
|
|
fi
|
|
|
|
dpkg-divert --package bash --no-rename --remove $dfile
|
|
dpkg-divert --package dash --no-rename --divert $distrib --add $dfile
|
|
# remove the old equivalent of $distrib, if it existed.
|
|
if [ -n "$DPKG_ROOT$truename" ]; then
|
|
rm -f "$DPKG_ROOT$truename"
|
|
fi
|
|
replace_with_link $dfile $ltarget $distrib
|
|
}
|
|
|
|
unclaim_binsh() {
|
|
dfile=$1 ltarget=$2 distrib=${3:-$dfile.distrib}
|
|
diverter=$(dpkg-divert --listpackage $dfile)
|
|
truename=$(dpkg-divert --truename $dfile)
|
|
|
|
if [ "$diverter" != dash ]; then
|
|
# good.
|
|
return
|
|
fi
|
|
|
|
# Donate the diversion and sh symlink to the bash package.
|
|
ltarget=$(echo $ltarget | sed s/dash/bash/)
|
|
dpkg-divert --package dash --no-rename --remove $dfile
|
|
dpkg-divert --package bash --no-rename --divert $distrib --add $dfile
|
|
if [ -n "$truename" ]; then
|
|
rm -f "$truename"
|
|
fi
|
|
replace_with_link $dfile $ltarget $distrib
|
|
}
|
|
|
|
initial_binsh_setup() {
|
|
dfile=$1 ltarget=$2 distrib=${3:-$dfile.distrib} ashfile=$4
|
|
diverter=$(dpkg-divert --listpackage $dfile)
|
|
truename=$(dpkg-divert --truename $dfile)
|
|
|
|
if [ -z "$diverter" ]; then
|
|
# good.
|
|
return
|
|
fi
|
|
|
|
if [ "$diverter" = ash ]; then
|
|
dpkg-divert --package ash --no-rename --remove $dfile
|
|
dpkg-divert --package dash --no-rename --divert $distrib --add $dfile
|
|
|
|
if [ "$truename" != "$distrib" ] && [ -e "$truename" ]; then
|
|
mv "$truename" "$distrib"
|
|
fi
|
|
replace_with_link $dfile $ltarget
|
|
return
|
|
fi
|
|
|
|
if
|
|
[ -h $dfile ] &&
|
|
[ -f $dfile ] &&
|
|
[ -f $ashfile ] &&
|
|
cmp $dfile $ashfile
|
|
then
|
|
replace_with_link $dfile $ltarget
|
|
fi
|
|
}
|
|
|
|
add_shell() {
|
|
if ! type add-shell > /dev/null 2>&1; then
|
|
return
|
|
fi
|
|
|
|
add-shell /bin/dash
|
|
}
|
|
|
|
debconf=
|
|
if [ -f /usr/share/debconf/confmodule ]; then
|
|
. /usr/share/debconf/confmodule
|
|
debconf=yes
|
|
fi
|
|
|
|
if [ "$1" = configure ] && [ -z "$2" ]; then
|
|
initial_binsh_setup /bin/sh dash '' /bin/ash
|
|
initial_binsh_setup /usr/share/man/man1/sh.1.gz dash.1.gz \
|
|
/usr/share/man/man1/sh.distrib.1.gz \
|
|
/usr/share/man/man1/ash.1.gz
|
|
add_shell
|
|
elif [ "$1" = configure ] && dpkg --compare-versions "$2" lt 0.4.18; then
|
|
add_shell
|
|
fi
|
|
|
|
if [ $debconf ]; then
|
|
db_get dash/sh
|
|
if [ "$RET" = true ]; then
|
|
claim_binsh /bin/sh dash
|
|
if [ -d "$DPKG_ROOT/usr/share/man/man1/" ]; then
|
|
claim_binsh /usr/share/man/man1/sh.1.gz dash.1.gz \
|
|
/usr/share/man/man1/sh.distrib.1.gz
|
|
fi
|
|
else
|
|
unclaim_binsh /bin/sh dash
|
|
unclaim_binsh /usr/share/man/man1/sh.1.gz dash.1.gz \
|
|
/usr/share/man/man1/sh.distrib.1.gz
|
|
fi
|
|
fi
|
|
|
|
# Automatically added by dh_installmenu/13.6ubuntu1
|
|
if [ "$1" = "configure" ] && [ -x "`command -v update-menus`" ]; then
|
|
update-menus
|
|
fi
|
|
# End automatically added section
|
|
|