#!/bin/bash
#
# This script implements support for the NETWORKS array in /etc/conf.d/netcfg.

. /usr/lib/network/globals
. /etc/conf.d/netcfg
STATE_FILE="$STATE_DIR/netcfg-daemon"
LAST_STATE="/var/lib/netcfg/netcfg.state"

case "$1" in
	start)
		(( $(id -u) )) && exit_stderr "This script should be run as root."
		[[ -e $STATE_FILE ]] && exit_err "netcfg-daemon is already started"
		[[ ${NETWORKS+x} != x ]] && exit_err "NETWORKS is not set in /etc/conf.d/netcfg"

		if [[ ${#NETWORKS[@]} -eq 1 ]]; then
			case $NETWORKS in
				last)
					[[ -e $LAST_STATE ]] || exit_err "No recorded netcfg state to restore"

					# The order in LAST_STATE is meaningless so we can just as
					# well start the profiles in the background.
					while read profile; do
						if /usr/bin/netcfg up "$profile"; then
							echo "$profile" >> "$STATE_FILE"
						fi &
					done < "$LAST_STATE"
					wait
					exit $? ;;
				menu)
					/usr/bin/netcfg-menu ${NETWORKS_MENU_TIMEOUT-5} && \
						mv "$STATE_DIR/menu" "$STATE_FILE"
					exit $? ;;
			esac
		fi

		for profile in "${NETWORKS[@]}"; do
			if [[ "$profile" = "${profile#@}" ]]; then
				if /usr/bin/netcfg check-iface "$profile"; then
					echo "$profile" >> "$STATE_FILE"
				fi
			else
				# It is up to the user to make sure no backgrounded profile
				# uses an interface that is used by another active profile.
				if /usr/bin/netcfg up "${profile#@}"; then
					echo "$profile" >> "$STATE_FILE"
				fi >/dev/null &
				PROFILE_BKGD=1
			fi
		done
		# Generate a return value.
		[[ -f $STATE_FILE || -n $PROFILE_BKGD ]]
		;;
	stop)
		(( $(id -u) )) && exit_stderr "This script should be run as root."

		if [[ ${#NETWORKS[@]} -eq 1 && $NETWORKS = last ]]; then
			mkdir -p "$(dirname "$LAST_STATE")"
			/usr/bin/netcfg current > "$LAST_STATE"
			/usr/bin/netcfg all-down
			exit $?
		fi

		[[ ! -e $STATE_FILE ]] && exit_err "netcfg-daemon was not started"
		# Stop the profiles in the reverse order they were started.
		tac "$STATE_FILE" | (
			while read profile; do
				if [[ -e "$STATE_DIR/profiles/${profile#@}" ]]; then
					if [[ "$profile" = "${profile#@}" ]]; then
						/usr/bin/netcfg down "$profile" || exit $?
					else
						/usr/bin/netcfg down "${profile#@}" &
					fi
				fi
			done
			rm "$STATE_FILE"
			# Generate a return value and make sure we are good to restart.
			wait
		)
		;;
	restart)
		"$0" stop
		sleep 1
		"$0" start
		;;
	status)
		if [[ -e $STATE_FILE ]]; then
			report_notice "profiles started by netcfg-daemon:"
			sed 's/^@//' "$STATE_FILE"
		else
			report_notice "netcfg-daemon was not started"
		fi
		;;
	*)
		echo "Usage: $0 {start|stop|restart|status}"
esac

