#!/bin/bash

# Functions
rc.rescue() { exec "${cfg_rc_rescue_shell:-"$SHELL"}"; }

rc.motd() {
	[[ -f "/etc/rc.motd" ]] && {
		while read; do
			printf "$REPLY"
		done < "/etc/rc.motd"
	}

	return 0
}

rc.mount() {
	local fs
	local fs_type
	local mountpoint
	local mount_options
	
	fs="$1"
	fs_type="$2"
	mountpoint="$3"
	mount_options="${4:-defaults}"

	mount "$1" -n -t "$2" -o "$mount_options" "$3"
}

rc.mount_misc() {
	mountpoint -q /proc || { rc.mount proc proc /proc; }
	mountpoint -q /dev || { rc.mount dev devtmpfs /dev; }
}

rc.parse_cmdline() {
	[[ -f "/proc/cmdline" ]] && {
		boot_cmdline=( $(</proc/cmdline) )
	}

	for i in "${boot_cmdline[@]}"; do
		case "$i" in
			init.single) rc.rescue;;
		esac
	done
}

rc.services_start() {
	local service_name start_mode

	for i in "${cfg_services[@]}"; do
		unset service_name

		[[ "$i" =~ ^@ ]] && {
			service_name="${i##*@}"
			start_mode='bg'
		}

		[[ "$i" =~ ^% ]] && {
			service_name="${i##*%}"
			start_mode='watch'
		}

		service_name=${service_name:-$i}
		start_mode="${start_mode:-start}"
		
		case "$start_mode" in
			bg) service "$service_name" start &;;
			start) service "$service_name" start;;
			*) echo "Mode $start_mode not supported";;
		esac
	done
}

rc.services_stop() {
	echo "Stopping services..."
	local service_name

	for i in "${cfg_services[@]}"; do
		service_name="${i##*@}"; service_name="${service_name##*%}"
		service "$service_name" stop &>/dev/null &
	done
	wait
}

rc.stop_everything() {
	echo "Politely asking all processes to shut down..."
	killall5 -15; sleep 3

	echo "Killing the remaning ones..."
	killall5 -9
}

rc.unmount_everything() {
	echo "Unmounting filesystems..."
	umount -a
}

rc.remount_root() {
	echo "Remounting / read-only..."
	mount / -o remount,ro
}

rc.boot() {
	rc.mount_misc
	rc.hostname
	rc.modules
	rc.services_start
	wait
	rc.motd
}

rc.halt() {
	case "$action" in
		poweroff|shutdown) echo 'o' > /proc/sysrq-trigger;;
		halt) :;;
		reboot|*) echo 'b' > /proc/sysrq-trigger;;
	esac
}

rc.shutdown() {
	rc.services_stop
	rc.stop_everything
	rc.unmount_everything
	rc.remount_root

	echo "Halt complete."
	
	rc.halt
}

rc.hostname() {
	[[ "$cfg_hostname" ]] && { hostname "$cfg_hostname"; }
}

rc.modules() {
	for i in "${cfg_modules[@]}"; do
		modprobe "$i"
	done
}

rc.main() {
	source "/etc/rc.conf"

	action="${1:-boot}"

	case "$action" in
		boot)
			echo "Welcome to `uname -rs`"
			rc.boot
		;;

		poweroff|reboot|shutdown)
			rc.shutdown
			rc.halt
		;;
	esac
}

# Main part
rc.main "$@"