#!/sbin/runscript
# Copyright 1999-2011 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/net-misc/dhcp/files/dhcpd.init3,v 1.1 2011/03/05 23:59:20 vapier Exp $

opts="configtest"

DHCPD_CONF=${DHCPD_CONF:-/etc/dhcp/${SVCNAME}.conf}

depend() {
	need net
	use logger dns
}

get_var() {
	sed -n 's/^[[:blank:]]\?'"$1"' "*\([^#";]\+\).*/\1/p' \
		"${DHCPD_CHROOT}/${DHCPD_CONF}"
}

checkconfig() {
	dhcpd ${DHCPD_OPTS} ${DHCPD_CHROOT:+-chroot} ${DHCPD_CHROOT} -t 1>/dev/null 2>&1
	local ret=$?
	if [ $ret -ne 0 ] ; then
		eerror "${SVCNAME} has detected a syntax error in your configuration files:"
		dhcpd ${DHCPD_OPTS} ${DHCPD_CHROOT:+-chroot} ${DHCPD_CHROOT} -t
	fi

	return $ret
}

configtest() {
	ebegin "Checking ${SVCNAME} configuration"
	checkconfig
	eend $?
}

start() {
	# Work out our cffile if it's in our DHCPD_OPTS
	case " ${DHCPD_OPTS} " in
		*" -cf "*)
			DHCPD_CONF=" ${DHCPD_OPTS} "
			DHCPD_CONF="${DHCPD_CONF##* -cf }"
			DHCPD_CONF="${DHCPD_CONF%% *}"
			;;
		*)	DHCPD_OPTS="${DHCPD_OPTS} -cf ${DHCPD_CONF}"
			;;
	esac

	if [ ! -f "${DHCPD_CHROOT}/${DHCPD_CONF}" ] ; then
		eerror "${DHCPD_CHROOT}/${DHCPD_CONF} does not exist"
		return 1
	fi

	checkconfig || return 1

	checkpath -d -o dhcp:dhcp /var/run/dhcp /var/lib/dhcp

	local leasefile="$(get_var lease-file-name)"
	leasefile="${leasefile:-/var/lib/dhcp/${SVCNAME}.leases}"
	if [ ! -f "${DHCPD_CHROOT}${leasefile}" ] ; then
		ebegin "Creating ${leasefile}"
		touch "${DHCPD_CHROOT}${leasefile}"
		chown dhcp:dhcp "${DHCPD_CHROOT}${leasefile}"
		eend $? || return 1
	fi

	# Setup LD_PRELOAD so name resolution works in our chroot.
	if [ -n "${DHCPD_CHROOT}" ] ; then
		LD_PRELOAD="${LD_PRELOAD} /usr/lib/libresolv.so"
		export LD_PRELOAD="${LD_PRELOAD} /usr/lib/libnss_dns.so"
	fi

	local pidfile="$(get_var pid-file-name)"
	pidfile="${pidfile:-/var/run/dhcp/${SVCNAME}.pid}"

	ebegin "Starting ${DHCPD_CHROOT:+chrooted }${SVCNAME}"
	start-stop-daemon --start --exec /usr/sbin/dhcpd \
		--pidfile "${DHCPD_CHROOT}/${pidfile}" \
		-- ${DHCPD_OPTS} -q -pf "${pidfile}" -lf "${leasefile}" \
		-user dhcp -group dhcp \
		${DHCPD_CHROOT:+-chroot} ${DHCPD_CHROOT} ${DHCPD_IFACE}
	eend $? \
		&& save_options chroot "${DHCPD_CHROOT}" \
		&& save_options pidfile "${pidfile}"
}

stop() {
	local chroot="$(get_options chroot)"
	
	ebegin "Stopping ${chroot:+chrooted }${SVCNAME}"
	start-stop-daemon --stop --exec /usr/sbin/dhcpd \
		--pidfile "${chroot}/$(get_options pidfile)"
	eend $?
}
