xref: /dragonfly/sbin/dhclient/dhclient-script (revision 9348a738)
1#!/bin/sh
2#
3# $OpenBSD: src/sbin/dhclient/Attic/dhclient-script,v 1.23 2012/09/18 18:27:55 krw Exp $
4#
5# Copyright (c) 2003 Kenneth R Westerback <krw@openbsd.org>
6#
7# Permission to use, copy, modify, and distribute this software for any
8# purpose with or without fee is hereby granted, provided that the above
9# copyright notice and this permission notice appear in all copies.
10#
11# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18#
19#
20
21#
22# Helper functions that implement common actions.
23#
24
25delete_old_address() {
26	if [ -n "$old_ip_address" ]; then
27		ifconfig $interface inet $old_ip_address delete
28		#route delete "$old_ip_address" 127.0.0.1 >/dev/null 2>&1
29	fi
30}
31
32add_new_address() {
33	ifconfig $interface \
34		inet $new_ip_address \
35		netmask $new_subnet_mask \
36		broadcast $new_broadcast_address
37
38	# XXX Original TIMEOUT code did not do this unless $new_routers was set?
39	#route add $new_ip_address 127.0.0.1 >/dev/null 2>&1
40}
41
42delete_old_routes() {
43	arp -dan
44}
45
46add_new_routes() {
47	for router in $new_routers; do
48		route -q delete default
49		if [ "$new_ip_address" = "$router" ]; then
50			route -q add default -iface $router
51		else
52			route -q add default $router
53		fi
54		# 2nd and subsequent default routers error out, so explicitly
55		# stop processing the list after the first one.
56		break
57	done
58}
59
60add_new_resolv_conf() {
61	# Create resolv.conf when either $new_domain_name_servers or
62	# $new_domain_name are provided. As reported in PR#3135, some ISPs
63	# provide only $new_domain_name_servers.
64
65	rm -f /etc/resolv.conf.std
66
67	if [ -n "$new_domain_name" ]; then
68		echo "search $new_domain_name" >>/etc/resolv.conf.std
69	fi
70
71	if [ -n "$new_domain_name_servers" ]; then
72		for nameserver in $new_domain_name_servers; do
73			echo "nameserver $nameserver" >>/etc/resolv.conf.std
74		done
75	fi
76
77	if [ -f /etc/resolv.conf.std ]; then
78		if [ -f /etc/resolv.conf.tail ]; then
79			cat /etc/resolv.conf.tail >>/etc/resolv.conf.std
80		fi
81
82		# In case (e.g. during OpenBSD installs) /etc/resolv.conf
83		# is a symbolic link, take care to preserve the link and write
84		# the new data in the correct location.
85
86		if [ -f /etc/resolv.conf ]; then
87			cat /etc/resolv.conf > /etc/resolv.conf.save
88		fi
89		cat /etc/resolv.conf.std > /etc/resolv.conf
90		rm -f /etc/resolv.conf.std
91
92		# Try to ensure correct ownership and permissions.
93		chown -RL root:wheel /etc/resolv.conf
94		chmod -RL 644 /etc/resolv.conf
95
96		return 0
97	fi
98
99	return 1
100}
101
102#
103# Start of active code.
104#
105
106case $reason in
107MEDIUM)
108	# Not called by OpenBSD dhclient(8).
109	;;
110
111PREINIT)
112	# Not called by OpenBSD dhclient(8).
113	;;
114
115ARPSEND)
116	# Not called by OpenBSD dhclient(8).
117	exit 1
118	;;
119
120ARPCHECK)
121	# Not called by OpenBSD dhclient(8).
122	# Always succeed. i.e. accept lease.
123	;;
124
125BOUND|RENEW|REBIND|REBOOT)
126	if [ -n "$old_ip_address" ]; then
127		if [ "$old_ip_address" != "$new_ip_address" ]; then
128			delete_old_address
129			delete_old_routes
130		fi
131	fi
132	if [ "$reason" = BOUND ] ||
133	   [ "$reason" = REBOOT ] ||
134	   [ -z "$old_ip_address" ] ||
135	   [ "$old_ip_address" != "$new_ip_address" ]; then
136		add_new_address
137		add_new_routes
138	fi
139	add_new_resolv_conf
140	;;
141
142EXPIRE|FAIL)
143	if [ -n "$old_ip_address" ]; then
144		delete_old_address
145		delete_old_routes
146	fi
147	if [ -f /etc/resolv.conf.save ]; then
148		cat /etc/resolv.conf.save > /etc/resolv.conf
149		rm -f /etc/resolv.conf.save
150	fi
151	;;
152
153TIMEOUT)
154	add_new_address
155	sleep 1
156	if [ -n "$new_routers" ]; then
157		set "$new_routers"
158		if ping -q -c 1 -w 1 "$1"; then
159			add_new_routes
160			if add_new_resolv_conf; then
161				exit 0
162			fi
163		fi
164	fi
165	ifconfig $interface inet $new_ip_address delete
166	# XXX Why not a delete_old_address as before all other invocations of
167	#     delete_old_routes?
168	delete_old_routes
169	exit 1
170	;;
171esac
172
173exit 0
174