Metropoli BBS
VIEWER: tcpeth MODE: TEXT (ASCII)
:
#      @(#)tcp	4.1 SCO Unix 3.2 TCP/IP/NFS  source
#      SCCS IDENTIFICATION
#
#	System V STREAMS TCP - Release 3.0
#
#	Copyright 1987, 1988, 1989 Lachman Associates, Incorporated (LAI)
#
#	All Rights Reserved.
#
#	The copyright above and this notice must be preserved in all
#	copies of this source code.  The copyright above does not
#	evidence any actual or intended publication of this source
#	code.
#
#	This is unpublished proprietary trade secret source code of
#	Lachman Associates.  This source code may not be copied,
#	disclosed, distributed, demonstrated or licensed except as
#	expressly authorized by Lachman Associates.
#
#	System V STREAMS TCP was jointly developed by Lachman
#	Associates and Convergent Technologies.
#
#
ND=/etc/conf/node.d
E3A_CNT=0
E3B_CNT=0
E3C_CNT=0
TOK_CNT=0
WDN_CNT=0
NAT_CNT=0
WDT_CNT=0
ETH_CNT=0
DIDDOMAIN=

#
# Prompt with mesg, return non-zero on q. Also allows setting -x and +x,
# shell escapes and the passing of default values
#
# Usage: prompt "message" [default]
# Argument is a quoted message
# Dependencies: expr
# Notes: returns 1 if the user answers q or Q, returns 0 otherwise
#	 if $quit is not set, it is set to "quit"
#	 $cmd is set to whatever is input by the user, and then can
#		subsequently be used in the shell script.
#
prompt() {
	_mesg=$1
	_default=$2
	while	echo "\n${_mesg} [${_default}]: \c" >&2
	do	read cmd < /dev/tty
		case $cmd in
		+x|-x)	set $cmd					;;
		!*)	eval `expr "$cmd" : "!\(.*\)"`			;;
		"")	# If there is an second argument use it
			# as the default else loop until 'cmd' is set
			[ "$2" ] && { 
				cmd=$2
				return 0
			}
			: continue
			;;
		*)	unset _mesg
			return 0					;;
		esac
	done
}

#
# The following three functions create broadcast addresses 
# based upon the ip address placed in the variable IP
# the result is placed in BROAD_ADDR
#
BROAD_ADDR=
IP=

getbaddr() {
	if [ $drv = "e3A" ] ; then
	BADDR_PROMPT="\nInterface $drv$E3A_CNT broadcast address [$BROAD_ADDR]: \c"
        elif [ $drv = "e3B" ] ; then
	BADDR_PROMPT="\nInterface $drv$E3B_CNT broadcast address [$BROAD_ADDR]: \c"
        elif [ $drv = "nat" ] ; then
	BADDR_PROMPT="\nInterface $drv$NAT_CNT broadcast address [$BROAD_ADDR]: \c"
        elif [ $drv = "wdt" ] ; then
	BADDR_PROMPT="\nInterface $drv$WDT_CNT broadcast address [$BROAD_ADDR]: \c"
        elif [ $drv = "eth" ] ; then
	BADDR_PROMPT="\nInterface $drv$ETH_CNT broadcast address [$BROAD_ADDR]: \c"
	elif [ $drv = "e3C" ] ; then
	BADDR_PROMPT="\nInterface $drv$E3C_CNT broadcast address [$BROAD_ADDR]: \c"
	elif [ $drv = "token" ] ; then
	BADDR_PROMPT="\nInterface $drv$TOK_CNT broadcast address [$BROAD_ADDR]: \c"
	elif [ $drv = "wdn" ] ; then
	BADDR_PROMPT="\nInterface $drv[$WDN_CNT] broadcast address [$BROAD_ADDR]: \c"
	else
	BADDR_PROMPT="\nInterface $drv broadcast address [$BROAD_ADDR]: \c"
	fi
	while	echo  $BADDR_PROMPT
	do	read broad_addr < /dev/tty
		case "$broad_addr" in
		[0-9]*)	BROAD_ADDR=$broad_addr
			break
			;;
		"")	BADDR=$BROAD_ADDR
			break
			;;
		*)	echo "Address must have n.n.n.n form, i.e., $BROAD_ADDR"
			;;
		esac
	done
}

baddr0() {
	firstbyte=`/bin/echo $IP | sed -e 's/\..*$//'`
	if expr $firstbyte \< 128 > /dev/null ; then
		BROAD_ADDR=`/bin/echo $IP | sed -e 's/\(.*\)\..*\..*\..*$/\1.0.0.0/'`
	elif expr $firstbyte \< 192 > /dev/null ; then
		BROAD_ADDR=`/bin/echo $IP | sed -e 's/\(.*\..*\)\..*\..*$/\1.0.0/'`
	else
		BROAD_ADDR=`/bin/echo $IP | sed -e 's/\(.*\..*\..*\)\..*$/\1.0/'`
	fi
	getbaddr
}

baddr255() {
	firstbyte=`/bin/echo $IP | sed -e 's/\..*$//'`
	if expr $firstbyte \< 128 > /dev/null ; then
		BROAD_ADDR=`/bin/echo $IP | sed -e 's/\(.*\)\..*\..*\..*$/\1.255.255.255/'`
	elif expr $firstbyte \< 192 > /dev/null ; then
		BROAD_ADDR=`/bin/echo $IP | sed -e 's/\(.*\..*\)\..*\..*$/\1.255.255/'`
	else
		BROAD_ADDR=`/bin/echo $IP | sed -e 's/\(.*\..*\..*\)\..*$/\1.255/'`
	fi
	getbaddr
}

# Prompt for yes or no answer - returns non-zero for no
getyn() {
	while	read yn < /dev/tty
	do	case $yn in
		[yY]*)	return 0 			;;
		[nN]*)	return 1			;;
		*)	p "enter either y or n" 	;;
		esac
	done
}

#
# get netmask for interface
#
getnetmask() {
	if [ $drv = "slip" ] ; then
		IP=$IP_SRC
	fi
	firstbyte=`/bin/echo $IP | sed -e 's/\..*$//'`
	if expr $firstbyte \< 128 > /dev/null ; then
		DEF_MASK=255.0.0.0
	elif expr $firstbyte \< 192 > /dev/null ; then
		DEF_MASK=255.255.0.0
	else
		DEF_MASK=255.255.255.0
	fi
	if [ $drv = "e3A" ] ; then
	    NM_PROMPT="\nInterface $drv$E3A_CNT netmask [$DEF_MASK]: \c"
	elif [ $drv = "e3B" ] ; then
	    NM_PROMPT="\nInterface $drv$E3B_CNT netmask [$DEF_MASK]: \c"
	elif [ $drv = "nat" ] ; then
	    NM_PROMPT="\nInterface $drv$NAT_CNT netmask [$DEF_MASK]: \c"
	elif [ $drv = "wdt" ] ; then
	    NM_PROMPT="\nInterface $drv$WDT_CNT netmask [$DEF_MASK]: \c"
	elif [ $drv = "eth" ] ; then
	    NM_PROMPT="\nInterface $drv$ETH_CNT netmask [$DEF_MASK]: \c"
	elif [ $drv = "e3C" ] ; then
	    NM_PROMPT="\nInterface $drv$E3C_CNT netmask [$DEF_MASK]: \c"
	elif [ $drv = "token" ] ; then
	    NM_PROMPT="\nInterface $drv$TOK_CNT netmask [$DEF_MASK]: \c"
	elif [ $drv = "wdn" ] ; then
	    NM_PROMPT="\nInterface $drv[$WDN_CNT] netmask [$DEF_MASK]: \c"
	elif [ $drv = "slip" ] ; then
	    NM_PROMPT="\nSLIP Interface on $SLIP_TTY netmask [$DEF_MASK]: \c"
	else
	    NM_PROMPT="\nInterface $drv address [$DEF_MASK]: \c"
	fi
	cmd=
	while [ -z "$cmd" -o "$cmd" = "quit" ] ; do
		prompt "$NM_PROMPT" "$DEF_MASK"
		NETMASK="netmask $cmd"
#		if [ "$cmd" = "$DEF_MASK" ] ; then
#		    NETMASK=""
#		else
#		fi
	done
}


#
# get a valid slip interface
#
SLIP_TTY=
IP_SRC=
IP_DST=
BAUD=

getslipif() {
	echo ""
	while	echo "Tty line: \c"
	do	read SLIP_TTY < /dev/tty
		case "$SLIP_TTY" in
		t*) 	break 
			;;
		*)	echo 'Try ttyXX (where XX is a number)'
			;;
		esac
	done
	while	echo "Interface source (you) IP address: \c"
	do	read ip < /dev/tty
		case "$ip" in
		[0-9]*)	IP_SRC=$ip
			break
			;;
		*)	echo "Address must have n.n.n.n form, i.e., 132.147.160.1"
			;;
		esac
	done
	while	echo "Interface destination (them) IP address: \c"
	do	read ip < /dev/tty
		case "$ip" in
		[0-9]*)	IP_DST=$ip
			break
			;;
		*)	echo "Address must have n.n.n.n form, i.e., 132.147.160.1"
			;;
		esac
	done
	echo "Baud rate (default 9600): \c"
	read BAUD < /dev/tty
	getnetmask
}

#
# get ip address
#
DEF_IP_ADDR="132.147.160.1"
IP=

getipaddr() {
	if [ $drv = "e3A" ] ; then
	    IP_PROMPT="\nInterface $drv$E3A_CNT IP address [$DEF_IP_ADDR]: \c"
	elif [ $drv = "e3B" ] ; then
	    IP_PROMPT="\nInterface $drv$E3B_CNT IP address [$DEF_IP_ADDR]: \c"
	elif [ $drv = "nat" ] ; then
	    IP_PROMPT="\nInterface $drv$NAT_CNT IP address [$DEF_IP_ADDR]: \c"
	elif [ $drv = "wdt" ] ; then
	    IP_PROMPT="\nInterface $drv$WDT_CNT IP address [$DEF_IP_ADDR]: \c"
	elif [ $drv = "eth" ] ; then
	    IP_PROMPT="\nInterface $drv$ETH_CNT IP address [$DEF_IP_ADDR]: \c"
	elif [ $drv = "e3C" ] ; then
	    IP_PROMPT="\nInterface $drv$E3C_CNT IP address [$DEF_IP_ADDR]: \c"
	elif [ $drv = "token" ] ; then
	    IP_PROMPT="\nInterface $drv$TOK_CNT IP address [$DEF_IP_ADDR]: \c"
	elif [ $drv = "wdn" ] ; then
	    IP_PROMPT="\nInterface $drv[$WDN_CNT] IP address [$DEF_IP_ADDR]: \c"
	else
	    IP_PROMPT="\nInterface $drv IP address [$DEF_IP_ADDR]: \c"
	fi
	while	echo  $IP_PROMPT
	do	read ip < /dev/tty
		case "$ip" in
		[0-9]*)	IP=$ip
			break
			;;
		"")	IP=$DEF_IP_ADDR
			break
			;;
		*)	p "Address must have n.n.n.n form, i.e., 192.9.200.9"
			;;
		esac
	done

	# Make sure this IP address is in /etc/hosts as us
	grep $IP /etc/hosts 2> /dev/null || {
	    if [ ! -f /etc/hosts ] ; then
		/bin/echo "127.0.0.1\tlocalhost loopback lb" > /etc/hosts
		chmod 644 /etc/hosts
		chown bin /etc/hosts
		chgrp bin /etc/hosts
	    fi
	    if [ -z "$HOSTNAME" ] ; then
		set -- `cat /etc/systemid`
		HOSTNAME=${1:-$2}
	    fi
	    FULLNAME=$HOSTNAME.$DOMAIN
	    /bin/echo "$IP\t$HOSTNAME $FULLNAME" >> /etc/hosts
	}
}

#
# get broadcast address
#
BROADCAST="broadcast"
getbroadaddr() {
	echo "Does interface $drv use a broadcast address of all 0's? [y/n]: \c"
	if getyn ; then
		baddr0
	else
		baddr255
	fi
	BROADCAST="broadcast $BROAD_ADDR"
}
#
# get domain name for local host
#
getdomname() {
	cmd=
	while [ -z "$cmd"  -o "$cmd" = "quit" ] ; do
		prompt "Enter DOMAIN name for $drv" "sco.COM"
		DOMAIN=$cmd
	done
	DIDDOMAIN="_DONE_"
}

# main
# DRVLIST=" e3A e3B e3C ni5210 pc586 wd8003 slip "
DRVLIST=" e3A nat wdt eth e3B e3C wdn slip token "

while true ; do
    while true ; do
	if [ $# = 0 ]; then
	    tput clear
	    echo "\t\t\tTCP/IP Ethernet Driver Configuration"
	    echo "\nWhich driver(s) will TCP/IP be using? "
	    echo "\nPlease choose one of the following:"
	    for i in $DRVLIST; do
		echo "\t$i"
	    done
	    echo "\nEnter the name of the driver TCP/IP will use or enter q to quit: \c"

	    read drv < /dev/tty

	    if [ "$drv" = quit -o "$drv" = q ] ; then
		rm -f /etc/rc2.d/S85tcp /etc/rc0.d/K85tcp
		ln /etc/tcp /etc/rc2.d/S85tcp
		ln /etc/tcp /etc/rc0.d/K85tcp
		echo "TCP/IP Driver Configuration Completed."
		exit 1
	    fi
	else
	    if [ $# -eq 0 ] ; then
		rm -f /etc/rc2.d/S85tcp /etc/rc0.d/K85tcp
		ln /etc/tcp /etc/rc2.d/S85tcp
		ln /etc/tcp /etc/rc0.d/K85tcp
		echo "TCP/IP Driver Configuration Completed."
		exit 1
	    fi
	    drv=$1
	    shift
	fi

	if expr "$DRVLIST" : ".* $drv " > /dev/null ; then
	    break
	fi

	echo "'$drv' is not a valid driver selection.  Please enter a valid"
	echo "ethernet driver, or 'quit' to end."
	echo "Strike ENTER when ready.\c"
	read toast < /dev/tty
    done

    #
    if [ -z "${DIDDOMAIN}" ] ; then
	getdomname
    fi

    if [ $drv = "slip" ] ; then
	getslipif
    else
	getipaddr
	getbroadaddr
	getnetmask
    fi

    #
    # Do configuration
    #
    echo "Configuring TCP/IP for $drv.  Please Wait."

    #
    # Determine node file
    #

    case $drv in
	pc586)
		IFCONFIG="	ifconfig en0 $IP -trailers $NETMASK $BROADCAST"
		NODE=$ND/pc586
		;;
	wdn)
		IFCONFIG="	ifconfig wdn$WDN_CNT $IP -trailers $NETMASK $BROADCAST"
		NODE=$ND/wdn$WDN_CNT
		;;
	ni5210)
		IFCONFIG="	ifconfig en0 $IP -trailers $NETMASK $BROADCAST"
		NODE=$ND/ni
		;;
	e3A)
		IFCONFIG="	ifconfig e3A$E3A_CNT $IP onepacket 512 3 -trailers $NETMASK $BROADCAST"
		NODE=$ND/e3A$E3A_CNT
		;;
	e3B)
		IFCONFIG="	ifconfig e3B$E3B_CNT $IP -trailers $NETMASK $BROADCAST"
		NODE=$ND/e3B$E3B_CNT
		;;
	nat)
		IFCONFIG="	ifconfig nat$NAT_CNT $IP -trailers $NETMASK $BROADCAST"
		NODE=$ND/nat$NAT_CNT
		;;
	wdt)
		IFCONFIG="	ifconfig wdt$WDT_CNT $IP -trailers $NETMASK $BROADCAST"
		NODE=$ND/wdt$WDT_CNT
		;;
	eth)
		IFCONFIG="	ifconfig eth$ETH_CNT $IP -trailers $NETMASK $BROADCAST"
		NODE=$ND/eth$ETH_CNT
		;;
	e3C)
		IFCONFIG="	ifconfig e3C$E3C_CNT $IP -trailers $NETMASK $BROADCAST"
		NODE=$ND/e3C$E3C_CNT
		;;
	slip)	if [ -n "$NETMASK" ] ; then
		    IFCONFIG="	NETMASK=\"$NETMASK\" /etc/slattach $SLIP_TTY $IP_SRC $IP_DST $BAUD"
		else
		    IFCONFIG="	/etc/slattach $SLIP_TTY $IP_SRC $IP_DST $BAUD"
		fi
		NODE=$ND/slip
		;;
	token)
	    	IFCONFIG="	ifconfig tok$TOK_CNT $IP -trailers $NETMASK $BROADCAST"
		    NODE=/$ND/tok$TOK_CNT
		;;
	*)
		echo "Unknown Driver.  Configuration Aborted"
		exit 1
		;;
    esac

    #
    # Determine whether nodes are cloning or not
    #

    if [ ! -f $NODE ]; then
	if [ $drv = "e3A" ] ; then
	echo "$drv$E3A_CNT is not installed on this system."
	elif [ $drv = "e3B" ] ; then
	echo "$drv$E3B_CNT is not installed on this system."
	elif [ $drv = "nat" ] ; then
	echo "$drv$NAT_CNT is not installed on this system."
	elif [ $drv = "wdt" ] ; then
	echo "$drv$WDT_CNT is not installed on this system."
	elif [ $drv = "eth" ] ; then
	echo "$drv$ETH_CNT is not installed on this system."
	elif [ $drv = "e3C" ] ; then
	echo "$drv$E3C_CNT is not installed on this system."
	elif [ $drv = "token" ] ; then
	echo "$drv$TOK_CNT is not installed on this system."
	elif [ $drv = "wdn" ] ; then
	echo "$drv[$WDN_CNT] is not installed on this system."
	else
	echo "$drv is not installed on this system."
	fi
	echo "Please install the driver and re-run $0"
	exit 1
    fi

    exec < $NODE
    read major node type minor 
    if [ $major = clone ]; then
	case $drv in
		e3A)
			OUTPUT="	cenetb ip /dev/$node e3A$E3A_CNT"
			E3A_CNT=`expr $E3A_CNT + 1`
			;;
		e3B)
			OUTPUT="	cenetb ip /dev/$node e3B$E3B_CNT"
			E3B_CNT=`expr $E3B_CNT + 1`
			;;
		nat)
			OUTPUT="	cenetb ip /dev/$node nat$NAT_CNT"
		        NAT_CNT=`expr $NAT_CNT + 1`
			;;
		wdt)
			OUTPUT="	cenetb ip /dev/$node wdt$WDT_CNT"
		        WDT_CNT=`expr $WDT_CNT + 1`
			;;
		eth)
			OUTPUT="	cenetb ip /dev/$node eth$ETH_CNT"
		        ETH_CNT=`expr $ETH_CNT + 1`
			;;
		e3C)
			OUTPUT="	cenetb ip /dev/$node e3C$E3C_CNT"
			E3C_CNT=`expr $E3C_CNT + 1`
			;;
		wdn)
			OUTPUT="	cenetb ip /dev/$node wdn$WDN_CNT"
			WDN_CNT=`expr $WDN_CNT + 1`
			;;
		slip)
			OUTPUT=
			;;
		token) 
			OUTPUT="	cenetb ip /dev/$node tok$TOK_CNT"
			TOK_CNT=`expr $TOK_CNT + 1`
			;;
		*)
			OUTPUT="	cenetb ip /dev/$node en0"
			;;
	esac
    else
	read major2 node2 type2 minor2
	case $drv in
		e3A)
			OUTPUT="	senet ip /dev/$node /dev/$node2 e3A$E3A_CNT"
			E3A_CNT=`expr $E3A_CNT + 1`
			;;
		e3B)
			OUTPUT="	senet ip /dev/$node /dev/$node2 e3B$E3B_CNT"
			E3B_CNT=`expr $E3B_CNT + 1`
			;;
		nat)
			OUTPUT="	senet ip /dev/$node /dev/$node2 nat$NAT_CNT"
		        NAT_CNT=`expr $NAT_CNT + 1`
			;;
		wdt)
			OUTPUT="	senet ip /dev/$node /dev/$node2 wdt$WDT_CNT"
		        WDT_CNT=`expr $WDT_CNT + 1`
			;;
		eth)
			OUTPUT="	senet ip /dev/$node /dev/$node2 eth$ETH_CNT"
		        ETH_CNT=`expr $ETH_CNT + 1`
			;;
		e3C)
			OUTPUT="	senet ip /dev/$node /dev/$node2 e3C$E3C_CNT"
			E3C_CNT=`expr $E3C_CNT + 1`
			;;
		wdn)
			OUTPUT="	senet ip /dev/$node /dev/$node2 wdn$WDN_CNT"
			WDN_CNT=`expr $WDN_CNT + 1`
			;;
		slip)
			OUTPUT=
			;;
		token)
			OUTPUT="	senet ip /dev/$node /dev/$node2 tok$TOK_CNT"
			TOK_CNT=`expr $TOK_CNT + 1`
			;;
		*)
			OUTPUT="	senet ip /dev/$node /dev/$node2 en0"
			;;
	esac
    fi


    #
    # Modify strcf
    #

    if [ -n "$OUTPUT" ] ; then
	ed -s /etc/strcf << TOAST > /dev/null
/	loopback/
i
$OUTPUT
.
w
q
TOAST
    fi

    #
    # Modify /etc/tcp
    #

    if [ -n "$IFCONFIG" ] ; then
	ed -s /etc/tcp << TOAST > /dev/null
/ifconfig/
a
$IFCONFIG
.
w
q
TOAST
    fi

    #
    # Modify /etc/default/tcp
    #
    ed -s /etc/default/tcp << TOAST > /dev/null
/^DOMAIN/
d
a
DOMAIN=$DOMAIN
.
w
q
TOAST

done		# end while true do

echo "TCP/IP Configuration Complete."
exit 0

[ RETURN TO DIRECTORY ]