#!/bin/sh

IFCONFIG=/sbin/ifconfig
PROGRAM=udhcpd

if [ "$2" == ""] ; then
NUM="0" 
else
NUM=$2
fi

PROGRAM_CONF_FILE="udhcpd_vlan$NUM.conf"
PROGRAM_UO_FILE="udhcpd_vlan.conf.uo"
PROGRAM_PID_FILE="/var/run/udhcpd_vlan$NUM.pid"
LEASE_FILE="/var/run/udhcpd_vlan$NUM.leases"	
UVM=uvm
DIV=100
ETH=`rdcsman 0x009300c$NUM str`
enbase=0x00931000
macbase=0x00931200
ipbase=0x00931400
ipstart=`rdcsman 0x0093003$NUM bin`
ipend=`rdcsman 0x0093004$NUM bin`
maxlease=`rdcsman 0x009300b$NUM u32`

fixmapping()
{
	local i ip mac enable ipbase macbase enbase enptr macptr ipptr
	
	i=0
	while [ $i -lt 100 ]	
	do
		enptr=$(($enbase+$i+($NUM*$DIV)))
		enable=`rdcsman $enptr u8`
	
		if [ $enable = 1 ] ; then
			macptr=$(($macbase+$i+($NUM*$DIV)))
			ipptr=$(($ipbase+$i+($NUM*$DIV)))
			
			mac=`rdcsman $macptr macc`
			ip=`rdcsman $ipptr ipv4`		
			
			if [ $mac != 00:00:00:00:00:00 -a $ip != 0.0.0.0 ] ; then
				echo "static_lease $mac $ip" >> /etc/$PROGRAM_CONF_FILE
			fi		
		fi	
		i=$(($i+1))
	done
}

start()
{	
	local ipstart ipend maxlease numlease
	
	ipstart=0x${ipstart##*-}
	
	ipend=0x${ipend##*-}
	
	if [ $ipstart = 0x00 -a $ipend = 0x00 ] ; then
		wrcsman "0x009300b$NUM 101"
	else	
		numlease=$(($ipend-$ipstart))	
		numlease=$(($numlease+1))
	
	
		if [ $maxlease -ne $numlease ] ; then
			wrcsman "0x009300b$NUM $numlease"
		fi
	fi		
	
	$UVM /usr/uo/$PROGRAM_UO_FILE $NUM > /etc/$PROGRAM_CONF_FILE
	
	fixmapping
	
	$PROGRAM /etc/$PROGRAM_CONF_FILE	
}


stop()
{
	echo "udhcpd-stop"
	rm -f $LEASE_FILE
	if [ -f "$PROGRAM_PID_FILE" -a -r "$PROGRAM_PID_FILE" ] ; then 
			PROGRAM_PID=`cat $PROGRAM_PID_FILE`
			rm -f $PROGRAM_PID_FILE
			kill $PROGRAM_PID > /dev/null 2>&1 || exit 1
			exit 0
	fi  
	exit 1
}	

lease()
{
	local cnt
	if [ -f "$PROGRAM_PID_FILE" -a -r "$PROGRAM_PID_FILE" ] ; then 
		PROGRAM_PID=`cat $PROGRAM_PID_FILE`
		rm -f $LEASE_FILE
		kill -USR1 $PROGRAM_PID
		
		cnt=0
		while [ true ] ; do
			
			if [ $cnt -gt 30 ] ; then
				break
			fi
			
			if [ -f $LEASE_FILE -a -r $LEASE_FILE ] ; then
				dumpleases2 -f $LEASE_FILE
				break
			fi		
			cnt=$(($cnt+1))
			
		done	
		
	fi
	dhcp_list2 $NUM
}		 


# main ##########################################################

case "$1" in

	start)
		start;;
	
	stop)
		stop;;
		
	reload|restart) 
		$0 stop
		$0 start;;
			
	lease)
		lease;;
	
	*)
		exit 1 ;;
esac

exit 0		



			
