#!/bin/sh
#
# Kernel NET hotplug params include:
#	
#	ACTION=%s [register or unregister]
#	INTERFACE=%s

. /etc/sysconfig/network-scripts/functions.network

mesg() {
    /usr/bin/logger -t $(basename $0)"[$$]" "$@"
}

debug_mesg() {
    :
}

# returns true if device is either wireless, usbnet or is named eth* and supports ethtool
ethernet_check() {
    [ -d /sys/class/net/$1/wireless/ ] && return 0
    [[ "$1" == bnep* ]] && return 0
    # eagle-usb/firewire create a fake ethX interface
    if [ -x /usr/sbin/ethtool ] && ! /usr/sbin/ethtool $1 > /dev/null 2>&1;
	then return 1;
    fi
    return 0;
}

if [ "$INTERFACE" = "" ]; then
    mesg Bad NET invocation: \$INTERFACE is not set
    exit 1
fi

export IN_HOTPLUG=1

case $ACTION in
add|register)
    case $INTERFACE in
	# interfaces that are registered after being "up" (?)
	ppp*|ippp*|isdn*|plip*|lo*|irda*|dummy*|ipsec*|tun*|tap*)
	    debug_mesg assuming $INTERFACE is already up
	    exit 0
	    ;;
	# interfaces that are registered then brought up
	*)
	    # NOTE:  network configuration relies on administered state,
	    # we can't do much here without distro-specific knowledge
	    # such as whether/how to invoke DHCP, set up bridging, etc.
	    # conform to network service (AUTOMATIC_IFCFG)

	    [ -r /etc/sysconfig/network ] && . /etc/sysconfig/network

	    # don't do anything for non ethernet devices
	    ethernet_check $INTERFACE || exit 0;

	    # automatically create an interface file
	    CFG=/etc/sysconfig/interfaces/ifcfg-$INTERFACE
	    if [ "$AUTOMATIC_IFCFG" != no -a ! -r $CFG ]; then
		debug_mesg creating config file for $INTERFACE
		cat > $CFG <<EOF
DEVICE=$INTERFACE
BOOTPROTO=dhcp
ONBOOT=no
EOF
	    fi

	    if [ ! -f /var/lock/subsys/network ] || [ ! -r $CFG ]; then
		# Don't do anything if the network is stopped or interface isn't configured
		exit 0
	    fi

	    if [ -x /sbin/ifup ]; then
		debug_mesg invoke ifup $INTERFACE
		exec /sbin/ifup $INTERFACE hotplug
	    fi
	    ;;
    esac
    mesg $1 $ACTION event not handled
    ;;

remove|unregister)
    case $INTERFACE in
	# interfaces that are unregistered after being "down" (?)
	ppp*|ippp*|isdn*|plip*|lo*|irda*|dummy*|ipsec*|tun*|tap*)
	    debug_mesg assuming $INTERFACE is already down
	    exit 0
	    ;;
	*)
	    if [ -x /sbin/ifdown ]; then
		debug_mesg invoke ifdown $INTERFACE
		exec /sbin/ifdown $INTERFACE hotplug
	    fi
	    ;;
    esac
    mesg $1 $ACTION event not handled
    ;;

*)
    debug_mesg NET $ACTION event for $INTERFACE not supported
    exit 1 ;;

esac
