#! /bin/sh # # network 1.54 1999/07/28 17:55:14 (David Hinds) # # Initialize or shutdown a PCMCIA ethernet adapter # # This script should be invoked with two arguments. The first is the # action to be taken, either "start", "stop", or "restart". The # second is the network interface name. # # The script passes an extended device address to 'network.opts' in # the ADDRESS variable, to retrieve device-specific configuration # options. The address format is "scheme,socket,instance,hwaddr" # where "scheme" is the current PCMCIA device configuration scheme, # "socket" is the socket number, "instance" is used to number multiple # interfaces in a single socket, and "hwaddr" is the card's hardware # ethernet address. # if [ -r ./shared ] ; then . ./shared ; else . /etc/pcmcia/shared ; fi # Get device attributes get_info $DEVICE HWADDR=`/sbin/ifconfig $DEVICE | sed -n -e 's/.*addr \([^ ]*\) */\1/p'` # Load site-specific settings ADDRESS="$SCHEME,$SOCKET,$INSTANCE,$HWADDR" start_fn () { return; } stop_fn () { return; } . $0.opts RESOLV=/etc/resolv.conf case "$ACTION" in 'start') test "$IF_PORT" && /sbin/ifport $DEVICE $IF_PORT if is_true $BOOTP ; then /sbin/ifconfig $DEVICE up 0.0.0.0 /sbin/route add default dev $DEVICE eval `/sbin/bootpc --bootfile '' --returniffail \ --timeoutwait 10 --dev $DEVICE` /sbin/route del default /sbin/ifconfig $DEVICE down if [ "$GATEWAYS" ] ; then set - $GATEWAYS ; GATEWAY=$1 fi fi if is_true $DHCP ; then /sbin/ifconfig $DEVICE up 0.0.0.0 /sbin/route add default dev $DEVICE if /sbin/dhcpcd -V 2>&1 | grep -q DHCP ; then /sbin/dhcpcd $DEVICE >/dev/null 2>&1 || exit 1 else # Jump through hoops for lame 0.70-era dhcpcd L=/var/run/dhcp-lock-$DEVICE /bin/echo "#!/bin/sh\nrm $L" > $L ; chmod +x $L /sbin/dhcpcd -c $L $DEVICE >/dev/null 2>&1 for t in 0 1 2 3 4 5 6 7 8 9 ; do sleep 2 ; if [ ! -e $L ] ; then break ; fi done rm -f $L if [ -e /etc/dhcpc/resolv.conf ] ; then echo "# $DEVICE begin" > $RESOLV.N cat /etc/dhcpc/resolv.conf >> $RESOLV.N echo "# $DEVICE end" >> $RESOLV.N cat $RESOLV >> $RESOLV.N ; mv $RESOLV.N $RESOLV fi fi fi if [ "$IPADDR" ] ; then # Basic network setup BC=${BROADCAST:+broadcast $BROADCAST} /sbin/ifconfig $DEVICE up $IPADDR netmask $NETMASK $BC if [ "$NETWORK" ] ; then /sbin/ifuser $DEVICE $NETWORK || \ /sbin/route add -net $NETWORK netmask $NETMASK dev $DEVICE elif [ "$GATEWAY" ] ; then /sbin/ifuser $DEVICE $GATEWAY || \ /sbin/route add $GATEWAY $DEVICE fi test "$GATEWAY" && /sbin/route add default gw $GATEWAY metric 1 # Update DNS stuff if [ "$DOMAIN$SEARCH$DNSSRVS$DNS_1$DNS_2$DNS_3" ] ; then echo "# $DEVICE begin" > $RESOLV.N test "$DOMAIN" && echo "domain $DOMAIN" >> $RESOLV.N test "$SEARCH" && echo "search $SEARCH" >> $RESOLV.N for DNS in $DNSSRVS $DNS_1 $DNS_2 $DNS_3 ; do echo "nameserver $DNS" >> $RESOLV.N done echo "# $DEVICE end" >> $RESOLV.N sed -e "/# $DEVICE begin/,/# $DEVICE end/d" $RESOLV >> $RESOLV.N mv $RESOLV.N $RESOLV fi # Handle NFS mounts if [ "$MOUNTS" ] ; then for MT in $MOUNTS ; do mount -v $MT ; done fi fi if [ "$IPX_NETNUM" ] ; then ipx_interface add $DEVICE $IPX_FRAME $IPX_NETNUM fi start_fn $DEVICE ;; 'stop') stop_fn $DEVICE if is_true $BOOTP || is_true $DHCP || [ "$IPADDR" ] ; then # Shut down all NFS mounts on this interface nfsstop () { while read HOST MT ; do nfsstop if /sbin/ifuser $DEVICE $HOST ; then fuser -s -k -m $MT umount -v $MT fi done } mount -t nfs | sed -e 's/:.* on \(.*\) type .*/ \1/' | nfsstop test "$IPX_NETNUM" && ipx_interface del $DEVICE $IPX_FRAME # Remove nameservers if fgrep -q "# $DEVICE begin" $RESOLV ; then sed -e "/# $DEVICE begin/,/# $DEVICE end/d" $RESOLV > $RESOLV.N mv $RESOLV.N $RESOLV fi if is_true $DHCP ; then kill -TERM `cat /var/run/dhcpcd-$DEVICE.pid` sleep 2 /sbin/dhcpcd -V 2>&1 | grep -q DHCP || \ rm -f /var/run/dhcpcd-$DEVICE.pid fi fi /sbin/ifconfig $DEVICE down ;; 'check') /sbin/ifconfig $DEVICE | grep -q RUNNING || exit 0 # Check for any in-use NFS mounts nfscheck () { while read HOST MT ; do /sbin/ifuser $DEVICE $HOST && fuser -sm $MT && exit 1 done } mount -t nfs | sed -e 's/:.* on \(.*\) type .*/ \1/' | nfscheck # Check for active TCP or UDP connections getdests () { IFS=" :" ; read A ; read A while read A B C D E HOST PORT STATE ; do if [ "$STATE" != "FIN_WAIT1" -a "$STATE" != "FIN_WAIT2" \ -a "$STATE" != "CLOSE_WAIT" -a "$STATE" != "TIME_WAIT" \ -a "$HOST" != "127.0.0.1" -a "$HOST" != "0.0.0.0" \ -a "$PORT" != "*" ] ; then echo $HOST fi done } DESTS=`netstat -ntuw | getdests` /sbin/ifuser $DEVICE $DESTS && exit 1 ;; 'cksum') chk_simple "$3,$SOCKET,$INSTANCE,$HWADDR" || exit 1 ;; 'restart') test "$IPADDR" && /sbin/ifconfig $DEVICE down up ;; 'suspend'|'resume') ;; *) usage ;; esac exit 0