Please run the attached shell script and mail the output to: 236256@bugs.debian.org -- G. Branden Robinson | Every aristocracy that has ever Debian GNU/Linux | existed has behaved, in all branden@debian.org | essential points, exactly like a http://people.debian.org/~branden/ | small mob. -- G.K. Chesterton
#!/bin/sh
PROGNAME=${0##*/}
# Use special abnormal exit codes so that problems with this script are more
# easily tracked down.
INTERNAL_ERROR=86
THROWN_ERROR=74
USAGE_ERROR=99
trap "message;\
message \"Received signal. Aborting.\";\
message;\
exit 1" HUP INT QUIT TERM
# Query the terminal to establish a default number of columns to use for
# displaying messages to the user. This is used only as a fallback in the
# event the COLUMNS variable is not set. ($COLUMNS can react to SIGWINCH while
# the script is running, and this cannot, only being calculated once.)
DEFCOLUMNS=$(stty size 2> /dev/null | awk '{print $2}') || true
if ! expr "$DEFCOLUMNS" : "[[:digit:]]\+$" > /dev/null 2>&1; then
DEFCOLUMNS=80
fi
message () {
# pretty-print messages of arbitrary length
reject_nondigits "$COLUMNS"
echo "$*" | fmt -t -w ${COLUMNS:-$DEFCOLUMNS} >&2
}
observe () {
# syntax: observe message ...
#
# issue observational message suitable for logging someday when support for
# it exists in dpkg
if [ -n "$DEBUG_XFREE86_PACKAGE" ]; then
message "$PROGNAME note: $*"
fi
}
warn () {
# syntax: warn message ...
#
# issue warning message suitable for logging someday when support for
# it exists in dpkg; also send to standard error
message "$PROGNAME warning: $*"
}
die () {
# syntax: die message ...
#
# exit script with error message
message "$PROGNAME error: $*"
exit $THROWN_ERROR
}
internal_error () {
# exit script with error; essentially a "THIS SHOULD NEVER HAPPEN" message
message "internal error: $*"
exit $INTERNAL_ERROR
}
usage_error () {
message "usage error: $*"
exit $USAGE_ERROR
}
maplink () {
# returns what symlink should point to; i.e., what the "sane" answer is
# Keep this in sync with the debian/*.links files.
# This is only needed for symlinks to directories.
case "$1" in
/etc/X11/xkb/compiled) echo /var/lib/xkb ;;
/etc/X11/xkb/xkbcomp) echo /usr/X11R6/bin/xkbcomp ;;
/usr/X11R6/lib/X11/app-defaults) echo /etc/X11/app-defaults ;;
/usr/X11R6/lib/X11/fs) echo /etc/X11/fs ;;
/usr/X11R6/lib/X11/lbxproxy) echo /etc/X11/lbxproxy ;;
/usr/X11R6/lib/X11/proxymngr) echo /etc/X11/proxymngr ;;
/usr/X11R6/lib/X11/rstart) echo /etc/X11/rstart ;;
/usr/X11R6/lib/X11/twm) echo /etc/X11/twm ;;
/usr/X11R6/lib/X11/xdm) echo /etc/X11/xdm ;;
/usr/X11R6/lib/X11/xinit) echo /etc/X11/xinit ;;
/usr/X11R6/lib/X11/xkb) echo /etc/X11/xkb ;;
/usr/X11R6/lib/X11/xserver) echo /etc/X11/xserver ;;
/usr/X11R6/lib/X11/xsm) echo /etc/X11/xsm ;;
/usr/bin/X11) echo ../X11R6/bin ;;
/usr/bin/rstartd) echo ../X11R6/bin/rstartd ;;
/usr/include/X11) echo ../X11R6/include/X11 ;;
/usr/lib/X11) echo ../X11R6/lib/X11 ;;
*) internal_error "maplink() called with unknown path \"$1\"" ;;
esac
}
analyze_path () {
# given a supplied set of pathnames, break each one up by directory and do an
# ls -dl on each component, cumulatively; i.e.
# analyze_path /usr/X11R6/bin -> ls -dl /usr /usr/X11R6 /usr/X11R6/bin
# Thanks to Randolph Chung for this clever hack.
local f g
while [ -n "$1" ]; do
reject_whitespace "$1"
g=
message "Analyzing $1:"
for f in $(echo "$1" | tr / \ ); do
if [ -e /$g$f ]; then
ls -dl /$g$f /$g$f.dpkg-* 2> /dev/null || true
g=$g$f/
else
message "/$g$f: nonexistent; directory contents of /$g:"
ls -l /$g
break
fi
done
shift
done
}
find_culprits () {
local f p dpkg_info_dir possible_culprits smoking_guns bad_packages package \
msg
reject_whitespace "$1"
message "Searching for overlapping packages..."
dpkg_info_dir=/var/lib/dpkg/info
if [ -d $dpkg_info_dir ]; then
if [ "$(echo $dpkg_info_dir/*.list)" != "$dpkg_info_dir/*.list" ]; then
possible_culprits=$(ls -1 $dpkg_info_dir/*.list | egrep -v \
"(xbase-clients|xfree86-common|xfs|xlibs)")
if [ -n "$possible_culprits" ]; then
smoking_guns=$(grep -l "$1" $possible_culprits)
if [ -n "$smoking_guns" ]; then
bad_packages=$(printf "\\n")
for f in $smoking_guns; do
# too bad you can't nest parameter expansion voodoo
p=${f%*.list} # strip off the trailing ".list"
package=${p##*/} # strip off the directories
bad_packages=$(printf "%s\n%s" "$bad_packages" "$package")
done
msg=$(cat <<EOF
The following packages appear to have file overlaps with the XFree86 packages;
these packages are either very old, or in violation of Debian Policy. Try
upgrading each of these packages to the latest available version if possible:
for example, with the command "apt-get install". If no newer version of a
package is available, you will have to remove it; for example, with the command
"apt-get remove". If even the latest available version of the package has
this file overlap, please file a bug against that package with the Debian Bug
Tracking System. You may want to refer the package maintainer to section 12.8
of the Debian Policy manual.
EOF
)
message "$msg"
message "The overlapping packages are: $bad_packages"
else
message "no overlaps found."
fi
fi
else
message "cannot search; no matches for $dpkg_info_dir/*.list."
fi
else
message "cannot search; $dpkg_info_dir does not exist."
fi
}
# we require a readlink command or shell function
if ! which readlink > /dev/null 2>&1; then
message "The readlink command was not found. Please install version" \
"1.13.1 or later of the debianutils package."
readlink () {
# returns what symlink in $1 actually points to
perl -e '$l = shift; exit 1 unless -l $l; $r = readlink $l; exit 1 unless $r; print "$r\n"' "$1"
}
fi
check_symlinks_and_warn () {
# syntax: check_symlinks_and_warn symlink ...
#
# For each argument, check for symlink sanity, and warn if it isn't sane.
#
# Call this function from a preinst script in the event $1 is "upgrade" or
# "install".
local errmsg symlink
# validate arguments
if [ $# -lt 1 ]; then
usage_error "check_symlinks_and_warn() called with wrong number of" \
"arguments; expected at least 1, got $#"
exit $USAGE_ERROR
fi
while [ -n "$1" ]; do
symlink="$1"
if [ -L "$symlink" ]; then
if [ "$(maplink "$symlink")" != "$(readlink "$symlink")" ]; then
observe "$symlink symbolic link points to wrong location" \
"$(readlink "$symlink"); removing"
rm "$symlink"
fi
elif [ -e "$symlink" ]; then
errmsg="$symlink exists and is not a symbolic link; this package cannot"
errmsg="$errmsg be installed until this"
if [ -f "$symlink" ]; then
errmsg="$errmsg file"
elif [ -d "$symlink" ]; then
errmsg="$errmsg directory"
else
errmsg="$errmsg thing"
fi
errmsg="$errmsg is removed"
die "$errmsg"
fi
shift
done
}
check_symlinks_and_bomb () {
# syntax: check_symlinks_and_bomb symlink ...
#
# For each argument, check for symlink sanity, and bomb if it isn't sane.
#
# Call this function from a postinst script.
local problem symlink
# validate arguments
if [ $# -lt 1 ]; then
usage_error "check_symlinks_and_bomb() called with wrong number of"
"arguments; expected at least 1, got $#"
exit $USAGE_ERROR
fi
while [ -n "$1" ]; do
problem=
symlink="$1"
if [ -L "$symlink" ]; then
if [ "$(maplink "$symlink")" != "$(readlink "$symlink")" ]; then
problem=yes
warn "$symlink symbolic link points to wrong location" \
"$(readlink "$symlink")"
fi
elif [ -e "$symlink" ]; then
problem=yes
warn "$symlink is not a symbolic link"
else
problem=yes
warn "$symlink symbolic link does not exist"
fi
if [ -n "$problem" ]; then
analyze_path "$symlink" "$(readlink "$symlink")"
find_culprits "$symlink"
die "bad symbolic links on system"
fi
shift
done
}
check_symlinks_and_bomb \
/etc/X11/xkb/compiled \
/etc/X11/xkb/xkbcomp \
/usr/X11R6/lib/X11/app-defaults \
/usr/X11R6/lib/X11/fs \
/usr/X11R6/lib/X11/lbxproxy \
/usr/X11R6/lib/X11/proxymngr \
/usr/X11R6/lib/X11/rstart \
/usr/X11R6/lib/X11/twm \
/usr/X11R6/lib/X11/xdm \
/usr/X11R6/lib/X11/xinit \
/usr/X11R6/lib/X11/xkb \
/usr/X11R6/lib/X11/xserver \
/usr/X11R6/lib/X11/xsm \
/usr/bin/X11 \
/usr/bin/rstartd \
/usr/include/X11 \
/usr/lib/X11
# vim:set ai et sts=2 sw=2 tw=0:
Attachment:
signature.asc
Description: Digital signature