#!/bin/sh

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

# Neutrino's exit codes
ERROR=-1
NORMAL=0
SHUTDOWN=1
REBOOT=2
RESTART=3

# if neutrino crashes, just restart it or reboot the box?
case "$(get_boxmodel)" in
	nevis|apollo|shiner|kronos|kronos_v2)
		REBOOT_ON_ERROR=true
	;;
	*)
		REBOOT_ON_ERROR=false
	;;
esac

do_cleanup() {
	# remove files created by neutrino
	rm -f /tmp/.timer
}

do_shutdown() {
	display_msg "N: SHUTDOWN"
	poweroff
}

do_reboot() {
	display_msg "N: REBOOT"
	reboot
}

do_restart() {
	display_msg "N: RESTART"
}

while true; do
	do_cleanup

	if [ -e /var/etc/.coredump ]; then
		# unlimit core file size
		ulimit -c unlimited
	fi

	neutrino; RET=$?
	LOGINFO "Neutrino exited with exit code $RET"

	if [ $RET -eq $NORMAL ]; then
		# do nothing
		break
	elif [ $RET -eq $SHUTDOWN ]; then
		do_shutdown
		break
	elif [ $RET -eq $REBOOT ]; then
		do_cleanup
		do_reboot
		break
	elif [ $RET -eq $RESTART ]; then
		do_restart
		continue
	fi

	display_msg "NEUTRINO: $RET"

	# report errors on external display
	if [ -e /tmp/.lcd-* -a -e /tmp/lcd ]; then
		echo "0"		> /tmp/lcd/mode_logo
		echo "Neutrino"		> /tmp/lcd/service
		echo "Error: $RET"	> /tmp/lcd/event
	fi

	if $REBOOT_ON_ERROR; then
		LOGINFO "Rebooting due to REBOOT_ON_ERROR=true and exit code $RET"
		do_reboot
		break
	fi

	LOGINFO "Restarting Neutrino after exit code $RET"
done