#!/bin/sh
#
# pdnsd

set +e   # Don't exit on error status

NAME="pdnsd"
DESC="proxy DNS server"
DAEMON="/usr/sbin/pdnsd"
PIDFILE="/var/run/pdnsd.pid"
CACHE="/var/cache/pdnsd/pdnsd.cache"

[ -x "$DAEMON" ] || exit 0

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

[ -r "/etc/default/$NAME" ] || exit 0
. "/etc/default/$NAME"

gen_cache () {
	set -e
	if [ -f "$CACHE" ]; then
		CACHE_SIZE=$(LANG=C ls -l "$CACHE" | awk '{ print $5; }')
		if expr $CACHE_SIZE '<' 4 > /dev/null; then
			echo -n " (regenerating cache..."
			dd if=/dev/zero of="$CACHE" bs=1 count=4 2> /dev/null
			chown pdnsd.proxy "$CACHE"
			echo -n "done)"
		fi
	else
		echo -n " (generating cache..."
		mkdir -p /var/cache/pdnsd
		dd if=/dev/zero of="$CACHE" bs=1 count=4 2> /dev/null
		chown -R pdnsd.proxy /var/cache/pdnsd
		echo -n "done)"
	fi	
	set +e
	return 0
}

start()
{
	# Return
	#   0 if daemon has been started
	#   1 if daemon was already running
	#   2 if daemon could not be started
	start-stop-daemon --start --quiet --pidfile "$PIDFILE" --exec "$DAEMON" --test > /dev/null || return 1
	start-stop-daemon --start --quiet --pidfile "$PIDFILE" --exec "$DAEMON" -- \
		--daemon -p "$PIDFILE" $START_OPTIONS \
		|| return 2
}

start_resolvconf()
{
	if [ -x /sbin/resolvconf ] ; then
		echo "nameserver 127.0.0.1" | /sbin/resolvconf -a "lo.$NAME"
	fi
	return 0
}

stop()
{
	# Return
	#   0 if daemon has been stopped
	#   1 if daemon was already stopped
	#   2 if daemon could not be stopped
	start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile "$PIDFILE" --name "$NAME"
	RETVAL="$?"
	[ "$RETVAL" = 2 ] && return 2
	# Wait for children to finish too
	start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec "$DAEMON" > /dev/null
	[ "$?" = 2 ] && return 2
	rm -f "$PIDFILE"
	return "$RETVAL"
}

stop_resolvconf()
{
	if [ -x /sbin/resolvconf ] ; then
		/sbin/resolvconf -d "lo.$NAME"
	fi
	return 0
}

case "$1" in
start)
	echo -n "Starting $DESC: $NAME"
	gen_cache
	start
	case "$?" in
	0)
		echo "."
		start_resolvconf
		exit 0
		;;
	1)
		echo " (already running)."
		exit 0
		;;
	*)
		echo " (failed)."
		exit 1
		;;
	esac
	;;
stop)
	stop_resolvconf
	echo -n "Stopping $DESC: $NAME"
	stop
	case "$?" in
		0) echo "." ; exit 0 ;;
		1) echo " (not running)." ; exit 0 ;;
		*) echo " (failed)." ; exit 1 ;;
	esac
	;;
restart|force-reload)
	stop_resolvconf
	echo -n "Restarting $DESC: $NAME"
	stop
	case "$?" in
	0|1)
		start
		case "$?" in
		0)
			echo "."
			start_resolvconf
			exit 0
			;;
		1)
			echo " (failed -- old process is still running)."
			exit 1
			;;
		*)
			echo " (failed to start)."
			exit 1
			;;
		esac
		;;
	*)
		echo " (failed to stop)."
		exit 1
		;;
	esac
	;;
*)
	echo "Usage: /etc/init.d/$NAME {start|stop|restart|force-reload}" >&2
	exit 3
	;;
esac

