#! /bin/bash
#
# rc            This file is responsible for starting/stopping
#               services when the runlevel changes.
#
# Original Author:       
#               Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
#

set -m

# check a file to be a correct runlevel script
check_runlevel ()
{
	# Check if the file exists at all.
	[ -x "$1" ] || return 1
	is_ignored_file "$1" && return 1
	return 0
}

# Now find out what the current and what the previous runlevel are.
argv1="$1"
set `/sbin/runlevel`
runlevel=$2
previous=$1
export runlevel previous

# Get first argument. Set new runlevel to this argument.
if [ "$argv1" != "" ] ; then
 newrunlevel="$argv1"
else
 newrunlevel="$runlevel"
fi

if [ "$previous" = "N" ];then
    if [ -e /var/run/failsafe ];then
        rm -f /var/run/failsafe
	if [ -x /sbin/askrunlevel ];then
		/sbin/askrunlevel --interactive && ASKRUNLEVEL=no
	else
	    init 1 #jump to init 1 if not aksrunlevel.
       fi
    fi
fi

. /etc/init.d/functions

export CONSOLETYPE
do_confirm="no"
if [ -f /var/run/confirm ]; then
	do_confirm="yes"
fi
UPSTART=
[ -x /sbin/initctl ] && UPSTART=yes
# See if we want to be in user confirmation mode
if [ "$previous" = "N" ]; then
	if [ "$do_confirm" = "yes" ]; then
		gprintf "Entering interactive startup\n"
	else
		gprintf "Entering non-interactive startup\n"
	fi
elif [[ "$newrunlevel" = "0" || "$newrunlevel" = "6" ]]; then
    chvt 1
    exec &> /dev/console
    # Make sure terminal is switched to correct charset.
    # It has to be after chvt of course. For startup case it really
    # does not matter as tty is not changed between rc.sysinit and rc
    # DO NOT REMOVE THIS. Please :)
    /sbin/setsysfont
fi

# Tell linuxconf what runlevel we are in
[ -d /var/run ] && echo "/etc/rc$runlevel.d" > /var/run/runlevel.dir

# Get first argument. Set new runlevel to this argument.
[ -n "$argv1" ] && runlevel="$argv1"

# Is there an rc directory for this new runlevel?
[ -d /etc/rc$runlevel.d ] || exit 0

# Set language, vc settings once to avoid doing it for every init script
# through functions
if [ -f /etc/sysconfig/i18n -a -z "${NOLOCALE:-}" ] ; then
  . /etc/profile.d/10lang.sh
  export LANGSH_SOURCED=1
fi

# has to be called after setfont (run by unicode_start in /etc/profile.d/10lang.sh)
# because it resets text messages on bootsplash
initsplash
[ "$previous" = "N" ] && rc_splash start

nopinit=`grep nopinit /proc/cmdline`

rc_mode=K
export rc_mode

# First, run the KILL scripts.
if [ -z "$nopinit" ]; then
    /sbin/prcsys K /etc/rc$runlevel.d/
    progress=$?
else
    for i in /etc/rc$runlevel.d/K* ; do

	# Check if the subsystem is already up.
	subsys=${i#/etc/rc$runlevel.d/K??}
	[ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ] || continue
	check_runlevel "$i" || continue

	update_boot_stage "$subsys"
	# Bring the subsystem down.
	[ -n "$UPSTART" ] && initctl emit --quiet "stopping $subsys"
	action "Stopping %s: " $subsys $i stop
	[ -n "$UPSTART" ] && initctl emit --quiet "stopped $subsys"
    done
fi

rc_mode=S

if [ -z "$nopinit" ] && [ ! -f /var/run/confirm -a "$runlevel" != "0" -a "$runlevel" != "1" -a "$runlevel" != "6" ]; then
    /sbin/prcsys S /etc/rc$runlevel.d/
else
    # Now run the START scripts.
    for i in /etc/rc$runlevel.d/S* ; do

	# Check if the subsystem is already up.
	subsys=${i#/etc/rc$runlevel.d/S??}
	[ -f /var/lock/subsys/$subsys ] && continue
	[ -f /var/lock/subsys/$subsys.init ] && continue
	check_runlevel "$i" || continue
		    
	# If we're in confirmation mode, get user confirmation
	if [ "$do_confirm" = "yes" ]; then
		confirm $subsys
		rc=$?
		if [ "$rc" = "1" ]; then
			continue
		elif [ "$rc" = "2" ]; then
			do_confirm="no"
		fi
	fi

	update_boot_stage "$subsys"
	# Bring the subsystem up.
	[ -n "$UPSTART" ] && initctl emit --quiet "starting $subsys"
	if [ "$subsys" = "halt" -o "$subsys" = "reboot" ]; then
		export LC_ALL=C
		exec $i start
	fi
	action "Starting %s: " $subsys $i start
	[ -n "$UPSTART" ] && initctl emit --quiet "started $subsys"

   done
fi

if [[ "$newrunlevel" != "0" && "$newrunlevel" != "6" ]]; then
    rc_splash stop
fi
[ "$do_confirm" = "yes" ] && rm -f /var/run/confirm
if [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --ping ; then
	/usr/bin/rhgb-client --quit
fi
