#!/bin/sh

[ -z "$1" ] && echo "Error: should be called from udhcpc" && exit 1

RESOLV_CONF="/etc/resolv.conf"
[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"
[ -n "$subnet" ] && NETMASK="netmask $subnet"

SERVICES_FILE="/etc/udhcpc_services"
UDHCPC_CONF="/tmp/udhcpc-"$interface"-conf"
UDHCPC_FALLBACK_IP="192.168.1.20"

udhcpc_write_config()
{
	# store settings to UDHCPC_CONF
	rm -f $UDHCPC_CONF
	(echo u_interface=\"$interface\"
	 echo u_broadcast=\"$broadcast\"
	 echo u_subnet=\"$subnet\"
	 echo u_ip=\"$ip\"
	 echo u_router=\"$router\"
	 echo u_domain=\"$domain\"
	 echo u_dns=\"$dns\"
	 echo u_leasetime=\"$lease\"
	 echo u_timestamp=\"`date +%s`\" ) > $UDHCPC_CONF
}

udhcpc_compare_config()
{
	if [ ! -f $UDHCPC_CONF ]; then 
		return 1;
	fi

	. $UDHCPC_CONF

	if [ ".$u_interface" != ".$interface" ]; then return 1; fi
	if [ ".$u_broadcast" != ".$broadcast" ]; then return 1; fi
	if [ ".$u_subnet" != ".$subnet" ]; then return 1; fi
	if [ ".$u_ip" != ".$ip" ]; then return 1; fi
	if [ ".$u_router" != ".$router" ]; then return 1; fi
	if [ ".$u_domain" != ".$domain" ]; then return 1; fi
	if [ ".$u_dns" != ".$dns" ]; then return 1; fi

	return 0;
}

udhcpc_remove_config()
{
	rm -f $UDHCPC_CONF
}

configure_ipaddress()
{
		/sbin/ifconfig $interface $ip $BROADCAST $NETMASK
}

configure_routes()
{
		if [ -n "$router" ] ; then
			echo "deleting routers"
			while route del default gw 0.0.0.0 dev $interface 2> /dev/null ; do
				:
			done
			for i in $router ; do
				route add default gw $i dev $interface
				if [ ! $? -eq 0 ]; then
					route add -host $router dev $interface
					route add default gw $i dev $interface
				fi
			done
		fi
}
configure_dns()
{
		# do not remove resolv.conf if no dns servers received from dhcp
		if [ ".$dns" = "." ]; then
			return 0
		fi

		echo -n > $RESOLV_CONF
		[ -n "$domain" ] && echo search $domain >> $RESOLV_CONF
		for i in $dns ; do
			echo adding dns $i
			echo nameserver $i >> $RESOLV_CONF
		done
}

udhcpc_start_services()
{
		if [ ! -f $SERVICES_FILE ]; then 
			echo "File $SERVICES_FILE does not exist"
			return;
		fi

		for serv in `cat $SERVICES_FILE`; do
			/usr/etc/init.d/plugin start $serv
		done
}

udhcpc_stop_services()
{
		if [ ! -f $SERVICES_FILE ]; then 
			echo "File $SERVICES_FILE does not exist"
			return;
		fi

		rev_servlist=""
		for serv in `cat $SERVICES_FILE`; do
			rev_servlist="$serv $rev_servlist"
		done

		for serv in $rev_servlist; do
			/usr/etc/init.d/plugin stop $serv
		done
}

udhcpc_source_system_cfg()
{
		eval `grep dhcpc\. /tmp/system.cfg | /bin/sed -e :1 -e 's/\(.*\)\.\(.*\)\(=\)/\1_\2\3/;t1' -e 's/\(.*=\)\(.*\)/\1\"\2\"/g'`
}

udhcpc_search_fallback()
{
		for i in 1 2 3 4; do
			devname=`eval echo '$'"dhcpc_${i}_devname"`
			fallback=`eval echo '$'"dhcpc_${i}_fallback"`
			if [ ! -z $devname ] && [ "x$devname" = "x$interface" ]; then
				[ ! -z $fallback ] && UDHCPC_FALLBACK_IP=$fallback
				return
			fi
		done
}
case "$1" in
	deconfig)
		if [ -e $UDHCPC_CONF ]; then
			udhcpc_stop_services
			# clear IP address from interface
			/sbin/ifconfig $interface 0.0.0.0
		fi
		udhcpc_remove_config
		;;

	nolease)
		udhcpc_remove_config
		udhcpc_source_system_cfg
		udhcpc_search_fallback
		/sbin/ifconfig $interface $UDHCPC_FALLBACK_IP
		;;

	bound)
		configure_ipaddress
		configure_routes
		configure_dns

		if [ -e $UDHCPC_CONF ]; then
			udhcpc_start_services
		fi
                
		udhcpc_write_config
		;;

	renew)
		if ! udhcpc_compare_config; then
			udhcpc_stop_services

			configure_ipaddress
			configure_routes
			configure_dns

			udhcpc_start_services

			udhcpc_write_config
		fi
		;;
esac

exit 0
