Deleted Added
full compact
netwait (230099) netwait (292752)
1#!/bin/sh
2
1#!/bin/sh
2
3# $FreeBSD: head/etc/rc.d/netwait 230099 2012-01-14 02:18:41Z dougb $
3# $FreeBSD: head/etc/rc.d/netwait 292752 2015-12-26 18:21:32Z ian $
4#
5# PROVIDE: netwait
4#
5# PROVIDE: netwait
6# REQUIRE: NETWORKING
6# REQUIRE: devd routing
7# KEYWORD: nojail
8#
7# KEYWORD: nojail
8#
9# The netwait script is intended to be used by systems which have
10# statically-configured IP addresses in rc.conf(5). If your system
11# uses DHCP, you should use synchronous_dhclient="YES" in your
12# /etc/rc.conf instead of using netwait.
9# The netwait script helps handle two situations:
10# - Systems with USB or other late-attaching network hardware which
11# is initialized by devd events. The script waits for all the
12# interfaces named in the netwait_if list to appear.
13# - Systems with statically-configured IP addresses in rc.conf(5).
14# The IP addresses in the netwait_ip list are pinged. The script
15# waits for any single IP in the list to respond to the ping. If your
16# system uses DHCP, you should probably use synchronous_dhclient="YES"
17# in your /etc/rc.conf instead of netwait_ip.
18# Either or both of the wait lists can be used (at least one must be
19# non-empty if netwait is enabled).
13
14. /etc/rc.subr
15
16name="netwait"
17rcvar="netwait_enable"
18
19start_cmd="${name}_start"
20stop_cmd=":"
21
22netwait_start()
23{
20
21. /etc/rc.subr
22
23name="netwait"
24rcvar="netwait_enable"
25
26start_cmd="${name}_start"
27stop_cmd=":"
28
29netwait_start()
30{
24 local ip rc count output link
31 local ip rc count output link wait_if got_if any_error
25
32
26 if [ -z "${netwait_ip}" ]; then
27 err 1 "You must define one or more IP addresses in netwait_ip"
33 if [ -z "${netwait_if}" ] && [ -z "${netwait_ip}" ]; then
34 err 1 "No interface or IP addresses listed, nothing to wait for"
28 fi
29
30 if [ ${netwait_timeout} -lt 1 ]; then
31 err 1 "netwait_timeout must be >= 1"
32 fi
33
35 fi
36
37 if [ ${netwait_timeout} -lt 1 ]; then
38 err 1 "netwait_timeout must be >= 1"
39 fi
40
34 # Handle SIGINT (Ctrl-C); force abort of while() loop
35 trap break SIGINT
36
37 if [ -n "${netwait_if}" ]; then
41 if [ -n "${netwait_if}" ]; then
38 echo -n "Waiting for $netwait_if to have link"
39
40 count=1
41 while [ ${count} -le ${netwait_if_timeout} ]; do
42 if output=`/sbin/ifconfig ${netwait_if} 2>/dev/null`; then
43 link=`expr "${output}" : '.*[[:blank:]]status: \(no carrier\)'`
44 if [ -z "${link}" ]; then
45 echo '.'
46 break
42 any_error=0
43 for wait_if in ${netwait_if}; do
44 echo -n "Waiting for ${wait_if}"
45 link=""
46 got_if=0
47 count=1
48 # Handle SIGINT (Ctrl-C); force abort of while() loop
49 trap break SIGINT
50 while [ ${count} -le ${netwait_if_timeout} ]; do
51 if output=`/sbin/ifconfig ${wait_if} 2>/dev/null`; then
52 if [ ${got_if} -eq 0 ]; then
53 echo -n ", interface present"
54 got_if=1
55 fi
56 link=`expr "${output}" : '.*[[:blank:]]status: \(no carrier\)'`
57 if [ -z "${link}" ]; then
58 echo ', got link.'
59 break
60 fi
47 fi
61 fi
48 else
49 echo ''
50 err 1 "ifconfig ${netwait_if} failed"
51 fi
52 sleep 1
53 count=$((count+1))
54 done
55 if [ -n "${link}" ]; then
62 sleep 1
63 count=$((count+1))
64 done
56 # Restore default SIGINT handler
57 trap - SIGINT
65 # Restore default SIGINT handler
66 trap - SIGINT
58
59 echo ''
60 warn "Interface still has no link. Continuing with startup, but"
61 warn "be aware you may not have a fully functional networking"
62 warn "layer at this point."
63 return
67 if [ ${got_if} -eq 0 ]; then
68 echo ", wait failed: interface never appeared."
69 any_error=1
70 elif [ -n "${link}" ]; then
71 echo ", wait failed: interface still has no link."
72 any_error=1
73 fi
74 done
75 if [ ${any_error} -eq 1 ]; then
76 warn "Continuing with startup, but be aware you may not have "
77 warn "a fully functional networking layer at this point."
64 fi
65 fi
78 fi
79 fi
80
81 if [ -n "${netwait_ip}" ]; then
82 # Handle SIGINT (Ctrl-C); force abort of for() loop
83 trap break SIGINT
66
84
67 # Handle SIGINT (Ctrl-C); force abort of while() loop
68 trap break SIGINT
85 for ip in ${netwait_ip}; do
86 echo -n "Waiting for ${ip} to respond to ICMP ping"
69
87
70 for ip in ${netwait_ip}; do
71 echo -n "Waiting for ${ip} to respond to ICMP"
88 count=1
89 while [ ${count} -le ${netwait_timeout} ]; do
90 /sbin/ping -t 1 -c 1 -o ${ip} >/dev/null 2>&1
91 rc=$?
72
92
73 count=1
74 while [ ${count} -le ${netwait_timeout} ]; do
75 /sbin/ping -t 1 -c 1 -o ${ip} >/dev/null 2>&1
76 rc=$?
93 if [ $rc -eq 0 ]; then
94 # Restore default SIGINT handler
95 trap - SIGINT
77
96
78 if [ $rc -eq 0 ]; then
79 # Restore default SIGINT handler
80 trap - SIGINT
81
82 echo '.'
83 return
84 fi
85 count=$((count+1))
97 echo ', got response.'
98 return
99 fi
100 count=$((count+1))
101 done
102 echo ', failed: No response from host.'
86 done
103 done
87 echo ': No response from host.'
88 done
89
104
90 # Restore default SIGINT handler
91 trap - SIGINT
105 # Restore default SIGINT handler
106 trap - SIGINT
92
107
93 warn "Exhausted IP list. Continuing with startup, but be aware you may"
94 warn "not have a fully functional networking layer at this point."
108 warn "Exhausted IP list. Continuing with startup, but be aware you may"
109 warn "not have a fully functional networking layer at this point."
110 fi
111
95}
96
97load_rc_config $name
98run_rc_command "$1"
112}
113
114load_rc_config $name
115run_rc_command "$1"