#!/bin/sh
# Copyright (c) 1996, 1997 SuSE Gmbh Fuerth, Germany.  All rights reserved.
#
# /sbin/init.d/i4l
#
# (c) Klaus Franken, SuSE GmbH, Fuerth <kfr@suse.de>
#     Remo Behn, SuSE GmbH, Fuerth <sray@suse.de>
#
# Version: 6.0 14.12.98 (ray)
# Maintainer: sray@suse.de
#
# Dont't forget to edit /etc/rc.config!
# For more informatione see:
#    /usr/doc/packages/i4l/* (especially README.SuSE)
#    /usr/src/linux/Documentation/isdn/*
#    /usr/doc/packages/i4ldoc/*
#
# This script is configuring the ISDN net devices
# The ISDN hardware configuration is done by /sbin/rc.d/i4l*
#
# Additional Part MPPP / I4L_SLAVE - C.Guenther 03/98


. /etc/rc.config.d/i4l_default.rc.config

test "$I4L_START" = yes -o ! -z "$2" || exit 0

. /etc/rc.config
. /etc/rc.config.d/i4l_option.rc.config
. /etc/rc.config.d/i4l_sp_option.rc.config
. /etc/rc.config.d/i4l_unknown

SBIN=/sbin

case "$1" in
start)
    #
    # configure interfaces
    #
    for I in $NETCONFIG; do
        eval NETDEV=\$NETDEV$I
        eval IFCONFIG=\$IFCONFIG$I

        eval I4L_IDLETIME=\$I4L_IDLETIME$I
        eval I4L_DIALMAX=\$I4L_DIALMAX$I
        eval I4L_REMOTE_OUT=\$I4L_REMOTE_OUT$I
        eval I4L_REMOTE_OUT1=\$I4L_REMOTE_OUT1$I
        eval I4L_REMOTE_OUT2=\$I4L_REMOTE_OUT2$I
        eval I4L_REMOTE_IN=\$I4L_REMOTE_IN$I
        eval I4L_REMOTE_IN1=\$I4L_REMOTE_IN1$I
        eval I4L_REMOTE_IN2=\$I4L_REMOTE_IN2$I
        eval I4L_LOCALMSN=\$I4L_LOCALMSN$I
        eval I4L_PROTOCOL=\$I4L_PROTOCOL$I
        eval I4L_ENCAP=\$I4L_ENCAP$I
        eval I4L_SECURE=\$I4L_SECURE$I
        eval I4L_BIND=\$I4L_BIND$I
        eval I4L_DIALMODE=\$I4L_DIALMODE$I

		# additional/default features
        eval I4L_PPPBIND=\$I4L_PPPBIND$I
		test -z "$I4L_PPPBIND" && I4L_PPPBIND="yes"

        eval I4L_CHARGEHUP=\$I4L_CHARGEHUP$I
		test -z "$I4L_CHARGEHUP" && I4L_CHARGEHUP="off"

        eval I4L_IHUP=\$I4L_IHUP$I
		test -z "$I4L_IHUP" && I4L_IHUP="off"

        eval I4L_L2=\$I4L_L2$I
		test -z "$I4L_L2" && I4L_L2="hdlc"

        eval I4L_L3=\$I4L_L3$I
		test -z "$I4L_L3" && I4L_L3="trans"

        eval I4L_CALLBACK=\$I4L_CALLBACK$I
		test -z "$I4L_CALLBACK" && I4L_CALLBACK="off"

        eval I4L_CBDELAY=\$I4L_CBDELAY$I
		test -z "$I4L_CBDELAY" && I4L_CBDELAY="2"

        eval I4L_CBHUP=\$I4L_CBHUP$I
		test -z "$I4L_CBHUP" && I4L_CBHUP="on"

        eval I4L_SLAVE=\$I4L_SLAVE$I

        if test ! -z "$2" -a "$2" != "$NETDEV"; then
            continue
        fi

        case $NETDEV in
        ippp*|isdn*)
            echo "Starting isdn4linux on device $NETDEV"
            $SBIN/isdnctrl addif $NETDEV 
            cat /proc/net/dev | grep $NETDEV > /dev/null 2>&1
            if test $? -ne 0; then
                echo "$0: $NETDEV doesn't exist in /proc/net/dev"
                echo "Check ISDN hardware configuration and activate"
                echo ""
                exit 1
            fi

            if test -z "$I4L_LOCALMSN"; then
                echo "You must set a MSN/EAZ for $NETDEV"
                echo "edit /etc/rc.config and define 'I4L_LOCALMSN$I'"
                continue
            fi
            # define local MSN (phone number):
            $SBIN/isdnctrl eaz $NETDEV ${I4L_LOCALMSN}

	    	# for isdn4k-utils3.xxx
		    $SBIN/isdnctrl dialmode $NETDEV $I4L_DIALMODE

            # compability:
            test -z "${I4L_REMOTE_OUT1}" ||
                I4L_REMOTE_OUT="${I4L_REMOTE_OUT1} $I4L_REMOTE_OUT"
            test -z "${I4L_REMOTE_OUT2}" ||
                I4L_REMOTE_OUT="${I4L_REMOTE_OUT2} $I4L_REMOTE_OUT"
            # add numbers(s) to call out:
            test -z "${I4L_REMOTE_OUT}" ||
                for number in ${I4L_REMOTE_OUT}; do
                    $SBIN/isdnctrl addphone $NETDEV out $number
                done

            # compability:
            test -z "${I4L_REMOTE_IN1}" ||
                I4L_REMOTE_IN="${I4L_REMOTE_IN1} $I4L_REMOTE_IN"
            test -z "${I4L_REMOTE_IN2}" ||
                I4L_REMOTE_IN="${I4L_REMOTE_IN2} $I4L_REMOTE_IN"
            # add numbers(s) allowed to call in:
            test -z "${I4L_REMOTE_IN}" ||
                for number in ${I4L_REMOTE_IN}; do
                    $SBIN/isdnctrl addphone $NETDEV in $number
                done

            # the  layer-2 protocol:
            $SBIN/isdnctrl l2_prot $NETDEV $I4L_L2

            # the  layer-3 protocol:
            $SBIN/isdnctrl l3_prot $NETDEV $I4L_L3

            # encapsulation
            $SBIN/isdnctrl encap $NETDEV $I4L_ENCAP

            # secure?, on = only defined numbers are allowed to call in
            $SBIN/isdnctrl secure $NETDEV $I4L_SECURE

            # automatic hangup if idle:
            $SBIN/isdnctrl huptimeout $NETDEV ${I4L_IDLETIME}

            # hangup before  next  charge  info?
            $SBIN/isdnctrl chargehup $NETDEV $I4L_CHARGEHUP

            # hangup incomming calls too?
            $SBIN/isdnctrl ihup $NETDEV $I4L_IHUP

            # set the number of dial atempts for each number
            test -z "$I4L_DIALMAX" ||
            $SBIN/isdnctrl dialmax $NETDEV $I4L_DIALMAX

            # callback features
            $SBIN/isdnctrl callback $NETDEV $I4L_CALLBACK
            $SBIN/isdnctrl cbdelay $NETDEV $I4L_CBDELAY
            $SBIN/isdnctrl cbhup $NETDEV $I4L_CBHUP

            # bind features
            test -z "${I4L_BIND}" ||
            $SBIN/isdnctrl bind $NETDEV ${I4L_BIND}

            # MPPP
            if test -n "$I4L_SLAVE"; then
                $SBIN/isdnctrl addslave $NETDEV $I4L_SLAVE
                # add numbers(s) to call out:
                test -z "${I4L_REMOTE_OUT}" ||
                        for number in ${I4L_REMOTE_OUT}; do
                                $SBIN/isdnctrl addphone $I4L_SLAVE out $number
                        done
                test -z "${I4L_REMOTE_IN}" ||
                        for number in ${I4L_REMOTE_IN}; do
                                $SBIN/isdnctrl addphone $I4L_SLAVE in $number
                        done
                $SBIN/isdnctrl eaz $I4L_SLAVE ${I4L_LOCALMSN}
                $SBIN/isdnctrl l2_prot $I4L_SLAVE $I4L_L2
                $SBIN/isdnctrl l3_prot $I4L_SLAVE $I4L_L3
                $SBIN/isdnctrl encap $I4L_SLAVE $I4L_ENCAP
                $SBIN/isdnctrl secure $I4L_SLAVE $I4L_SECURE
                $SBIN/isdnctrl huptimeout $I4L_SLAVE ${I4L_IDLETIME}
                $SBIN/isdnctrl chargehup $I4L_SLAVE $I4L_CHARGEHUP
            fi
            ;;
        *)
            ;;
        esac

        #
        # configure net device
        #
        case $NETDEV in
        isdn*)
            echo "Setting up network device $NETDEV"
            ifconfig $NETDEV $IFCONFIG
            ;;
        ippp*)
            echo "Setting up network device $NETDEV"
            ifconfig $NETDEV $IFCONFIG
            # start ppp-daemon
            OPTIONFILE=/etc/ppp/options.$NETDEV
            PIDFILE=/var/run/ipppd.$NETDEV.pid
            # is there running an old ipppd?
            if test -s $PIDFILE; then
                echo "Warning: $PIDFILE exists"
                echo "          is there an old ipppd running?"
                ps -h --format args `cat $PIDFILE` | grep $SBIN/ipppd>/dev/null
                if test $? -eq 0; then
                    echo "Warning: kill -15 `cat $PIDFILE`"
                    ps -p `cat $PIDFILE`
                    kill -15 `cat $PIDFILE`
                    sleep 2
                    if test -s $PIDFILE; then
                        # ganz schoen hartnaeckig :-(
                        echo "Warning: kill -9 `cat $PIDFILE`"
                        kill -9 `cat $PIDFILE`
                    fi
                fi
            fi
            # start
            if test -r $OPTIONFILE; then
                echo "Starting ippp-daemon for ISDN device $NETDEV with $OPTIONFILE"
                $SBIN/ipppd pidfile $PIDFILE file $OPTIONFILE &
            else
                echo "Start ippp-daemon for ISDN device $NETDEV"
                $SBIN/ipppd pidfile $PIDFILE $NETDEV &
            fi
            if test ! "$I4L_PPPBIND" = "no"; then
                binddev=`echo $NETDEV | sed -n "s/ippp\([0-9]*\)$/\1/p"`
                $SBIN/isdnctrl pppbind $NETDEV $binddev
                echo ""
		if test -n "$I4L_SLAVE"; then
		    binddev=`echo $I4L_SLAVE | sed -n "s/ippp\([0-9]*\)$/\1/p"`
		    $SBIN/isdnctrl pppbind $I4L_SLAVE $binddev
		    echo ""
		fi
            fi

            ;;
        *)
            ;;
        esac

    done
    ;;
stop)
    for I in $NETCONFIG; do
        eval NETDEV=\$NETDEV$I
        eval IFCONFIG=\$IFCONFIG$I

        if test ! -z "$2" -a "$2" != "$NETDEV"; then
            continue
        fi

        case "$NETDEV" in
        isdn*)
            echo "Shutting down network device $NETDEV."
            ifconfig $NETDEV down
	    $SBIN/isdnctrl delif $NETDEV
            ;;
        ippp*)
            echo "Shutting down network device and ipppd for $NETDEV."
            PIDFILE=/var/run/ipppd.$NETDEV.pid
            test -s $PIDFILE && kill -15 `cat $PIDFILE`
            if test -s $PIDFILE; then
                sleep 2 
                # ganz schoen hartnaeckig :-(
                echo "Warning: kill -9 `cat $PIDFILE`"
                kill -9 `cat $PIDFILE` 2>/dev/null
            fi
            ifconfig $NETDEV down
	    $SBIN/isdnctrl delif $NETDEV
            ;;
        *)
            ;;
        esac
    done
    ;;
*)
    echo "Usage: $0 {start|stop} [NETDEV]"
    exit 1
    ;;
esac

