sbin/hammer2: Fix "show" and "volhdr" output format
[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         local tmpres="/var/run/dhclient-resolv.conf.$interface"
124
125         rm -f "$tmpres"
126
127         if [ -n "$new_domain_name" ]; then
128                 echo "search $new_domain_name" >>"$tmpres"
129         fi
130
131         if [ -n "$new_domain_name_servers" ]; then
132                 for nameserver in $new_domain_name_servers; do
133                         echo "nameserver $nameserver" >>"$tmpres"
134                 done
135         fi
136
137         if [ -f "$tmpres" ]; then
138                 /sbin/resolvconf -a "$interface.dhcp" <"$tmpres"
139                 rm -f "$tmpres"
140         else
141                 /sbin/resolvconf -d "$interface.dhcp" -f
142         fi
143
144         return 0
145 }
146
147 #
148 # Start of active code.
149 #
150
151 case $reason in
152 MEDIUM)
153         # Not called by OpenBSD dhclient(8).
154         ;;
155
156 PREINIT)
157         # Not called by OpenBSD dhclient(8).
158         ;;
159
160 ARPSEND)
161         # Not called by OpenBSD dhclient(8).
162         exit 1
163         ;;
164
165 ARPCHECK)
166         # Not called by OpenBSD dhclient(8).
167         # Always succeed. i.e. accept lease.
168         ;;
169
170 BOUND|RENEW|REBIND|REBOOT)
171         if [ -n "$old_ip_address" ]; then
172                 if [ "$old_ip_address" != "$new_ip_address" ]; then
173                         delete_old_address
174                         delete_old_routes
175                 fi
176         fi
177         if [ "$reason" = BOUND ] ||
178            [ "$reason" = REBOOT ] ||
179            [ -z "$old_ip_address" ] ||
180            [ "$old_ip_address" != "$new_ip_address" ]; then
181                 add_new_address
182                 add_new_routes
183         fi
184         add_new_resolv_conf
185         ;;
186
187 EXPIRE|FAIL)
188         if [ -n "$old_ip_address" ]; then
189                 delete_old_address
190                 delete_old_routes
191         fi
192         /sbin/resolvconf -d "$interface.dhcp" -f
193         ;;
194
195 TIMEOUT)
196         add_new_address
197         sleep 1
198         if [ -n "$new_routers" ]; then
199                 set "$new_routers"
200                 if ping -q -c 1 -w 1 "$1"; then
201                         add_new_routes
202                         if add_new_resolv_conf; then
203                                 exit 0
204                         fi
205                 fi
206         fi
207         ifconfig $interface inet $new_ip_address delete
208         # XXX Why not a delete_old_address as before all other invocations of
209         #     delete_old_routes?
210         delete_old_routes
211         exit 1
212         ;;
213 esac
214
215 exit 0