#!/bin/sh

# Copyright (C) 2006-2009 Debian hostapd maintainers 
# 	Faidon Liambotis <paravoid@debian.org>
#	Kel Modderman <kel@otaku42.de>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# On Debian GNU/Linux systems, the text of the GPL license,
# version 2, can be found in /usr/share/common-licenses/GPL-2.

# quit if we're called for lo
if [ "$IFACE" = lo ]; then
	exit 0
fi

if [ -n "$IF_HOSTAPD" ]; then
	HOSTAPD_CONF="$IF_HOSTAPD"
else
	exit 0
fi

HOSTAPD_BIN="/usr/sbin/hostapd"
HOSTAPD_PNAME="hostapd"
HOSTAPD_PIDFILE="/var/run/hostapd.$IFACE.pid"

HOSTAPD_OMIT_PIDFILE=
if [ -d /lib/init/rw/sendsigs.omit.d/ ]; then
	HOSTAPD_OMIT_PIDFILE="/lib/init/rw/sendsigs.omit.d/hostapd.$IFACE.pid"
elif [ -d /var/run/sendsigs.omit.d/ ]; then
	HOSTAPD_OMIT_PIDFILE="/var/run/sendsigs.omit.d/hostapd.$IFACE.pid"
fi

if [ ! -x "$HOSTAPD_BIN" ]; then
	exit 0
fi

if [ "$VERBOSITY" = "1" ]; then
	TO_NULL="/dev/stdout"
else
	TO_NULL="/dev/null"
fi

hostapd_msg () {
	case "$1" in
		verbose)
			shift
			echo "$HOSTAPD_PNAME: $@" > "$TO_NULL"
			;;
		stderr)
			shift
			echo "$HOSTAPD_PNAME: $@" > /dev/stderr
			;;
		*)
			;;
	esac
}

test_hostapd_pidfile () {
	if [ -n "$1" ] && [ -f "$2" ]; then
		if start-stop-daemon --stop --quiet --signal 0 \
			--exec "$1" --pidfile "$2"; then
			return 0
		else
			rm -f "$2"
			return 1
		fi
	else
		return 1
	fi
}

init_hostapd () {
	HOSTAPD_OPTIONS="-B -P $HOSTAPD_PIDFILE $HOSTAPD_CONF"
	HOSTAPD_MESSAGE="$HOSTAPD_BIN $HOSTAPD_OPTIONS"
	
	test_hostapd_pidfile "$HOSTAPD_BIN" "$HOSTAPD_PIDFILE" && return 0

	hostapd_msg verbose "$HOSTAPD_MESSAGE"
	start-stop-daemon --start --oknodo --quiet --exec "$HOSTAPD_BIN" \
		--pidfile "$HOSTAPD_PIDFILE" -- $HOSTAPD_OPTIONS > "$TO_NULL"

	if [ "$?" -eq 0 ]; then
		[ "$HOSTAPD_OMIT_PIDFILE" ] && \
			cat "$HOSTAPD_PIDFILE" > "$HOSTAPD_OMIT_PIDFILE"
		return 0
	fi

	return 1
}

kill_hostapd () {
	HOSTAPD_MESSAGE="stopping $HOSTAPD_PNAME via pidfile: $HOSTAPD_PIDFILE"

	test_hostapd_pidfile "$HOSTAPD_BIN" "$HOSTAPD_PIDFILE" || return 0
	
	hostapd_msg verbose "$HOSTAPD_MESSAGE"
	start-stop-daemon --stop --oknodo --quiet --exec "$HOSTAPD_BIN" \
		--pidfile "$HOSTAPD_PIDFILE" > "$TO_NULL"
	
	[ "$HOSTAPD_OMIT_PIDFILE" ] && rm -f "$HOSTAPD_OMIT_PIDFILE"
}

case "$MODE" in 
	start)
		case "$PHASE" in
			pre-up)
				init_hostapd || exit 1
				;;
			*)
				hostapd_msg stderr "unknown phase: \"$PHASE\""
				exit 1
				;;
		esac
		;;
	stop)
		case "$PHASE" in
			post-down)
				kill_hostapd
				;;
			*)
				hostapd_msg stderr "unknown phase: \"$PHASE\""
				exit 1
				;;
		esac
		;;
	*)
		hostapd_msg stderr "unknown mode: \"$MODE\""
		exit 1
		;;
esac

exit 0
