freebsd-skq/etc/rc.d/netwait
dougb 3645513107 Prepare for the removal of set_rcvar() by changing the rcvar=
assignments to the literal values it would have returned.

The concept of set_rcvar() was nice in theory, but the forks
it creates are a drag on the startup process, which is especially
noticeable on slower systems, such as embedded ones.

During the discussion on freebsd-rc@ a preference was expressed for
using ${name}_enable instead of the literal values. However the
code portability concept doesn't really apply since there are so
many other places where the literal name has to be searched for
and replaced. Also, using the literal value is also a tiny bit
faster than dereferencing the variables, and every little bit helps.
2012-01-14 02:18:41 +00:00

99 lines
2.1 KiB
Bash
Executable File

#!/bin/sh
# $FreeBSD$
#
# PROVIDE: netwait
# REQUIRE: NETWORKING
# KEYWORD: nojail
#
# The netwait script is intended to be used by systems which have
# statically-configured IP addresses in rc.conf(5). If your system
# uses DHCP, you should use synchronous_dhclient="YES" in your
# /etc/rc.conf instead of using netwait.
. /etc/rc.subr
name="netwait"
rcvar="netwait_enable"
start_cmd="${name}_start"
stop_cmd=":"
netwait_start()
{
local ip rc count output link
if [ -z "${netwait_ip}" ]; then
err 1 "You must define one or more IP addresses in netwait_ip"
fi
if [ ${netwait_timeout} -lt 1 ]; then
err 1 "netwait_timeout must be >= 1"
fi
# Handle SIGINT (Ctrl-C); force abort of while() loop
trap break SIGINT
if [ -n "${netwait_if}" ]; then
echo -n "Waiting for $netwait_if to have link"
count=1
while [ ${count} -le ${netwait_if_timeout} ]; do
if output=`/sbin/ifconfig ${netwait_if} 2>/dev/null`; then
link=`expr "${output}" : '.*[[:blank:]]status: \(no carrier\)'`
if [ -z "${link}" ]; then
echo '.'
break
fi
else
echo ''
err 1 "ifconfig ${netwait_if} failed"
fi
sleep 1
count=$((count+1))
done
if [ -n "${link}" ]; then
# Restore default SIGINT handler
trap - SIGINT
echo ''
warn "Interface still has no link. Continuing with startup, but"
warn "be aware you may not have a fully functional networking"
warn "layer at this point."
return
fi
fi
# Handle SIGINT (Ctrl-C); force abort of while() loop
trap break SIGINT
for ip in ${netwait_ip}; do
echo -n "Waiting for ${ip} to respond to ICMP"
count=1
while [ ${count} -le ${netwait_timeout} ]; do
/sbin/ping -t 1 -c 1 -o ${ip} >/dev/null 2>&1
rc=$?
if [ $rc -eq 0 ]; then
# Restore default SIGINT handler
trap - SIGINT
echo '.'
return
fi
count=$((count+1))
done
echo ': No response from host.'
done
# Restore default SIGINT handler
trap - SIGINT
warn "Exhausted IP list. Continuing with startup, but be aware you may"
warn "not have a fully functional networking layer at this point."
}
load_rc_config $name
run_rc_command "$1"