#!/bin/bash
PATH=/sbin:/usr/sbin:/bin:/usr/bin
TEXTDOMAIN=initscripts

cd /etc/sysconfig/network-scripts
. network-functions
. /etc/rc.d/functions

need_hostname

CONFIG=${1}

[ -z "${CONFIG}" ] && {
    echo $"usage: ifup <device name>" >&2
    exit 1
}

[ -f "${CONFIG}" ] || CONFIG=ifcfg-${CONFIG}
[ -f "${CONFIG}" ] || {
    echo $"usage: ifup <device name>" >&2
    exit 1
}

if [ ${UID} != 0 ]; then
    if [ -x /usr/sbin/usernetctl ]; then
	if /usr/sbin/usernetctl ${CONFIG} report ; then
	    exec /usr/sbin/usernetctl ${CONFIG} up
	fi
    fi
    echo $"Users cannot control this device." >&2
    exit 1
fi

source_config

if [ "foo$2" = "fooboot" -a "${ONBOOT}" = "no" -o "${ONBOOT}" = "NO" ]
then
    exit
fi

IPSETUP=no

DEVICETYPE=`echo ${DEVICE} | sed "s/[0-9]*$//"`
REALDEVICE=`echo ${DEVICE} | sed 's/:.*//g'`
if echo ${DEVICE} | grep -q ':' ; then
    ISALIAS=yes
else
    ISALIAS=no
fi

# Old BOOTP variable
if [ "${BOOTP}" = "yes" ]; then
    BOOTPROTO=bootp
fi

if [ "${BOOTPROTO}" = bootp -o "${BOOTPROTO}" = dhcp ]; then
    DYNCONFIG=true
fi

if [ -x /sbin/ifup-pre-local ]; then
    /sbin/ifup-pre-local ${DEVICE}
fi

OTHERSCRIPT="/etc/sysconfig/network-scripts/ifup-${DEVICETYPE}"

if [ -x ${OTHERSCRIPT} ]; then
    exec ${OTHERSCRIPT} ${CONFIG} $2
fi

# is this device available? (this catches PCMCIA devices for us)
LC_ALL= LANG= /sbin/ifconfig ${REALDEVICE} 2>&1 | grep -s "not found" > /dev/null
if [ "$?" = "0" ]; then
    echo $"Delaying ${DEVICE} initialization."
    exit 1
fi

if [ "${SLAVE}" = yes -a "${ISALIAS}" = no -a "${MASTER}" != "" -a \
     -x /sbin/ifenslave ]; then
    RFLAG="" ; [ "${RECEIVEONLY}" = yes ] && RFLAG="-r"

    ifconfig ${DEVICE} down
    echo $"Enslaving ${DEVICE} to ${MASTER}"
    ifenslave ${RFLAG} "${MASTER}" "${DEVICE}"

    exit 0
fi

if [ -n "${MACADDR}" ]; then
   ifconfig ${DEVICE} hw ether ${MACADDR}
fi

# Is there a firewall running, and does it look like one we configured?
FWACTIVE=
if [ -f /etc/sysconfig/ipchains -a "`ipchains -L input -n 2>&1 | awk 'END { print NR }'`" -gt 1 ]; then
	FWACTIVE=1
	export FWACTIVE
fi
			     
if [ -n "${DYNCONFIG}" ]; then
    PUMPARGS=
    DHCPCDARGS=
    if [ -n "${DHCP_HOSTNAME}" ]; then
       PUMPARGS="-h ${DHCP_HOSTNAME}"
       DHCPCDARGS="-h ${DHCP_HOSTNAME}"
    fi
    if [ -n "${NEEDHOSTNAME}" ]; then
       PUMPARGS="${PUMPARGS} --lookup-hostname"
       DHCPCDARGS="${DHCPCDARGS} -H"
    fi
    if [ "${PEERDNS}" = "no" ]; then
       PUMPARGS="${PUMPARGS} -d"
       DHCPCDARGS="${DHCPCDARGS} -R"
    fi
    echo -n $"Determining IP information for ${DEVICE}..."
    
    # DHCP clients need DNS to be available, and we don't know
    # what DNS server they're using until they are done.
    FWHACK=
    if [ -n "$FWACTIVE" -a "$FIREWALL_MODS" != "no" ]; then
        ipchains -I input -s 0/0 53 -p udp -j ACCEPT
	FWHACK=1
    fi
    
    if [ -x /sbin/pump ] && /sbin/pump ${PUMPARGS} -i ${DEVICE} ; then
	echo $" done."
    elif [ -x /sbin/dhcpcd ] && /sbin/dhcpcd ${DHCPCDARGS} ${DEVICE} ; then
	echo $" done."
    else
	echo $" failed."
	[ -n "$FWHACK" ] && ipchains -D input -s 0/0 53 -p udp -j ACCEPT
	exit 1
    fi
    [ -n "$FWHACK" ] && ipchains -D input -s 0/0 53 -p udp -j ACCEPT
else 
    if [ -z "${IPADDR}" ]; then
         # enable device without IP, useful for e.g. PPPoE
         ifconfig ${DEVICE} up ${MTU:+mtu $MTU}
	 exec /etc/sysconfig/network-scripts/ifup-post ${CONFIG} ${2}
    fi
  
    if [ -z "${NETMASK}" ]; then
	eval `/bin/ipcalc --netmask ${IPADDR}`
    fi

    if [ -z "${BROADCAST}" ]; then
	eval `/bin/ipcalc --broadcast ${IPADDR} ${NETMASK}`
    fi

    if [ -z "${NETWORK}" ]; then
	eval `/bin/ipcalc --network ${IPADDR} ${NETMASK}`
    fi
    
    ifconfig ${DEVICE} ${IPADDR} netmask ${NETMASK} broadcast ${BROADCAST} \
    	$(toggle_value arp $ARP) \
	$(toggle_value promisc $PROMISC) \
	$(toggle_value allmulti $ALLMULTI)
	
    # don't re-add subnet route on 2.2 kernels, but add a route
    # to a non-local subnet.
    # stupid hack, but it should work
    if [ "$ISALIAS" = no ] && [ -z "`route -n | sed "s/ .*//" | grep ${NETWORK}`" ]; then
	route add -net ${NETWORK} netmask ${NETMASK} dev ${DEVICE}
    fi

    . /etc/sysconfig/network

    if [ -z "${GATEWAYDEV}" -o "${GATEWAYDEV}" = "${DEVICE}" ]; then
	# set up default gateway
	if [ -n "${GATEWAY}" -a "`ipcalc --network ${GATEWAY} ${NETMASK} 2>/dev/null`" = "NETWORK=${NETWORK}" ]; then
	    route add default gw ${GATEWAY} ${DEVICE}
	    DEFGW=${GATEWAY}
	elif [ "${GATEWAYDEV}" = "${DEVICE}" ]; then
	    route add default ${DEVICE}
	fi
    fi
fi

. /etc/sysconfig/network

# IPv6 initialisation?
if [ "${NETWORKING_IPV6}" = "yes" ]; then
	/etc/sysconfig/network-scripts/ifup-ipv6 $DEVICE
fi


if [ "${IPX}" = yes ]; then
	/etc/sysconfig/network-scripts/ifup-ipx ${DEVICE}
fi

exec /etc/sysconfig/network-scripts/ifup-post ${CONFIG} ${2}
