summaryrefslogtreecommitdiff
path: root/scripts/update-rc.d.sh
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/update-rc.d.sh')
-rwxr-xr-xscripts/update-rc.d.sh104
1 files changed, 104 insertions, 0 deletions
diff --git a/scripts/update-rc.d.sh b/scripts/update-rc.d.sh
new file mode 100755
index 000000000..d471cc177
--- /dev/null
+++ b/scripts/update-rc.d.sh
@@ -0,0 +1,104 @@
+#!/bin/sh
+#
+# Usage:
+# update-rc.d <basename> remove
+# update-rc.d <basename> [options]
+# Options are:
+# start <codenumber> <runlevel> <runlevel> <runlevel> .
+# stop <codenumber> <runlevel> <runlevel> <runlevel> .
+# defaults [<codenumber> | <startcode> <stopcode>]
+# (means start <startcode> 2 3 4 5
+# as well as stop <stopcode> 0 1 2 3 4 5 6
+# <codenumber> defaults to 20)
+
+set -e
+cd /etc
+
+initd='init.d'
+
+usage () { echo >&2 "\
+update-rc.d: error: $1.
+usage: update-rc.d <basename> remove
+ update-rc.d <basename> defaults [<cn> | <scn> <kcn>]
+ update-rc.d <basename> start|stop <cn> <r> <r> . ..."; exit 1 }
+
+getinode () {
+ inode="`ls -Li1 \"$1\" | sed -e 's/^ *//; s/ .*//'`"
+}
+
+if [ $# -lt 2 ]; then usage "too few arguments"; fi
+bn="$1"; shift
+
+if [ xremove = "x$1" ]; then
+ if [ $# != 1 ]; then usage "remove must be only action"; fi
+ if [ -f "$initd/$bn" ]; then
+ echo >&2 "update-rc.d: error: /etc/$initd/$bn exists during rc.d purge."
+ exit 1
+ fi
+ echo " Removing any system startup links to /etc/$initd/$bn ..."
+ trap 'rm -f "$initd/$bn"' 0
+ touch "$initd/$bn"
+ getinode "$initd/$bn"
+ own="$inode"
+ for f in rc?.d/[SK]*; do
+ getinode "$f"
+ if [ "x$inode" = "x$own" ]; then
+ rm "$f";
+ echo " $f"
+ fi
+ done
+ exit 0
+elif [ xdefaults = "x$1" ]; then
+ if [ $# = 1 ]; then sn=20; kn=20;
+ elif [ $# = 2 ]; then sn="$2"; kn="$2";
+ elif [ $# = 3 ]; then sn="$2"; kn="$3";
+ else usage "defaults takes only one or two codenumbers"; fi
+ set start "$sn" 2 3 4 5 . stop "$kn" 0 1 6 .
+elif ! [ xstart = "x$1" -o xstop = "x$1" ]; then
+ usage "unknown mode or add action $1"
+fi
+
+if ! [ -f "$initd/$bn" ]; then
+ echo >&2 "update-rc.d: warning /etc/$initd/$bn doesn't exist during rc.d setup."
+ exit 0
+fi
+
+getinode "$initd/$bn"
+own="$inode"
+for f in rc?.d/[SK]*; do
+ getinode "$f"
+ if [ "x$inode" = "x$own" ]; then
+ echo " System startup links pointing to /etc/$initd/$bn already exist."
+ exit 0
+ fi
+done
+
+echo " Adding system startup links pointing to /etc/$initd/$bn ..."
+while [ $# -ge 3 ]; do
+ if [ xstart = "x$1" ]; then ks=S
+ elif [ xstop = "x$1" ]; then ks=K
+ else usage "unknown action $1"; fi
+ number="$2"
+ shift; shift
+ while [ $# -ge 1 ]; do
+ case "$1" in
+ .)
+ break
+ ;;
+ ?)
+ ln -s "../$initd/$bn" "rc$1.d/$ks$number$bn"
+ echo " rc$1.d/$ks$number$bn -> ../$initd/$bn"
+ shift
+ continue
+ ;;
+ esac
+ usage 'runlevel is more than one character (forgotten . ?)'
+ done
+ shift
+done
+
+if [ $# != 0 ]; then
+ usage "surplus arguments, but not enough for an add action: $*"
+fi
+
+exit 0