#!/bin/sh
#
# Copyright (C)2006,2007 USAGI/WIDE Project. All rights reserved.
#
### BEGIN INIT INFO
# Provides:          mip6d
# Required-Start:    $syslog
# Required-Stop:     $syslog
# Should-Start:      $local_fs
# Should-Stop:       $local_fs
# Default-Start:     3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start/Stop mip6 daemon (MIPL)
# Description:       (empty)
### END INIT INFO

MIP6D_BIN=/usr/sbin/mip6d
MIP6D_CONF=
MIP6D_PID=/var/run/mip6d.pid
MIP6D_DEBUG_LOG=/var/log/mip6d.log

conf=/etc/default/mip6d
if [ -f $conf ]; then
    . $conf
fi

mip6d_delay=1

NAME="mip6d"
DESC="MIPL daemon"

. /lib/lsb/init-functions

test -x $MIP6D_BIN || exit 5

_usage()
{
    echo "Usage: $0 start|stop|restart|reload"
}

_start()
{
    if [ -f $MIP6D_PID ]; then
	log_failure_msg "Already running"
	return 0
    fi

    opts=""
    if [ x"$MIP6D_CONF" != x"" ]; then
	opts="${opts} -c ${MIP6D_CONF}"
    fi
    if [ x"$MIP6D_DEBUG_LOG" != x"" ]; then
	opts="${opts} -l ${MIP6D_DEBUG_LOG}"
    fi

#    start_daemon -p $MIP6D_PID $MIP6D_BIN $opts
    start-stop-daemon --start --pidfile $MIP6D_PID --make-pidfile \
	--exec $MIP6D_BIN -- $opts

    ret=$?
    if [ $ret -eq 0 ]; then
	#
	# Sleep for delay to confirm starting MIPL daemon
	#
	sleep $mip6d_delay
    fi

    return $ret
}

_stop()
{
#    killproc -p $MIP6D_PID $MIP6D_BIN
    start-stop-daemon --stop --exec $MIP6D_BIN

    rm -f $MIP6D_PID

    if [ x"$MIP6D_FORCECLEAN" = x"yes" ]; then
	#
	# clean-up XFRM (BCE/BUL)
	#
	ip xfrm policy flush ptype sub
	ip xfrm state flush proto hao
	ip xfrm state flush proto route2

	if [ x"$MIP6D_HAMN" = x"yes" ]; then
	    #
	    # clean-up tunnel device
	    #
	    tnl_max=256 # XXX
	    i=1
	    while [ $i -lt $tnl_max ] ; do
		tdev="ip6tnl${i}"
		ip -6 tunnel del $tdev >& /dev/null
		i=$((i + 1))
	    done
	fi

	#
	# clean-up neighbor cache
	#
	devices=`ip link | grep '^[0-9]' | awk '{print $2}' | sed -e 's/:$//'`
	for dev in $devices; do
	    ip neigh flush dev $dev >& /dev/null
	done
    fi

    return 0
}

_reload()
{
#    killproc -p $MIP6D_PID $MIP6D_BIN SIGHUP
    start-stop-daemon --stop --exec $MIP6D_BIN --signal HUP
    return $?
}

#
# main
#
status=$1

case $status in
    start)
	log_begin_msg "Starting Mobile IPv6" $NAME
	_start
	RETVAL=$?
	;;
    dry-start)
	log_begin_msg "Dry-starting Mobile IPv6 (not started)" $NAME
	RETVAL=0
	;;
    stop)
	log_begin_msg "Stopping Mobile IPv6" $NAME
	_stop
	RETVAL=$?
        ;;
    reload)
	log_begin_msg "Reloading Mobile IPv6" $NAME
	_reload
	RETVAL=$?
	;;
    restart)
	log_begin_msg "Restarting Mobile IPv6" $NAME
	_stop
	sleep $mip6d_delay
	_start
	RETVAL=$?
	;;
    *)
	_usage
	exit 2
	;;
esac

log_end_msg $RETVAL

exit $RETVAL
