#!/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"