#!/bin/sh
#
# Starts wpa_supplicant and wpa_cli daemons for dealing with a wireless adapter
#

if [ -z "$1" ] || [ -z "$2" ]; then
	echo "Usage: $0 start|stop IFACE"
	exit 1
fi

# [start|stop]
ACTION="$1"
# network interface
INTERFACE="$(basename $2)"

WPASUP_DAEMON_NAME=wpa_supplicant
WPASUP_DAEMON=/sbin/$WPASUP_DAEMON_NAME
if [ ! -x $WPASUP_DAEMON ]; then
    echo "No $WPASUP_DAEMON_NAME executable: $WPASUP_DAEMON"
    exit 1
fi

WPACLI_DAEMON_NAME=wpa_cli
WPACLI_DAEMON=/sbin/$WPACLI_DAEMON_NAME
if [ ! -x $WPACLI_DAEMON ]; then
    echo "No $WPACLI_DAEMON_NAME executable: $WPACLI_DAEMON"
    exit 1
fi

. /lib/webif/config.sh

# load config
config_file=/etc/wpa_supplicant/wpa_supplicant.conf
if [ ! -f $config_file ]; then
	echo "No wpa_supplicant.conf, exiting"
	exit 0
fi

# wireless_network.conf
if [ ! -f $SBC_CONFIGDIR/wireless_network.conf ]; then
	echo "creating wireless_network.conf"
	create_wireless_network_config
fi
. $SBC_CONFIGDIR/wireless_network.conf

# wait for networking to be available, taken from net.agent (ifupdown)
wait_for_interface () {
    waitifc=$1

    while :; do
        ifcstate="$(cat /sys/class/net/${waitifc}/operstate 2>/dev/null || true)"
        if [ "$ifcstate" != down ]; then
			return 0
        fi
        sleep 1
    done
}

start() {

	DRIVER="$(basename $(realpath /sys/class/net/$INTERFACE/device/driver))"
	echo "Starting: $INTERFACE, Driver: $DRIVER"

	# r8712u requries wext driver
	if [ "$DRIVER" = "r8712u" ] ; then
		EXTRA_WPA_ARGS="-D wext";
	fi

 	echo -n "Starting wpa_supplicant: "
	$WPASUP_DAEMON -i$INTERFACE -c$config_file -P/var/run/wpa_supplicant_$INTERFACE.pid -B $EXTRA_WPA_ARGS
	if [ "$?" != "0" ] ; then
		echo "FAIL"
		return 1
	fi
	echo "OK"

	echo -n "Starting wpa_cli: "
	$WPACLI_DAEMON -i$INTERFACE -a/sbin/wpa_action -P/var/run/wpa_cli_$INTERFACE.pid -B
	if [ "$?" != "0" ] ; then
		echo "FAIL"
		return 1
	fi
	echo "OK"
}


stop() {
	ifdown $INTERFACE

	echo -n "Stopping wpa_cli: "
	start-stop-daemon -K -q -p /var/run/wpa_cli_$INTERFACE.pid
	if [ "$?" != "0" ] ; then
		echo "FAIL"
	else
		echo "OK"
	fi

	echo -n "Stopping wpa_supplicant: "
	start-stop-daemon -K -q -p /var/run/wpa_supplicant_$INTERFACE.pid
	if [ "$?" != "0" ] ; then
		echo "FAIL"
		return 1
	fi
	echo "OK"
}

case "$ACTION" in
	start)
		wait_for_interface lo
		start
		;;

	stop)
		stop
		;;

	*)
		echo "Unknown action: \"$ACTION\""
		exit 1
		;;
esac

exit 0
