# -*-Shell-script-*-
#
# This file is not a stand-alone shell script; it provides functions 
# to network scripts that source it.

# Set up a default search path.
PATH="/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin"
export PATH

need_config()
{
    [ -f "${CONFIG}" ] || \
       CONFIG=../networking/default/${1}
    [ -f "${CONFIG}" ] || \
       CONFIG=../networking/default/ifcfg-${1}
    [ -f "${CONFIG}" ] || \
       CONFIG="ifcfg-${1}"
}

source_config ()
{
    DEVNAME=`basename $CONFIG | sed 's/^ifcfg-//g'`

    if basename $CONFIG | grep '[^g]-' >/dev/null 2>&1 ; then
	PARENTCONFIG=`echo $CONFIG | sed 's/-[^-]*$//g'`
	PARENTDEVNAME=`basename $PARENTCONFIG | sed 's/^ifcfg-//g'`
	[ -f $PARENTCONFIG ] || {
	    echo $"Missing config file $PARENTCONFIG." >&2
	    exit 1
	}
	. $PARENTCONFIG
    fi
    . $CONFIG
}

expand_config ()
{
    if [ -z "${NETMASK}" ]; then
	eval `/bin/ipcalc --netmask ${IPADDR}`
    fi

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

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

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

toggle_value()
{
	if [ -z "$2" ]
	then
		echo ''
	elif [ "$2" = "yes"  -o "$2" = "YES" ] ; then
		echo "$1 on"
	elif [ "$2" = "no"  -o "$2" = "NO" ] ; then
		echo "$1 off"
	else
		echo ''
	fi
}
 
do_netreport ()
{
  # Notify programs that have requested notification
  ( cd /var/run/netreport || exit
    for i in * ; do
      if [ -f $i ]; then
        OWNER=`ls -l $i | awk '{ print $3 }'`
	
        if [ "`id -u`" = "0" ]; then
	  su -s /bin/bash $OWNER -c "kill -SIGIO $i >/dev/null 2>&1 || rm -f $i >/dev/null 2>&1" > /dev/null 2>&1
	else
	  kill -SIGIO $i >/dev/null 2>&1 || rm -f $i >/dev/null 2>&1
	fi
      fi
    done
  )
}

is_available ()
{
 LC_ALL= LANG= ip -o link | grep -q $1
 if [ "$?" = "1" ]; then
    alias=`modprobe -c | awk "/^alias $1 / { print \\$3 }"`
    if [ -z "$alias" -o "$alias" = "off" ]; then
        return 2
    fi
    modprobe $1 >/dev/null 2>&1|| {
      return 1
    }
 else
        return 0
 fi
}

need_hostname()
{
    if [ "`hostname`" = "(none)" -o "`hostname`" = "localhost" -o \
	 "`hostname`" = "localhost.localdomain" ]; then
	 return 0
    else
	 return 1
    fi
}

set_hostname()
{
    hostname $1
    if ! grep search /etc/resolv.conf >/dev/null 2>&1; then
	domain=`echo $1 | sed 's/^[^\.]*\.//'`
	echo "search $domain" >> /etc/resolv.conf
    fi
}

check_device_down ()
{
    if echo $1 | grep -q ':' ; then
     if LC_ALL=C ifconfig -a 2>/dev/null | grep -q $1 ; then
	  retcode=1
     else
	  retcode=0
     fi
    else 
     if LC_ALL=C ip -o link ls dev $1 2>/dev/null | grep ",UP" >/dev/null 2>&1 ; then
	retcode=1
     else
	retcode=0
     fi
    fi
    return $retcode
}

check_link_down ()
{
    if [ -x /sbin/mii-tool ]; then
        LC_ALL=C ip link show $1 2>/dev/null| grep -q UP || ip link set $1 up >/dev/null 2>&1
	sleep 2
	/sbin/mii-tool >/dev/null 2>&1 || return 1
	output=`LC_ALL=C /sbin/mii-tool $1 2>&1`
	if echo $output | grep -q "Operation not supported"; then
	    return 1
	elif echo $output | grep -q "Invalid argument"; then
	    return 1
	elif echo $output | grep -q "link ok"; then
	    return 1
	elif echo $output | grep -q "No MII transceiver present"; then
	    return 1
	else
	    return 0
        fi
    fi
    return 0
}

check_default_route ()
{
   LC_ALL=C ip route | grep -q default
}

find_gateway_dev ()
{
    . /etc/sysconfig/network
    if [ "${GATEWAY}" != "" -a "${GATEWAY}" != "none" ] ; then
        export GATEWAY
        networks=`LC_ALL=C /sbin/route -n|awk '{print $1, ENVIRON["GATEWAY"],$3,$8}'|awk '{system("ipcalc --silent --network "$2" "$3" 2>/dev/null")}'|sed s^NETWORK=^^g`
        for net in $networks; do
            dev=`LC_ALL=C /sbin/route -n|grep ^$net|awk '{print $NF}'`
            if [ "$dev" != "" ] ; then
                GATEWAYDEV=$dev
            fi
        done
    fi
}

add_default_route ()
{
    . /etc/sysconfig/network
    find_gateway_dev
    if [ "${GATEWAY}" != "" -a \
 	 "${GATEWAY}" != "none" -a \
	 "${GATEWAYDEV}" != "" ] ; then
        if ! check_device_down $1; then
            if [ "$GATEWAY" = "0.0.0.0" ]; then
                /sbin/ip route add default dev ${GATEWAYDEV}
            else
                /sbin/ip route add default via ${GATEWAY}
            fi
        fi
    else
    	if [ -f /etc/default-route ]; then
		/sbin/ip route add default via `cat /etc/default-route`
		rm -f /etc/default-route
	fi
    fi
}

is_wireless_device ()
{
  if [ -x /sbin/iwconfig ]; then
    LC_ALL=C iwconfig $1 2>&1 | grep -q "no wireless extensions" || return 0
  fi
  return 1
}