#!/bin/sh
#
# pdnsd
#
# History
# May 2004 - Written by Thomas Hood

set +e   # Don't exit on error status

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/pdnsd
NAME=pdnsd
DESC="proxy DNS server"

CACHE=/var/cache/pdnsd/pdnsd.cache

[ -x $DAEMON ] || exit 0

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
}

[ -r /etc/default/pdnsd ] || exit 0
. /etc/default/pdnsd

start()
{
	# Return
	#   0 if daemon has been started
	#   1 if daemon was already running
	#   other if failure occurred
	start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON -- --daemon -p /var/run/$NAME.pid $START_OPTIONS
}

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

stop()
{
	# Return
	#   0 if daemon has been stopped
	#   1 if daemon was already stopped
	#   2 if daemon could not be stopped
	#   other if a failure occurred
	start-stop-daemon --stop --retry=TERM/30/KILL/5 --quiet --pidfile /var/run/$NAME.pid --name pdnsd
	RETVAL="$?"
	[ "$RETVAL" = 2 ] && return 2
	# Wait for children to finish too
	start-stop-daemon --stop --oknodo --retry=0/30/KILL/5 --quiet --exec $DAEMON
	[ "$?" = 2 ] && return 2
	rm -f /var/run/$NAME.pid   # pdnsd doesn't delete its own pidfile
	return $RETVAL
}

stop_resolvconf()
{
	if [ -x /sbin/resolvconf ] ; then
		/sbin/resolvconf -d lo
	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)
	echo -n "Stopping $DESC: $NAME"
	stop_resolvconf
	stop
	case "$?" in
		0) echo "." ; exit 0 ;;
		1) echo " (not running)." ; exit 0 ;;
		*) echo " (failed)." ; exit 1 ;;
	esac
	;;
  restart|force-reload)
	echo -n "Restarting $DESC: $NAME"
	stop_resolvconf
	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
	;;
  *)
	N=/etc/init.d/$NAME
	echo "Usage: $N {start|stop|restart|force-reload}" >&2
	exit 3
	;;
esac

exit 0
