#!/bin/sh
#
# rc		This file is responsible for starting/stopping
#		services when the runlevel changes.
#
#		Optimization feature:
#		A startup script is _not_ run when the service was
#		running in the previous runlevel and it wasn't stopped
#		in the runlevel transition (most Debian services don't
#		have K?? links in rc{1,2,3,4,5} )
#
# Author:	Miquel van Smoorenburg <miquels@cistron.nl>
#		Bruce Perens <Bruce@Pixar.com>
#
# Version:	@(#)rc  2.78  07-Nov-1999  miquels@cistron.nl
#

. /etc/default/rcS
export VERBOSE

. /etc/init.d/functions
. /etc/init.d/globals

startup_progress() {
    step=$(($step + $step_change))
    if [ "$num_steps" != "0" ]; then
        progress=$((($step * $progress_size / $num_steps) + $first_step))
    else
        progress=$progress_size
    fi
    #echo "PROGRESS is $progress $runlevel $first_step + ($step of $num_steps) $step_change $progress_size"
    #if type psplash-write >/dev/null 2>&1; then
    #    TMPDIR=/mnt/.psplash psplash-write "PROGRESS $progress" || true
    #fi
    if [ $progress -gt 0 -a -e /proc/progress ]; then
        echo $(($progress / 2)) > /proc/progress
    elif [ $progress -gt 0 -a -e /proc/vfd ]; then
        echo Loading $(($progress / 2)) % > /proc/vfd
    elif [ $progress -gt 0 -a -e /usr/bin/displayvfd ]; then
        displayvfd -s 18 -t "Booting $progress"
    elif [ $progress -gt 0 -a -e /dev/mcu ]; then
        echo $(($progress / 2)) > /dev/mcu
    fi
}


#
# Start script or program.
#
startup() {
  # Handle verbosity
  [ "$VERBOSE" = very ] && echo "INIT: Running $@..."
  LOGINFO "running $@"

  case "$1" in
	*.sh)
		# Source shell script for speed.
		(
			trap - INT QUIT TSTP
			scriptname=$1
			shift
			. $scriptname
		)
		;;
	*)
		"$@"
		;;
  esac
  #startup_progress
}

  # Ignore CTRL-C only in this shell, so we can interrupt subprocesses.
  trap ":" INT QUIT TSTP

  # Set onlcr to avoid staircase effect.
  stty onlcr 0>&1

  # Limit stack size for startup scripts
  [ "$STACK_SIZE" == "" ] || ulimit -S -s $STACK_SIZE

  # Now find out what the current and what the previous runlevel are.

  runlevel=$RUNLEVEL
  # Get first argument. Set new runlevel to this argument.
  [ "$1" != "" ] && runlevel=$1
  if [ "$runlevel" = "" ]
  then
	echo "Usage: $0 <runlevel>" >&2
	exit 1
  fi
  previous=$PREVLEVEL
  [ "$previous" = "" ] && previous=N

  export runlevel previous

  # Is there an rc directory for this new runlevel?
  if [ -d /etc/rc$runlevel.d ]
  then
	# Find out where in the progress bar the initramfs got to.
	PROGRESS_STATE=0
	#if [ -f /dev/.initramfs/progress_state ]; then
	#    . /dev/.initramfs/progress_state
	#fi

	# Split the remaining portion of the progress bar into thirds
	progress_size=$(((100 - $PROGRESS_STATE) / 3))

	case "$runlevel" in
		0|6)
			# Count down from -100 to 0 and use the entire bar
			first_step=-100
			progress_size=100
			step_change=1
			;;
	        S)
			# Begin where the initramfs left off and use 2/3
			# of the remaining space
			first_step=$PROGRESS_STATE
			progress_size=$(($progress_size * 2))
			step_change=1
			;;
		*)
			# Begin where rcS left off and use the final 1/3 of
			# the space (by leaving progress_size unchanged)
			first_step=$(($progress_size * 2 + $PROGRESS_STATE))
			step_change=1
			;;
	esac

	num_steps=0
	for s in /etc/rc$runlevel.d/[SK]*; do
            case "${s##/etc/rc$runlevel.d/S??}" in
                gdm|xdm|kdm|reboot|halt)
                    break
                    ;;
            esac
            num_steps=$(($num_steps + 1))
        done
        step=0

	# First, run the KILL scripts.
	if [ $previous != N ]
	then
		for i in /etc/rc$runlevel.d/K[0-9][0-9]*
		do
			# Check if the script is there.
			[ ! -f $i ] && continue

			# Stop the service.
			startup $i stop
		done
	fi

	# Now run the START scripts for this runlevel.
	for i in /etc/rc$runlevel.d/S*
	do
		[ ! -f $i ] && continue

		if [ $previous != N ] && [ $previous != S ]
		then
			#
			# Find start script in previous runlevel and
			# stop script in this runlevel.
			#
			suffix=${i#/etc/rc$runlevel.d/S[0-9][0-9]}
			stop=/etc/rc$runlevel.d/K[0-9][0-9]$suffix
			previous_start=/etc/rc$previous.d/S[0-9][0-9]$suffix
			#
			# If there is a start script in the previous level
			# and _no_ stop script in this level, we don't
			# have to re-start the service.
			#
			[ -f $previous_start ] && [ ! -f $stop ] && continue
		fi
		case "$runlevel" in
			0|6)
				# Runlevels 0 and 6 are always stop runlevels
				startup $i stop
				;;
			*)
				startup $i start
				;;
		esac
	done
  fi