freebsd-dev/etc/pccard_ether
Ceri Davies f5c4146d5a The submitter of bin/75786 turned out to not have removable interfaces,
and so the fix committed in r1.42 was not quite correct for the case
where there are two or more DHCP consuming removable interfaces - dhclient
must be restarted so that the other interfaces continue to function
correctly.

Approved by:	murray
MFC After:	7 days
2005-01-17 11:44:30 +00:00

273 lines
5.6 KiB
Bash
Executable File

#!/bin/sh -
#
# $FreeBSD$
#
# pccard_ether interfacename [start|stop] [ifconfig option]
#
# example: pccard_ether fxp0 start link0
#
. /etc/network.subr
stop_dhcp() {
# If dhclient is already running, record
# its interfaces.
if [ -x /usr/bin/grep ]; then
eval _active_list=\"`/bin/ps -axwww | \
/usr/bin/grep dhclient | \
/usr/bin/grep -v grep | \
/usr/bin/sed -e 's|^.*dhclient||' | \
/usr/bin/awk '{for (i=1;i<=NF;i++) \
{ if ($i~/[a-zA-Z].[0-9]$/) \
{ printf(" %s",$i) } }}'` \
\"
fi
# Get the rc.conf list of dhcp configured interfaces
static_dhcp_list="`list_net_interfaces dhcp`"
# Get the current ifconfig list of interfaces
_aprefix=
_nlist=
for _if in ${_active_list} ; do
_test_if=`ifconfig ${_if} 2>&1`
case "$_test_if" in
"ifconfig: interface $_if does not exist")
;;
${interface})
# Don't record the same device twice.
;;
*)
#
# Catch devices which were specified before,
# but have not been part of the rc. We need
# them again for the restart.
#
for _cif in ${static_dhcp_list} ; do
case "$_cif" in
${_if})
# Nothing to add
;;
*)
# Found interface beside rc.conf
_nlist="${_nlist}${_aprefix}${_if}"
;;
esac
done
_dhcplist="${_dhcplist}${_aprefix}${_if}"
[ -z "$_aprefix" ] && _aprefix=' '
;;
esac
done
if [ -s /var/run/dhclient.pid ]; then
pidfile="/var/run/dhclient.pid"
else
return
fi
/sbin/dhclient -r ${interface}
rm -f ${pidfile}
case ${startstop} in
[Ss][Tt][Oo][Pp])
if [ -z "${_nlist}" ]; then
sh /etc/rc.d/dhclient start
else
start_dhcp_keep_current
fi
;;
*)
;;
esac
}
start_dhcp() {
stop_dhcp
case ${pccard_ether_delay} in
[Nn][Oo])
;;
[0-9]*)
sleep ${pccard_ether_delay}
;;
esac
[ -n "$dhcp_program" ] && dhclient_program="$dhcp_program"
[ -n "$dhcp_flags" ] && dhclient_flags="$dhcp_flags"
if [ -x "${dhclient_program}" ]; then
interfaces=`echo $_dhcplist ${interface} | xargs -n 1 echo | sort -u`
${dhclient_program} ${dhclient_flags} ${interfaces}
else
echo "${dhclient_program}: DHCP client software not available"
fi
}
# Called after detaching a card, if dhclient has been
# used for more than one interface.
start_dhcp_keep_current() {
[ -n "$dhcp_program" ] && dhclient_program="$dhcp_program"
[ -n "$dhcp_flags" ] && dhclient_flags="$dhcp_flags"
if [ -x "${dhclient_program}" ]; then
${dhclient_program} ${dhclient_flags} \
${_dhcplist}
else
echo "${dhclient_program}: DHCP client software not available"
fi
}
# Suck in the configuration variables
#
if [ -r /etc/defaults/rc.conf ]; then
. /etc/defaults/rc.conf
source_rc_confs
elif [ -r /etc/rc.conf ]; then
. /etc/rc.conf
fi
interface=$1
shift
startstop=$1
shift
case ${pccard_ifconfig} in
[Nn][Oo] | '')
expr "${removable_interfaces}" : ".*${interface}" > /dev/null || exit 0
;;
*)
# Backward compatible
eval ifconfig_${interface}=\${pccard_ifconfig}
;;
esac
case ${startstop} in
[Ss][Tt][Aa][Rr][Tt] | '')
if [ -x /usr/bin/grep ]; then
if ifconfig ${interface} | grep -s netmask > /dev/null 2>&1; then
# Interface is already up, so ignore it.
exit 0
fi
fi
if [ -r /etc/start_if.${interface} ]; then
. /etc/start_if.${interface}
fi
eval ifconfig_args=\$ifconfig_${interface}
case ${ifconfig_args} in
[Nn][Oo] | '')
;;
[Dd][Hh][Cc][Pp])
# Start up the DHCP client program
start_dhcp
;;
*)
# Do the primary ifconfig if specified
ifconfig ${interface} ${ifconfig_args} $*
# Check to see if aliases need to be added
alias=0
while :
do
eval ifx_args=\$ifconfig_${interface}_alias${alias}
if [ -n "${ifx_args}" ]; then
ifconfig ${interface} ${ifx_args} alias
alias=`expr ${alias} + 1`
else
break;
fi
done
# Do ipx address if specified
eval ifx_args=\$ifconfig_${interface}_ipx
if [ -n "${ifx_args}" ]; then
ifconfig ${interface} ${ifx_args}
fi
# Add default route into $static_routes
case ${defaultrouter} in
[Nn][Oo] | '')
;;
*)
static_routes="default ${static_routes}"
route_default="default ${defaultrouter}"
;;
esac
# Add private route for this interface into $static_routes
eval ifx_routes=\$static_routes_${interface}
if [ -n "${ifx_routes}" ]; then
static_routes="${ifx_routes} ${static_routes}"
fi
# Set up any static routes if specified
if [ -n "${static_routes}" ]; then
for i in ${static_routes}; do
eval route_args=\$route_${i}
route add ${route_args}
done
fi
;;
esac
# IPv6 setup
case ${ipv6_enable} in
[Yy][Ee][Ss])
if [ -r /etc/network.subr ]; then
. /etc/network.subr
network6_interface_setup ${interface}
fi
;;
esac
;;
# Stop the interface
*)
if [ -r /etc/stop_if.${interface} ]; then
. /etc/stop_if.${interface}
fi
eval ifconfig_args=\$ifconfig_${interface}
case ${ifconfig_args} in
[Nn][Oo] | '')
;;
[Dd][Hh][Cc][Pp])
# Stop the DHCP client for this interface
stop_dhcp
;;
*)
# Delete static route if specified
eval ifx_routes=\$static_routes_${interface}
if [ -n "${ifx_routes}" ]; then
for i in ${ifx_routes}; do
eval route_args=\$route_${i}
route delete ${route_args}
done
fi
# Delete aliases if exist
alias=0
while :
do
eval ifx_args=\$ifconfig_${interface}_alias${alias}
if [ -n "${ifx_args}" ]; then
ifconfig ${interface} ${ifx_args} alias delete
alias=`expr ${alias} + 1`
else
break;
fi
done
;;
esac
# Remove the network interface and cleaning ARP table
ifconfig ${interface} delete
arp -d -a
# Clean the routing table
case ${removable_route_flush} in
[Nn][Oo])
;;
*)
# flush beforehand, just in case....
route -n flush -inet
;;
esac
;;
esac