dhclient - Improve comment about resolv.conf creation.
[dragonfly.git] / sbin / dhclient / dhclient-script
1 #!/bin/sh
2 #
3 # $OpenBSD: src/sbin/dhclient/dhclient-script,v 1.13 2009/01/24 13:59:43 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
25 delete_old_address() {
26         if [ -n "$old_ip_address" ]; then
27                 ifconfig $interface inet $old_ip_address delete $medium
28                 #route delete "$old_ip_address" 127.0.0.1 >/dev/null 2>&1
29         fi
30 }
31
32 add_new_address() {
33         ifconfig $interface \
34                 inet $new_ip_address \
35                 netmask $new_subnet_mask \
36                 broadcast $new_broadcast_address \
37                 $medium
38
39         # XXX Original TIMEOUT code did not do this unless $new_routers was set?
40         #route add $new_ip_address 127.0.0.1 >/dev/null 2>&1
41 }
42
43 delete_old_alias() {
44         if [ -n "$alias_ip_address" ]; then
45                 ifconfig $interface inet $alias_ip_address delete > /dev/null 2>&1
46 #               #route delete $alias_ip_address 127.0.0.1 > /dev/null 2>&1
47         fi
48 }
49
50 add_new_alias() {
51         if [ -n "$alias_ip_address" ]; then
52                 ifconfig $interface inet $alias_ip_address alias netmask \
53                     $alias_subnet_mask
54                 #route add $alias_ip_address 127.0.0.1
55         fi
56 }
57
58 delete_old_routes() {
59         if [ -n "$old_static_routes" ]; then
60                 set $old_static_routes
61                 while [ $# -gt 1 ]; do
62                         route delete "$1" "$2"
63                         shift; shift
64                 done
65         fi
66
67         arp -dan
68 }
69
70 add_new_routes() {
71         for router in $new_routers; do
72                 route -q delete default
73                 if [ "$new_ip_address" = "$router" ]; then
74                         route -q add default -iface $router
75                 else
76                         route -q add default $router
77                 fi
78                 # 2nd and subsequent default routers error out, so explicitly
79                 # stop processing the list after the first one.
80                 break
81         done
82
83         if [ -n "$new_static_routes" ]; then
84                 set $new_static_routes
85                 while [ $# -gt 1 ]; do
86                         route add $1 $2
87                         shift; shift
88                 done
89         fi
90 }
91
92 add_new_resolv_conf() {
93         # Create resolv.conf when either $new_domain_name_servers or
94         # $new_domain_name are provided. As reported in PR#3135, some ISPs
95         # provide only $new_domain_name_servers.
96
97         rm -f /etc/resolv.conf.std
98
99         if [ -n "$new_domain_name" ]; then
100                 echo "search $new_domain_name" >>/etc/resolv.conf.std
101         fi
102
103         if [ -n "$new_domain_name_servers" ]; then
104                 for nameserver in $new_domain_name_servers; do
105                         echo "nameserver $nameserver" >>/etc/resolv.conf.std
106                 done
107         fi
108
109         if [ -f /etc/resolv.conf.std ]; then
110                 if [ -f /etc/resolv.conf.tail ]; then
111                         cat /etc/resolv.conf.tail >>/etc/resolv.conf.std
112                 fi
113
114                 # In case (e.g. during OpenBSD installs) /etc/resolv.conf
115                 # is a symbolic link, take care to preserve the link and write
116                 # the new data in the correct location.
117
118                 if [ -f /etc/resolv.conf ]; then
119                         cat /etc/resolv.conf > /etc/resolv.conf.save
120                 fi
121                 cat /etc/resolv.conf.std > /etc/resolv.conf
122                 rm -f /etc/resolv.conf.std
123
124                 # Try to ensure correct ownership and permissions.
125                 chown -RL root:wheel /etc/resolv.conf
126                 chmod -RL 644 /etc/resolv.conf
127
128                 return 0
129         fi
130
131         return 1
132 }
133
134 #
135 # Start of active code.
136 #
137
138 case $reason in
139 MEDIUM)
140         ifconfig $interface $medium
141         sleep 1
142         ;;
143
144 PREINIT)
145         delete_old_alias
146         ifconfig $interface up
147         ;;
148
149 ARPCHECK|ARPSEND)
150         ;;
151
152 BOUND|RENEW|REBIND|REBOOT)
153         if [ -n "$old_ip_address" ]; then
154                 if [ "$old_ip_address" != "$alias_ip_address" ]; then
155                         delete_old_alias
156                 fi
157                 if [ "$old_ip_address" != "$new_ip_address" ]; then
158                         delete_old_address
159                         delete_old_routes
160                 fi
161         fi
162         if [ "$reason" = BOUND ] ||
163            [ "$reason" = REBOOT ] ||
164            [ -z "$old_ip_address" ] ||
165            [ "$old_ip_address" != "$new_ip_address" ]; then
166                 add_new_address
167                 add_new_routes
168         fi
169         if [ "$new_ip_address" != "$alias_ip_address" ]; then
170                 add_new_alias
171         fi
172         add_new_resolv_conf
173         ;;
174
175 EXPIRE|FAIL)
176         delete_old_alias
177         if [ -n "$old_ip_address" ]; then
178                 delete_old_address
179                 delete_old_routes
180         fi
181         # XXX Why add alias we just deleted above?
182         add_new_alias
183         if [ -f /etc/resolv.conf.save ]; then
184                 cat /etc/resolv.conf.save > /etc/resolv.conf
185         fi
186         ;;
187
188 TIMEOUT)
189         delete_old_alias
190         add_new_address
191         sleep 1
192         if [ -n "$new_routers" ]; then
193                 set "$new_routers"
194                 if ping -q -c 1 -w 1 "$1"; then
195                         if [ "$new_ip_address" != "$alias_ip_address" ]; then
196                                 add_new_alias
197                         fi
198                         add_new_routes
199                         if add_new_resolv_conf; then
200                                 exit 0
201                         fi
202                 fi
203         fi
204         ifconfig $interface inet $new_ip_address delete $medium
205         # XXX Why not a delete_old_address as before all other invocations of
206         #     delete_old_routes?
207         delete_old_routes
208         exit 1
209         ;;
210 esac
211
212 exit 0