#!/bin/bash

. /etc/rc.d/init.d/functions

RESOLV=/etc/resolv.conf
DEVICE=$1

if [ ! "$DEVICE" ]; then
    exit 1
fi

if [ ! -e "/etc/sysconfig/netconfig/$DEVICE.conf" ]; then
    msg "No configuration for device $DEVICE"
    exit 1
else
    . /etc/sysconfig/netconfig/$DEVICE.conf
fi

if [ -e "/etc/sysconfig/netconfig/$DEVICE-wireless.conf" -a "$WIRELESS" = "y" ]; then
    . /etc/sysconfig/netconfig/$DEVICE-wireless.conf
fi

is_true ()
{
    [ "$1" = "y" -o "$1" = "Y" -o "$1" = "yes" -o "$1" = "YES" ]
}

match () { case $1 in $2) return 0; ;; *) return 1; ;; esac ; }

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

#echo $DHCP
#echo $IPADDR
#echo $NETMASK
#echo $BROADCAST
#echo $GATEWAY


if is_true $WIRELESS ; then
    for IWPATH in /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin /sbin ; do
	if [ -x $IWPATH/iwconfig ] ; then break ; fi
    done
    # Mode need to be first : some settings apply only in a specific mode !
    if [ "$MODE" ] ; then
	$IWPATH/iwconfig $DEVICE mode $MODE
    fi
    # This is a bit hackish, but should do the job right...
    if [ "$ESSID" ] || [ "$MODE" ] ; then
        NICKNAME=`/bin/hostname`
	$IWPATH/iwconfig $DEVICE nick $NICKNAME >/dev/null 2>&1
    fi
    if [ "$CHANNEL" ] ; then
	$IWPATH/iwconfig $DEVICE channel $CHANNEL
    fi
    if [ "$KEY" ] ; then
	$IWPATH/iwconfig $DEVICE key $KEY
    else
	$IWPATH/iwconfig $DEVICE enc off
    fi
    # ESSID need to be last : most device re-perform the scanning/discovery
    # when this is set, and things like encryption keys are better be
    # defined if we want to discover the right set of APs/nodes.
    if [ "$ESSID" ] ; then
	$IWPATH/iwconfig $DEVICE essid "$ESSID"
    fi
fi

if is_true $DHCP ; then
    bootp_setup
    HN=${DHCP_HOSTNAME:+-h $DHCP_HOSTNAME}
    TO=${DHCP_TIMEOUT:+-t $DHCP_TIMEOUT}
    if [ -x /sbin/dhcpcd ] ; then
        # This is a version check: I know it looks weird
        if /sbin/dhcpcd --help 2>&1 | grep -q DHCP ; then
	    /sbin/dhcpcd -N $HN $TO $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 -N $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
		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
	/sbin/dhclient $DEVICE >/dev/null 2>&1 || exit 1
    elif [ -x /sbin/pump ] ; then
	/sbin/pump $HN -i $DEVICE
    else
	exit 1
    fi
elif [ "$IPADDR" ] ; then
    # Basic network setup
    NM=${NETMASK:+netmask $NETMASK}
    BC=${BROADCAST:+broadcast $BROADCAST}
    MTU=${MTU:+mtu $MTU}
    /sbin/ifconfig $DEVICE up $IPADDR $NM $BC $MTU
    if [ "$NETWORK" ] ; then
        /sbin/ifuser $DEVICE $NETWORK || \
	/sbin/route add -net $NETWORK $NM dev $DEVICE
    elif [ "$GATEWAY" ] ; then
	/sbin/ifuser $DEVICE $GATEWAY 2>/dev/null >/dev/null || \
	/sbin/route add $GATEWAY $DEVICE
    fi
    test "$GATEWAY" && /sbin/route add default gw $GATEWAY metric 1
else
    exit 0
fi

# 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
