#! /bin/sh
#
# network 1.87 2004/07/17 04:48:37 (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
if [ -d /var/lib/pcmcia ] ; then
    NAMEFILE=/var/lib/pcmcia/nameif.${SOCKET}.${INSTANCE}
else
    NAMEFILE=/var/run/nameif.${SOCKET}.${INSTANCE}
fi
if [ -r "$NAMEFILE" -a "$ACTION" != "start" ] ; then
    DEVICE=`cat $NAMEFILE`
fi
HWADDR=`/sbin/ifconfig $DEVICE | sed -ne 's/.*\(..:..:..:..:..:..\).*/\1/p'`

# Load site-specific settings
ADDRESS="$SCHEME,$SOCKET,$INSTANCE,$HWADDR"
start_fn () { return; }
stop_fn () { return; }
. $0.opts

if [ "$ACTION" = "start" ] ; then
    if [ -r "$NAMEFILE" ] ; then rm $NAMEFILE ; fi
    if [ -n "$NAMEIF" ] ; then
	log /sbin/nameif $NAMEIF $HWADDR || exit 1
	echo $NAMEIF > $NAMEFILE ; DEVICE=$NAMEIF
    fi
fi

RESOLV=/etc/resolv.conf

# Now, run the specific script for Wireless LAN interfaces
# Note : we need the wireless parameters to be set up before IP parameters,
# so that we can perform DHCP over the Wireless link if needed. Jean II
O_INFO=$INFO ; INFO=
if [ -x ./wireless ] ; then
    . ./wireless
else
    . /etc/pcmcia/wireless
fi
INFO=$O_INFO

bootp_setup ()
{
    if match `uname -r` "2.[2-9].*" ; then
	log /sbin/ifconfig $DEVICE up
    else
	log /sbin/ifconfig $DEVICE up 0.0.0.0
	log /sbin/route add default dev $DEVICE netmask 0.0.0.0
    fi
}

case "$ACTION" in

'start')
    [ -n "$VERBOSE" -a -n "$INFO" ] && echo "$INFO"

    [ -n "$IF_PORT" ] && /sbin/ifport $DEVICE $IF_PORT

    if is_true $PUMP ; then
	log "/sbin/pump -i $DEVICE > /dev/null" || exit 1
    elif is_true $BOOTP ; then
	bootp_setup
	if [ -x /sbin/bootpc ] ; then
	    eval `/sbin/bootpc --bootfile '' --returniffail \
		--timeoutwait 10 --dev $DEVICE`
	    log /sbin/ifconfig $DEVICE down
	    if [ -n "$GATEWAYS" ] ; then
		set - $GATEWAYS ; GATEWAY=$1
	    fi
	elif [ -x /sbin/pump ] ; then
	    log "/sbin/pump -i $DEVICE > /dev/null" || exit 1
	else
	    exit 1
	fi
    elif is_true $DHCP ; then
	bootp_setup
	HN=${DHCP_HOSTNAME:+-h $DHCP_HOSTNAME}
	if [ -x /sbin/dhcpcd ] ; then
	    # This is a version check: I know it looks weird
	    if /sbin/dhcpcd -XYZZY 2>&1 | grep -q DHCP ; then
		log "/sbin/dhcpcd -d $HN $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
		log "/sbin/dhcpcd $HN -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
		    chmod og+r $RESOLV.N
		    cat /etc/dhcpc/resolv.conf >> $RESOLV.N
		    echo "# $DEVICE end" >> $RESOLV.N
		    cat $RESOLV >> $RESOLV.N ; mv $RESOLV.N $RESOLV
		fi
	    fi
	elif [ -x /sbin/dhclient ] ; then
	    log "/sbin/dhclient $DEVICE >/dev/null 2>&1" || exit 1
	elif [ -x /sbin/pump ] ; then
	    log "/sbin/pump $HN -i $DEVICE > /dev/null" || exit 1
	else
	    exit 1
	fi
    fi

    if [ -n "$IPADDR" ] ; then
	# Basic network setup
	NM=${NETMASK:+netmask $NETMASK}
	BC=${BROADCAST:+broadcast $BROADCAST}
	MTU=${MTU:+mtu $MTU}
	log /sbin/ifconfig $DEVICE up $IPADDR $NM $BC $MTU
	if [ -n "$NETWORK" ] ; then
	    /sbin/ifuser $DEVICE $NETWORK || \
		log /sbin/route add -net $NETWORK $NM dev $DEVICE
	elif [ -n "$GATEWAY" ] ; then
	    /sbin/ifuser $DEVICE $GATEWAY || \
		log /sbin/route add $GATEWAY $DEVICE
	fi
	[ -n "$GATEWAY" ] && /sbin/route add default gw $GATEWAY metric 1
    fi
    
    # Update DNS stuff
    if [ -n "$DOMAIN$SEARCH$DNSSRVS$DNS_1$DNS_2$DNS_3" ] ; then
	echo "# $DEVICE begin" > $RESOLV.N
	chmod og+r $RESOLV.N
	[ -n "$DOMAIN" ] && echo "domain $DOMAIN" >> $RESOLV.N
	[ -n "$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 [ -n "$MOUNTS" ] ; then
	for MT in $MOUNTS ; do log mount -v $MT ; done
    fi

    if [ -n "$IPX_NETNUM" ] ; then
	log ipx_interface add $DEVICE $IPX_FRAME $IPX_NETNUM
    fi

    start_fn $DEVICE
    ;;

'stop')

    if [ -r "$NAMEFILE" ] ; then rm $NAMEFILE ; fi

    stop_fn $DEVICE

    if is_true $PUMP || is_true $BOOTP || is_true $DHCP || \
    	[ -n "$IPADDR" ] ; then

	# Shut down all NFS mounts on this interface
	nfsstop ()
	{
	    local HOST MT
	    if read HOST MT ; then
		nfsstop
		if /sbin/ifuser $DEVICE $HOST ; then
		    do_fuser -k -m $MT > /dev/null
		    log umount -f -v $MT
		fi
	    fi
	}
	mount -t nfs | sed -e 's/:.* on \(.*\) type .*/ \1/' | nfsstop

	[ -n "$IPX_NETNUM" ] && ipx_interface del $DEVICE $IPX_FRAME

	if is_true $PUMP ; then
	    log pump -r -i $DEVICE
	elif is_true $DHCP ; then
	    if [ -x /sbin/dhcpcd ] ; then
		PID=`cat /var/run/dhcpcd-$DEVICE.pid 2>/dev/null`
		if [ -n "$PID" ] ; then
		    kill -TERM $PID
		    sleep 2
		fi
		/sbin/dhcpcd -XYZZY 2>&1 | grep -q DHCP || \
		    rm -f /var/run/dhcpcd-$DEVICE.pid
	    elif [ -x /sbin/dhclient ] ; then
		PID=`cat /var/run/dhclient.pid 2>/dev/null`
		if [ -n "$PID" ] ; then kill -TERM $PID ; fi
	    elif [ -x /sbin/pump ] ; then
		log /sbin/pump -r -i $DEVICE
	    fi
	fi
    fi

    # Remove nameservers
    if grep -q "# $DEVICE begin" $RESOLV ; then
	sed -e "/# $DEVICE begin/,/# $DEVICE end/d"	$RESOLV > $RESOLV.N
	mv $RESOLV.N $RESOLV
    fi

    log /sbin/ifconfig $DEVICE down
    ;;

'check')
    is_true $NO_CHECK && exit 0
    /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 && do_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 "$STATE" != "CLOSE" -a "$PORT" != "*" ] ; then\
		echo $HOST
	    fi
	done
    }
    DESTS=`netstat -ntuw | getdests`
    /sbin/ifuser $DEVICE $DESTS && exit 1
    ;;

'cksum')
    if [ $WIRELESS = 1 ] ; then exit 1 ; fi
    chk_simple "$NEW_SCHEME,$SOCKET,$INSTANCE,$HWADDR" || exit 1
    ;;

'restart')
    [ -n "$IPADDR" ] && /sbin/ifconfig $DEVICE down up
    ;;

'suspend'|'resume')
    ;;

*)
    usage
    ;;

esac

exit 0
