sbin/hammer2: Update printinode
[dragonfly.git] / sbin / dhclient / dhclient-script
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
25 delete_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         if [ -n "$old_classless_routes" ]; then
31                 fill_classless_routes "$old_classless_routes"
32                 set $classless_routes
33                 while [ $# -gt 1 ]; do
34                         route delete "$1" "$2"
35                         shift; shift
36                 done
37                 return 0;
38         fi
39 }
40
41 add_new_address() {
42         ifconfig $interface \
43                 inet $new_ip_address \
44                 netmask $new_subnet_mask \
45                 broadcast $new_broadcast_address
46
47         # XXX Original TIMEOUT code did not do this unless $new_routers was set?
48         #route add $new_ip_address 127.0.0.1 >/dev/null 2>&1
49 }
50
51 fill_classless_routes() {
52         set $1
53         while [ $# -ge 5 ]; do
54                 if [ $1 -eq 0 ]; then
55                         route="default"
56                 elif [ $1 -le 8 ]; then
57                         route="$2.0.0.0/$1"
58                         shift
59                 elif [ $1 -le 16 ]; then
60                         route="$2.$3.0.0/$1"
61                         shift; shift
62                 elif [ $1 -le 24 ]; then
63                         route="$2.$3.$4.0/$1"
64                         shift; shift; shift
65                 else
66                         route="$2.$3.$4.$5/$1"
67                         shift; shift; shift; shift
68                 fi
69                 shift
70                 router="$1.$2.$3.$4"
71                 classless_routes="$classless_routes $route $router"
72                 shift; shift; shift; shift
73         done
74 }
75
76 delete_old_routes() {
77         arp -dan
78 }
79
80 add_new_routes() {
81         # RFC 3442: If the DHCP server returns both a Classless Static
82         # Routes option and a Router option, the DHCP client MUST ignore
83         # the Router option.
84         #
85         # DHCP clients that support this option (Classless Static Routes)
86         # MUST NOT install the routes specified in the Static Routes
87         # option (option code 33) if both a Static Routes option and the
88         # Classless Static Routes option are provided.
89
90         if [ -n "$new_classless_routes" ]; then
91                 fill_classless_routes "$new_classless_routes"
92                 $LOGGER "New Classless Static Routes ($interface): $classless_routes"
93                 set $classless_routes
94                 while [ $# -gt 1 ]; do
95                         if [ "0.0.0.0" = "$2" ]; then
96                                 route add "$1" -iface "$interface"
97                         else
98                                 route add "$1" "$2"
99                         fi
100                         shift; shift
101                 done
102                 return
103         fi
104
105         for router in $new_routers; do
106                 route -q delete default
107                 if [ "$new_ip_address" = "$router" ]; then
108                         route -q add default -iface $router
109                 else
110                         route -q add default $router
111                 fi
112                 # 2nd and subsequent default routers error out, so explicitly
113                 # stop processing the list after the first one.
114                 break
115         done
116 }
117
118 add_new_resolv_conf() {
119         # Create resolv.conf when either $new_domain_name_servers or
120         # $new_domain_name are provided. As reported in PR#3135, some ISPs
121         # provide only $new_domain_name_servers.
122
123         rm -f /etc/resolv.conf.std
124
125         if [ -n "$new_domain_name" ]; then
126                 echo "search $new_domain_name" >>/etc/resolv.conf.std
127         fi
128
129         if [ -n "$new_domain_name_servers" ]; then
130                 for nameserver in $new_domain_name_servers; do
131                         echo "nameserver $nameserver" >>/etc/resolv.conf.std
132                 done
133         fi
134
135         if [ -f /etc/resolv.conf.std ]; then
136                 if [ -f /etc/resolv.conf.tail ]; then
137                         cat /etc/resolv.conf.tail >>/etc/resolv.conf.std
138                 fi
139
140                 # In case (e.g. during OpenBSD installs) /etc/resolv.conf
141                 # is a symbolic link, take care to preserve the link and write
142                 # the new data in the correct location.
143
144                 if [ -f /etc/resolv.conf ]; then
145                         cat /etc/resolv.conf > /etc/resolv.conf.save
146                 fi
147                 cat /etc/resolv.conf.std > /etc/resolv.conf
148                 rm -f /etc/resolv.conf.std
149
150                 # Try to ensure correct ownership and permissions.
151                 chown -RL root:wheel /etc/resolv.conf
152                 chmod -RL 644 /etc/resolv.conf
153
154                 return 0
155         fi
156
157         return 1
158 }
159
160 #
161 # Start of active code.
162 #
163
164 case $reason in
165 MEDIUM)
166         # Not called by OpenBSD dhclient(8).
167         ;;
168
169 PREINIT)
170         # Not called by OpenBSD dhclient(8).
171         ;;
172
173 ARPSEND)
174         # Not called by OpenBSD dhclient(8).
175         exit 1
176         ;;
177
178 ARPCHECK)
179         # Not called by OpenBSD dhclient(8).
180         # Always succeed. i.e. accept lease.
181         ;;
182
183 BOUND|RENEW|REBIND|REBOOT)
184         if [ -n "$old_ip_address" ]; then
185                 if [ "$old_ip_address" != "$new_ip_address" ]; then
186                         delete_old_address
187                         delete_old_routes
188                 fi
189         fi
190         if [ "$reason" = BOUND ] ||
191            [ "$reason" = REBOOT ] ||
192            [ -z "$old_ip_address" ] ||
193            [ "$old_ip_address" != "$new_ip_address" ]; then
194                 add_new_address
195                 add_new_routes
196         fi
197         add_new_resolv_conf
198         ;;
199
200 EXPIRE|FAIL)
201         if [ -n "$old_ip_address" ]; then
202                 delete_old_address
203                 delete_old_routes
204         fi
205         if [ -f /etc/resolv.conf.save ]; then
206                 cat /etc/resolv.conf.save > /etc/resolv.conf
207                 rm -f /etc/resolv.conf.save
208         fi
209         ;;
210
211 TIMEOUT)
212         add_new_address
213         sleep 1
214         if [ -n "$new_routers" ]; then
215                 set "$new_routers"
216                 if ping -q -c 1 -w 1 "$1"; then
217                         add_new_routes
218                         if add_new_resolv_conf; then
219                                 exit 0
220                         fi
221                 fi
222         fi
223         ifconfig $interface inet $new_ip_address delete
224         # XXX Why not a delete_old_address as before all other invocations of
225         #     delete_old_routes?
226         delete_old_routes
227         exit 1
228         ;;
229 esac
230
231 exit 0