summaryrefslogtreecommitdiffstats
path: root/src/utils/.svn/text-base/update-alternatives.in.svn-base
diff options
context:
space:
mode:
authorP. J. McDermott <pjm@nac.net>2012-02-09 10:56:43 (EST)
committer P. J. McDermott <pjm@nac.net>2012-02-09 10:56:43 (EST)
commitf431cd1a48a6a5186633bf5f16a2d21cb4399e8c (patch)
tree337e36fd9d7884fcf76ba769ab7b0039f52d9d31 /src/utils/.svn/text-base/update-alternatives.in.svn-base
Initial commit.
TODO: Copyright information. Including source code and a patch to add files generated by GNU Autoconf is not very pretty... Running 'make dist' in the SVN trunk to generate a source archive might be better.
Diffstat (limited to 'src/utils/.svn/text-base/update-alternatives.in.svn-base')
-rw-r--r--src/utils/.svn/text-base/update-alternatives.in.svn-base197
1 files changed, 197 insertions, 0 deletions
diff --git a/src/utils/.svn/text-base/update-alternatives.in.svn-base b/src/utils/.svn/text-base/update-alternatives.in.svn-base
new file mode 100644
index 0000000..34d89f1
--- /dev/null
+++ b/src/utils/.svn/text-base/update-alternatives.in.svn-base
@@ -0,0 +1,197 @@
+#!/bin/sh
+# update-alternatives
+#
+# Copyright (C) 2001 Carl D. Worth
+#
+# This program was inspired by the Debian update-alternatives program
+# which is Copyright (C) 1995 Ian Jackson. This version of
+# update-alternatives is command-line compatible with Debian's for a
+# subset of the options, (only --install, --remove, and --help)
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+set -e
+
+# admin dir
+ad="$OPKG_OFFLINE_ROOT@opkglibdir@/opkg/alternatives"
+
+usage() {
+ echo "update-alternatives: $*
+
+Usage: update-alternatives --install <link> <name> <path> <priority>
+ update-alternatives --remove <name> <path>
+ update-alternatives --help
+<link> is the link pointing to the provided path (ie. /usr/bin/foo).
+<name> is the name in $ad/alternatives (ie. foo)
+<path> is the name referred to (ie. /usr/bin/foo-extra-spiffy)
+<priority> is an integer; options with higher numbers are chosen.
+" >&2
+ exit 2
+}
+
+quit() {
+ echo "update-alternatives: $*" >&2
+ exit 2
+}
+
+register_alt() {
+ [ $# -lt 2 ] && return 1
+ local name="$1"
+ local link="$2"
+
+ if [ ! -d $ad ]; then
+ mkdir -p $ad
+ fi
+
+ if [ -e "$ad/$name" ]; then
+ local olink=`head -n 1 $ad/$name`
+ if [ "$link" != "$olink" ]; then
+ echo "update-alternatives: Error: cannot register alternative $name to $link since it is already registered to $olink" >&2
+ return 1
+ fi
+ else
+ echo "$link" > "$ad/$name"
+ fi
+
+ return 0
+}
+
+protect_slashes() {
+ sed -e 's/\//\\\//g'
+}
+
+remove_alt() {
+ [ $# -lt 2 ] && return 1
+ local name="$1"
+ local path="$2"
+
+ [ ! -f $ad/$name ] && return 0
+
+ path=`echo $path | protect_slashes`
+ sed -ne "/^$path\>.*/!p" $ad/$name > $ad/$name.new
+ mv $ad/$name.new $ad/$name
+}
+
+add_alt() {
+ [ $# -lt 3 ] && return 1
+ local name="$1"
+ local path="$2"
+ local priority="$3"
+ remove_alt $name $path
+ echo "$path $priority" >> $ad/$name
+}
+
+find_best_alt() {
+ [ $# -lt 1 ] && return 1
+ [ ! -f $ad/$name ] && return 0
+
+ link=$OPKG_OFFLINE_ROOT/`head -n 1 $ad/$name`
+
+ prio=`sed -ne "1!p" $ad/$name | sed -e "s/\(.*\) \(.*\)/\2 \1/g" | sort -nr | head -n 1 | sed 's/ [^ ]*$//'`
+ if [ -z "$prio" ]; then
+ echo "update-alternatives: removing $link as no more alternatives exist for it"
+ rm $ad/$name
+ if [ -L $link ]; then
+ rm $link
+ fi
+ return 0
+ fi
+
+ ## Find last line with highest priority.
+ path=`grep "${prio}$" $ad/$name | tail -n 1 | sed 's/ [^ ]*$//'`
+
+ if [ ! -e $link -o -L $link ]; then
+ local link_dir=`dirname $link`
+ if [ ! -d $link_dir ]; then
+ mkdir -p $link_dir
+ fi
+ if [ -h $link -a -d $link ]; then
+ # If $link exists and the target is a directory,
+ # 'ln -sf $path $link' doesn't replace the link to
+ # that directory, it creates new link inside.
+ echo "update-alternatives: Removing $link".
+ rm -f $link
+ fi
+ ln -sf $path $link
+ echo "update-alternatives: Linking $link to $path"
+ else
+ echo "update-alternatives: Error: not linking $link to $path since $link exists and is not a link"
+ return 1
+ fi
+
+ return 0
+}
+
+do_install() {
+ if [ $# -lt 4 ]; then
+ usage "--install needs <link> <name> <path> <priority>"
+ fi
+ local link="$1"
+ local name="$2"
+ local path="$3"
+ local priority="$4"
+
+ path=`echo $path | sed 's|/\+|/|g'`
+
+ # This is a bad hack, but I haven't thought of a cleaner solution yet...
+ [ -n "$OPKG_OFFLINE_ROOT" ] && path=`echo $path | sed "s|^$OPKG_OFFLINE_ROOT/*|/|"`
+
+ register_alt $name $link
+ add_alt $name $path $priority
+ find_best_alt $name
+}
+
+do_remove() {
+ if [ $# -lt 2 ]; then
+ usage "--remove needs <name> <path>"
+ fi
+ local name="$1"
+ local path="$2"
+
+ path=`echo $path | sed 's|/\+|/|g'`
+
+ # This is a bad hack, but I haven't thought of a cleaner solution yet...
+ [ -n "$OPKG_OFFLINE_ROOT" ] && path=`echo $path | sed "s|^$OPKG_OFFLINE_ROOT/*|/|"`
+
+ remove_alt $name $path
+ find_best_alt $name
+}
+
+###
+# update-alternatives "main"
+###
+
+while [ $# -gt 0 ]; do
+ arg="$1"
+ shift
+
+ case $arg in
+ --help)
+ usage "help:"
+ exit 0
+ ;;
+ --install)
+ do_install $*
+ exit $?
+ ;;
+ --remove)
+ do_remove $*
+ exit $?
+ ;;
+ *)
+ usage "unknown argument \`$arg'"
+ ;;
+ esac
+done
+
+usage "at least one of --install or --remove must appear"
+
+exit 0