aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Bächler <thomas@archlinux.org>2009-08-26 23:26:54 +0200
committerThomas Bächler <thomas@archlinux.org>2009-08-26 23:26:54 +0200
commit58fc27aaeb6d7d67cdf93997a33e0cbe4b5d7ada (patch)
tree05e9c2df6176d3f679739b7a25d047478ee6de32
parentcfabb85924f35c636550609b332d088aaae9941f (diff)
downloadinitscripts-58fc27aaeb6d7d67cdf93997a33e0cbe4b5d7ada.tar.xz
Make the hook-system a bit more usable
This patch makes the hook names unique, prefixing them all with the script name (without the 'rc.') It also removes the explicit declarations of all elements of the array, bash assumes "" if they are uninitialized
-rw-r--r--functions35
-rwxr-xr-xrc.multi4
-rwxr-xr-xrc.shutdown8
-rwxr-xr-xrc.single12
-rwxr-xr-xrc.sysinit10
5 files changed, 37 insertions, 32 deletions
diff --git a/functions b/functions
index 56b78be..5c1e6f8 100644
--- a/functions
+++ b/functions
@@ -239,26 +239,31 @@ ck_status() {
# ...
# }
# add_hook hook_name function_name
-# It's allowed to register several hook functions for the same hook
-#
-# The function takes the filename of the script that launched it as an argument
+# It is allowed to register several hook functions for the same hook
+# Is is also allowed to register the same hook function for several hooks
#
# Currently, the following hooks exist:
-# start: at the beginning of rc.{multi,shutdown,single,sysinit}
-# end: at the end of rc.{multi,single,sysinit}
-# udevlaunched: after udev has been launched in rc.sysinit and rc.single
-# udevsettled: after uevents have settled in rc.sysinit and rc.single
-# premount: before local filesystems are mounted, but after root is mounted read-write in rc.sysinit
-# prekillall: before all processes are being killed in rc.shutdown and rc.single
-# postkillall: after all processes have been killed in rc.shutdown and rc.single
-# poweroff: directly before powering off in rc.shutdown
+# sysinit_start: at the beginning of rc.sysinit
+# multi_start: at the beginning of rc.multi
+# single_start: at the beginning of rc.single
+# shutdown_start: at the beginning of rc.shutdown
+# sysinit_end: at the end of rc.sysinit
+# multi_end: at the end of rc.multi
+# single_end: at the end of rc.single
+# sysinit_udevlaunched: after udev has been launched in rc.sysinit
+# single_udevlaunched: after udev has been launched in rc.single
+# sysinit_udevsettled: after uevents have settled in rc.sysinit
+# single_udevsettled: after uevents have settled in rc.single
+# sysinit_premount: before local filesystems are mounted, but after root is mounted read-write in rc.sysinit
+# shutdown_prekillall: before all processes are being killed in rc.shutdown
+# single_prekillall: before all processes are being killed in rc.single
+# shutdown_postkillall: after all processes have been killed in rc.shutdown
+# single_postkillall: after all processes have been killed in rc.single
+# shutdown_poweroff: directly before powering off in rc.shutdown
#
# Make sure to never override the add_hook and run_hook functions via functions.d
declare -A hook_funcs
-for hook in start end udevlaunched udevsettled premount prekillall postkillall poweroff; do
- hook_funcs["${hook}"]=""
-done
add_hook() {
[ -z "$1" -o -z "$2" ] && return 1
@@ -270,7 +275,7 @@ run_hook() {
[ -z "$1" ] && return 1
for func in ${hook_funcs["$1"]}; do
- ${func} "$2"
+ ${func}
done
}
diff --git a/rc.multi b/rc.multi
index 0cddd1d..a7ea703 100755
--- a/rc.multi
+++ b/rc.multi
@@ -6,7 +6,7 @@
. /etc/rc.conf
. /etc/rc.d/functions
-run_hook start rc.multi
+run_hook multi_start
# Load sysctl variables if sysctl.conf is present
[ -r /etc/sysctl.conf ] && /sbin/sysctl -q -p &>/dev/null
@@ -26,6 +26,6 @@ if [ -x /etc/rc.local ]; then
/etc/rc.local
fi
-run_hook end rc.multi
+run_hook multi_end
# vim: set ts=2 noet:
diff --git a/rc.shutdown b/rc.shutdown
index 5921e1c..34442ca 100755
--- a/rc.shutdown
+++ b/rc.shutdown
@@ -6,7 +6,7 @@
. /etc/rc.conf
. /etc/rc.d/functions
-run_hook start rc.shutdown
+run_hook shutdown_start
# avoid staircase effect
/bin/stty onlcr
@@ -43,7 +43,7 @@ if [ "$PREVLEVEL" = "3" -o "$PREVLEVEL" = "5" ]; then
done
fi
-run_hook prekillall rc.shutdown
+run_hook shutdown_prekillall
# Terminate all processes
stat_busy "Sending SIGTERM To Processes"
@@ -56,7 +56,7 @@ stat_busy "Sending SIGKILL To Processes"
/bin/sleep 1
stat_done
-run_hook postkillall rc.shutdown
+run_hook shutdown_postkillall
stat_busy "Saving Random Seed"
RANDOM_SEED=/var/lib/misc/random-seed
@@ -138,7 +138,7 @@ stat_busy "Remounting Root Filesystem Read-only"
/bin/mount -n -o remount,ro /
stat_done
-run_hook poweroff rc.shutdown
+run_hook shutdown_poweroff
# Power off or reboot
if [ "$RUNLEVEL" = "0" ]; then
diff --git a/rc.single b/rc.single
index d72e95b..2927932 100755
--- a/rc.single
+++ b/rc.single
@@ -6,7 +6,7 @@
. /etc/rc.conf
. /etc/rc.d/functions
-run_hook start rc.single
+run_hook single_start
if [ "$PREVLEVEL" = "3" -o "$PREVLEVEL" = "5" ]; then
# Find daemons NOT in the DAEMONS array. Shut these down first
@@ -28,7 +28,7 @@ if [ "$PREVLEVEL" = "3" -o "$PREVLEVEL" = "5" ]; then
fi
if [ "$PREVLEVEL" != "N" ]; then
- run_hook prekillall rc.single
+ run_hook single_prekillall
# Terminate all processes
stat_busy "Sending SIGTERM To Processes"
@@ -41,13 +41,13 @@ if [ "$PREVLEVEL" != "N" ]; then
/bin/sleep 1
stat_done
- run_hook postkillall rc.single
+ run_hook single_postkillall
stat_busy "Starting UDev Daemon"
/sbin/udevd --daemon
stat_done
- run_hook udevlaunched rc.single
+ run_hook single_udevlaunched
# Trigger udev uevents
if /bin/pidof -o %PPID /sbin/udevd >/dev/null; then
@@ -63,7 +63,7 @@ if [ "$PREVLEVEL" != "N" ]; then
stat_done
fi
- run_hook udevsettled rc.single
+ run_hook single_udevsettled
# try syslog-NG first, then fall back to good ol' syslogd
if [ -x /etc/rc.d/syslog-ng ]; then
@@ -74,7 +74,7 @@ if [ "$PREVLEVEL" != "N" ]; then
fi
fi
-run_hook end rc.single
+run_hook single_end
if [ "$RUNLEVEL" = "1" ]; then
printsep
diff --git a/rc.sysinit b/rc.sysinit
index 60dcbef..9c705b9 100755
--- a/rc.sysinit
+++ b/rc.sysinit
@@ -14,7 +14,7 @@ printhl "Copyright 2007-2009 Aaron Griffin"
printhl "Distributed under the GNU General Public License (GPL)"
printsep
-run_hook start rc.sysinit
+run_hook sysinit_start
# mount /proc, /sys and our RAM /dev
/bin/mount -n -t tmpfs udev /dev -o mode=0755,size=10M,nosuid
@@ -65,7 +65,7 @@ stat_busy "Starting UDev Daemon"
/sbin/udevd --daemon
stat_done
-run_hook udevlaunched rc.sysinit
+run_hook sysinit_udevlaunched
# Trigger udev uevents
if /bin/pidof -o %PPID /sbin/udevd >/dev/null; then
@@ -112,7 +112,7 @@ if /bin/pidof -o %PPID /sbin/udevd >/dev/null; then
stat_done
fi
-run_hook udevsettled rc.sysinit
+run_hook sysinit_udevsettled
# bring up the loopback interface
if [ -d /sys/class/net/lo ]; then
@@ -288,7 +288,7 @@ stat_busy "Mounting Local Filesystems"
if [ -e /proc/mounts ]; then
/bin/grep -e "/proc " -e "/sys " -e "/dev " /proc/mounts >> /etc/mtab
fi
-run_hook premount rc.sysinit
+run_hook sysinit_premount
# now mount all the local filesystems
/bin/mount -a -t $NETFS -O no_netdev
stat_done
@@ -419,7 +419,7 @@ fi
/bin/dmesg >| /var/log/dmesg.log
-run_hook end rc.sysinit
+run_hook sysinit_end
# End of file
# vim: set ts=2 noet: