#!/bin/bash
#
# rc            This file is responsible for starting/stopping
#               services when the runlevel changes. It is also
#               responsible for the very first setup of basic
#               things, such as setting the hostname.
#
# 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
RUNLEVEL=$2
PREVLEVEL=$1
newrunlevel=$2
progress=0
export runlevel previous RUNLEVEL PREVLEVEL newrunlevel progress

# Source function library.
. /etc/init.d/functions

# check if we use upstart
UPSTART=
[ -x /sbin/initctl ] && UPSTART=yes

# See if we want to be in user confirmation mode
if [ "$previous" = "N" ]; then
    if grep -i confirm /proc/cmdline >/dev/null || [ -f /var/run/confirm ] ; then
      rm -f /var/run/confirm
      CONFIRM=yes
      echo $"Entering interactive startup"
    else
      CONFIRM=
      echo $"Entering non-interactive startup"
    fi
fi

export CONFIRM

# 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

# First, run the KILL scripts.
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 JOB=$subsys
	if egrep -q "(killproc |action )" $i ; then
		$i stop
	else
		action $"Stopping $subsys: " $i stop
	fi
	[ -n "$UPSTART" ] && initctl emit --quiet stopped JOB=$subsys
done

# 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 [ -n "$CONFIRM" ]; then
	    confirm $subsys
	    rc=$?
	    if [ "$rc" = "1" ]; then
	    	continue
	    elif [ "$rc" = "2" ]; then
	    	CONFIRM=
	    fi
	fi

	update_boot_stage "$subsys"
	# Bring the subsystem up.
	[ -n "$UPSTART" ] && initctl emit --quiet starting JOB=$subsys
	if egrep -q "(daemon |action )" $i ; then
		if [ "$subsys" = "halt" -o "$subsys" = "reboot" ]; then
			export LC_ALL=C
			exec $i start
		else
		    $i start
		fi
	else
		if [ "$subsys" = "halt" -o "$subsys" = "reboot" -o "$subsys" = "single" -o "$subsys" = "local" ]; then
		    if [ "$subsys" = "halt" -o "$subsys" = "reboot" ]; then
			export LC_ALL=C
			exec $i start
		    fi
		    $i start
		else
		    action $"Starting $subsys: " $i start
		fi
	fi
	[ -n "$UPSTART" ] && initctl emit --quiet started JOB=$subsys
done

exit 0
    
