#!/bin/sh

CONF_DIR=/etc
MODULES_DIR=/usr/lib/awds

CONF_FILE=$CONF_DIR/awds.conf
[ -e $CONF_FILE ] && . $CONF_FILE


print_help()
{
echo "\
use: $0 [options]
where [options] is one or more of:
  -i <if>	set the interface (ath0, wlan0, etc.)
  -N		run in foreground
  -v		verbose debug output
  -p <prefix>	prepend <prefix> (e.g. 'strace', 'valgrind')"
}


PARAM_DEV=''
PREFIX=''
VERBOSE=''
while [ $# -gt 0 ]; do
  case "$1" in
    -i) [ "$2" = "" ] && print_help && exit -1
        PARAM_DEV=$2
        shift 2
        ;;
    -N) DAEMONIZE="no"
        shift
        ;;
    -v) VERBOSE="--verbose"
        shift
        ;;
    -p) [ "$2" = "" ] && print_help && exit -1
        PREFIX=$2
        shift 2
        ;;
    -h) print_help
        exit 0
        ;;
    *)  print_help
        exit -1
        ;;
  esac
done

grep -q tun /proc/modules || find /lib/modules/$(uname -r) -name tun.*o -exec insmod {} \;

# use this for early detection of wrong configured stack:
export LD_BIND_NOW=1
test -n "$LD_LIBRARY_PATH" && LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}$MODULES_DIR

# go to / to sanitize daemon and not block mounts
cd /

if [ "$NET_DEV" = auto ]
then
AUTODEV=$(grep -E -v "Inte|face" /proc/net/wireless | tr ":" " " | ( read a b; echo $a ) )
else
AUTODEV="$NET_DEV"
fi

# argv1 can override the setting
DEVICE=${PARAM_DEV:-$AUTODEV}

AESCCM=''
if [ x$USE_ENCRYPTION = xyes ]
then
AESCCM="aesccm.so -k $KEY_FILE"
fi

AWDS_SHELL=''
[ "$USE_AWDS_SHELL" = yes ] && AWDS_SHELL='shell.so'

AWDS_TOPO=''
[ "$USE_TOPO_EXPORT" = yes ] && AWDS_TOPO='topowatch.so'

XALF=''
WIRELESS_EC=''
[ "$USE_XALF" = yes ] && WIRELESS_EC='wireless_ec.so' && XALF='--xalf'



AWDS_DAEMON=''
PIDFILE=${PIDFILE:-/var/run/awds.pid}
[ "$DAEMONIZE" = yes ] && AWDS_DAEMON="daemon.so --pidfile $PIDFILE"



if [ "$DEV_CHANGE_WIRELESS_SETTINGS" = yes ]
then
    ifconfig $DEVICE down
    iwconfig $DEVICE mode ad-hoc channel $DEV_WIRELESS_CHANNEL essid $DEV_WIRELESS_ESSID
    ifconfig $DEVICE mtu 2000
    ifconfig $DEVICE up

    # madwifi bug workaround:
    # set uapsd option to zero, if available
    iwpriv $DEVICE 2>&1 | grep -q uapsd && iwpriv $DEVICE uapsd 0
fi

# Files in etc/awds.d/ or other scripts can utilize the AWDS_EXTENSIONS
# environment variable to also load other gea modules when starting awds.
if [ -d ${CONF_DIR}/awds.d ]
then
    FILES=$(find ${CONF_DIR}/awds.d/ -xtype f | sort )
    for i in $FILES; do
	source $i
    done
fi


name="$HOSTNAME"
[ -z "$name" -a -x /bin/hostname ] && name=$(/bin/hostname)
[ -z "$name" -a -f /proc/sys/kernel/hostname ] && name=$(cat /proc/sys/kernel/hostname)

# echo Starting AWDS on $DEVICE

exec $PREFIX gea3_start -i <<END
$AWDS_SHELL
$AWDS_DAEMON
$WIRELESS_EC
rawbasic.so --raw-device $DEVICE
awdsrouting.so --name $name $VERBOSE $XALF
etxmetric.so
pinger.so
$AESCCM
tapiface.so
$AWDS_TOPO
topolock.so
$AWDS_EXTENSIONS
END
