xref: /OK3568_Linux_fs/buildroot/package/busybox/udhcpc.script (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1#!/bin/sh
2
3# udhcpc script edited by Tim Riker <Tim@Rikers.org>
4
5[ -z "$1" ] && echo "Error: should be called from udhcpc" && exit 1
6
7ACTION="$1"
8RESOLV_CONF="/etc/resolv.conf"
9[ -e $RESOLV_CONF ] || touch $RESOLV_CONF
10[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"
11[ -n "$subnet" ] && NETMASK="netmask $subnet"
12# Handle stateful DHCPv6 like DHCPv4
13[ -n "$ipv6" ] && ip="$ipv6/128"
14
15if [ -z "${IF_WAIT_DELAY}" ]; then
16	IF_WAIT_DELAY=10
17fi
18
19wait_for_ipv6_default_route() {
20	printf "Waiting for IPv6 default route to appear"
21	while [ $IF_WAIT_DELAY -gt 0 ]; do
22		if ip -6 route list | grep -q default; then
23			printf "\n"
24			return
25		fi
26		sleep 1
27		printf "."
28		: $((IF_WAIT_DELAY -= 1))
29	done
30	printf " timeout!\n"
31}
32
33case "$ACTION" in
34	deconfig)
35		/sbin/ifconfig $interface up
36		/sbin/ifconfig $interface 0.0.0.0
37
38		# drop info from this interface
39		# resolv.conf may be a symlink to /tmp/, so take care
40		TMPFILE=$(mktemp)
41		grep -vE "# $interface\$" $RESOLV_CONF > $TMPFILE
42		cat $TMPFILE > $RESOLV_CONF
43		rm -f $TMPFILE
44
45		if [ -x /usr/sbin/avahi-autoipd ]; then
46			/usr/sbin/avahi-autoipd -c $interface && /usr/sbin/avahi-autoipd -k $interface
47		fi
48		;;
49
50	leasefail|nak)
51		if [ -x /usr/sbin/avahi-autoipd ]; then
52			/usr/sbin/avahi-autoipd -c $interface || /usr/sbin/avahi-autoipd -wD $interface --no-chroot
53		fi
54		;;
55
56	renew|bound)
57		if [ -x /usr/sbin/avahi-autoipd ]; then
58			/usr/sbin/avahi-autoipd -c $interface && /usr/sbin/avahi-autoipd -k $interface
59		fi
60		/sbin/ifconfig $interface $ip $BROADCAST $NETMASK
61		if [ -n "$ipv6" ] ; then
62			wait_for_ipv6_default_route
63		fi
64
65		# RFC3442: If the DHCP server returns both a Classless
66		# Static Routes option and a Router option, the DHCP
67		# client MUST ignore the Router option.
68		if [ -n "$staticroutes" ]; then
69			echo "deleting routers"
70			route -n | while read dest gw mask flags metric ref use iface; do
71				[ "$iface" != "$interface" -o "$gw" = "0.0.0.0" ] || \
72					route del -net "$dest" netmask "$mask" gw "$gw" dev "$interface"
73			done
74
75			# format: dest1/mask gw1 ... destn/mask gwn
76			set -- $staticroutes
77			while [ -n "$1" -a -n "$2" ]; do
78				route add -net "$1" gw "$2" dev "$interface"
79				shift 2
80			done
81		elif [ -n "$router" ] ; then
82			echo "deleting routers"
83			while route del default gw 0.0.0.0 dev $interface 2> /dev/null; do
84				:
85			done
86
87			for i in $router ; do
88				route add default gw $i dev $interface
89			done
90		fi
91
92		# drop info from this interface
93		# resolv.conf may be a symlink to /tmp/, so take care
94		TMPFILE=$(mktemp)
95		grep -vE "# $interface\$" $RESOLV_CONF > $TMPFILE
96		cat $TMPFILE > $RESOLV_CONF
97		rm -f $TMPFILE
98
99		# prefer rfc3397 domain search list (option 119) if available
100		if [ -n "$search" ]; then
101			search_list=$search
102		elif [ -n "$domain" ]; then
103			search_list=$domain
104		fi
105
106		[ -n "$search_list" ] &&
107			echo "search $search_list # $interface" >> $RESOLV_CONF
108
109		for i in $dns ; do
110			echo adding dns $i
111			echo "nameserver $i # $interface" >> $RESOLV_CONF
112		done
113		;;
114esac
115
116HOOK_DIR="$0.d"
117for hook in "${HOOK_DIR}/"*; do
118    [ -f "${hook}" -a -x "${hook}" ] || continue
119    "${hook}" "$ACTION"
120done
121
122exit 0
123