1
0
mirror of https://git.FreeBSD.org/src.git synced 2025-01-14 14:55:41 +00:00
freebsd/etc/pccard_ether
Martin Blapp d7c24a758f Make this working with two or more pccards and with more than
one internal device. Don't call the startup procedure again if
we already use start.

Support a manually started dhclient and keep its configured
interfaces after pccard removal.

Make pccard_ether working in single-user mode without /usr mounted.
2003-08-12 20:22:44 +00:00

280 lines
5.9 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.${interface}.pid ]; then
pidfile="/var/run/dhclient.${interface}.pid"
elif [ -s /var/run/dhcpc.${interface}.pid ]; then
pidfile="/var/run/dhcpc.${interface}.pid"
elif [ -s /var/run/dhclient.pid ]; then
pidfile="/var/run/dhclient.pid"
else
return
fi
kill `cat ${pidfile}`
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() {
case ${pccard_ether_delay} in
[Nn][Oo])
;;
[0-9])
sleep ${pccard_ether_delay}
;;
esac
stop_dhcp
[ -n "$dhcp_program" ] && dhclient_program="$dhcp_program"
[ -n "$dhcp_flags" ] && dhclient_flags="$dhcp_flags"
if [ -x "${dhclient_program}" ]; then
if [ `basename ${dhclient_program}` = "dhclient" ]; then
pidfile="/var/run/dhclient.${interface}.pid"
dhclient_flags="${dhclient_flags} -pf ${pidfile}"
fi
${dhclient_program} ${dhclient_flags} $_dhcplist ${interface}
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 UP, > /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