diff options
Diffstat (limited to 'init.d/halt.sh')
-rwxr-xr-x | init.d/halt.sh | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/init.d/halt.sh b/init.d/halt.sh new file mode 100755 index 00000000..eabc8980 --- /dev/null +++ b/init.d/halt.sh @@ -0,0 +1,94 @@ +#!/bin/sh +# Copyright 1999-2007 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +. /etc/init.d/functions.sh +. "${RC_LIBDIR}"/sh/rc-functions.sh + +# Support LiveCD foo +if [ -r /sbin/livecd-functions.sh ] ; then + . /sbin/livecd-functions.sh + livecd_read_commandline +fi + +stop_addon devfs +stop_addon udev + +# Flush all pending disk writes now +sync ; sync + +# If we are in a VPS, we don't need anything below here, because +# 1) we don't need (and by default can't) umount anything (VServer) or +# 2) the host utils take care of all umounting stuff (OpenVZ) +if [ "${RC_SYS}" = "VPS" ] ; then + if [ -e /etc/init.d/"$1".sh ] ; then + . /etc/init.d/"$1".sh + else + exit 0 + fi +fi + +# If $svcdir is still mounted, preserve it if we can +if mountinfo "${RC_SVCDIR}" >/dev/null && [ -w "${RC_LIBDIR}" ] ; then + f_opts="-m -c" + [ "${RC_UNAME}" = "Linux" ] && f_opts="-c" + if [ -n "$(fuser ${f_opts} "${svcdir}" 2>/dev/null)" ] ; then + fuser -k ${f_opts} "${svcdir}" 1>/dev/null 2>/dev/null + sleep 2 + fi + cp -p "${RC_SVCDIR}"/deptree "${RC_SVCDIR}"/softlevel \ + "${RC_SVCDIR}"/nettree "${RC_LIBDIR}" 2>/dev/null + umount "${RC_SVCDIR}" + rm -rf "${RC_SVCDIR}"/* + # Pipe errors to /dev/null as we may have future timestamps + cp -p "${RC_LIBDIR}"/deptree "${RC_LIBDIR}"/softlevel \ + "${RC_LIBDIR}"/nettree "${RC_SVCDIR}" 2>/dev/null + rm -f "${RC_LIBDIR}"/deptree "${RC_LIBDIR}"/softlevel \ + "${RC_LIBDIR}"/nettree + # Release the memory disk if we used it + case "${mnt}" in + "/dev/md"[0-9]*) mdconfig -d -u "${mnt#/dev/md*}" ;; + esac +fi + +unmounted=0 +# Remount the remaining filesystems read-only +if [ "${RC_UNAME}" != "FreeBSD" ] ; then + ebegin "Remounting remaining filesystems read-only" + # We need the do_unmount function + . "${RC_LIBDIR}"/sh/rc-mount.sh + eindent + do_unmount "mount -n -o remount,ro" "^(/dev|/dev/pts|/dev/shm|/proc|/proc/.*|/sys)$" + eoutdent + eend $? + unmounted=$? +fi + +# This UPS code should be moved to out of here and to an addon +if [ -f /etc/killpower ] ; then + UPS_CTL=/sbin/upsdrvctl + UPS_POWERDOWN="${UPS_CTL} shutdown" +elif [ -f /etc/apcupsd/powerfail ] ; then + UPS_CTL=/etc/apcupsd/apccontrol + UPS_POWERDOWN="${UPS_CTL} killpower" +fi +if [ -x "${UPS_CTL}" ] ; then + ewarn "Signalling ups driver(s) to kill the load!" + ${UPS_POWERDOWN} + ewarn "Halt system and wait for the UPS to kill our power" + halt -id + sleep 60 +fi + +if [ ${unmounted} -ne 0 ] ; then + [ -x /sbin/sulogin ] && sulogin -t 10 /dev/console + exit 1 +fi + +# Load the final script - not needed on BSD so they should not exist +[ -e /etc/init.d/"$1".sh ] && . /etc/init.d/"$1".sh + +# Always exit 0 here +exit 0 + +# vim: set ts=4 : |