:
#	@(#)kit:sco/inst_em.100/source/usr/lib/lli/make-tcp
#	Copyright (c) 1993  Cogent Data Technologies, Inc.
#	All Rights Reserved
#
#	eMaster+ (MCA/ATS/EISA/EISA XL) tcp configuration script V.1.00
#
ND=/etc/conf/node.d
EMA_CNT=0
EMB_CNT=0
EMC_CNT=0
EMD_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 = "emA" ] ; then
	BADDR_PROMPT="\nInterface $drv$EMA_CNT broadcast address [$BROAD_ADDR]: \c"
	elif [ $drv = "emB" ] ; then
	BADDR_PROMPT="\nInterface $drv$EMB_CNT broadcast address [$BROAD_ADDR]: \c"
	elif [ $drv = "emC" ] ; then
	BADDR_PROMPT="\nInterface $drv$EMC_CNT broadcast address [$BROAD_ADDR]: \c"
	elif [ $drv = "emD" ] ; then
	BADDR_PROMPT="\nInterface $drv$EMD_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			;;
		*)	echo "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 = "emA" ] ; then
	    NM_PROMPT="\nInterface $drv$EMA_CNT netmask [$DEF_MASK]: \c"
	elif [ $drv = "emB" ] ; then
	    NM_PROMPT="\nInterface $drv$EMB_CNT netmask [$DEF_MASK]: \c"
	elif [ $drv = "emC" ] ; then
	    NM_PROMPT="\nInterface $drv$EMC_CNT netmask [$DEF_MASK]: \c"
	elif [ $drv = "emD" ] ; then
	    NM_PROMPT="\nInterface $drv$EMD_CNT 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 = "emA" ] ; then
	    IP_PROMPT="\nInterface $drv$EMA_CNT IP address [$DEF_IP_ADDR]: \c"
	elif [ $drv = "emB" ] ; then
	    IP_PROMPT="\nInterface $drv$EMB_CNT IP address [$DEF_IP_ADDR]: \c"
	elif [ $drv = "emC" ] ; then
	    IP_PROMPT="\nInterface $drv$EMC_CNT IP address [$DEF_IP_ADDR]: \c"
	elif [ $drv = "emD" ] ; then
	    IP_PROMPT="\nInterface $drv$EMD_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

	    # if entries exists in /etc/hosts, add entry and warn user
	    if grep "[ 	]$HOSTNAME[	]" /etc/hosts > /dev/null 2>&1 \
	    || grep "[ 	]$HOSTNAME$" /etc/hosts > /dev/null 2>&1 \
	    || grep "[ 	]$FULLNAME[ 	]" /etc/hosts > /dev/null 2>&1 \
	    || grep "[ 	]$FULLNAME$" /etc/hosts > /dev/null 2>&1
	    then
	    echo "WARNING: The selected value:"
	    echo "\t$IP\t$HOSTNAME $FULLNAME"
	    echo "may conflict with other entries in /etc/hosts."
	    echo "Edit /etc/hosts to resolve conflicts."
	    sleep 2
	    fi

	    echo "Adding host $FULLNAME to /etc/hosts"
	    /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
[ -d /usr/lib/lli/emA ] && DRVLIST=" emA "
[ -d /usr/lib/lli/emB ] && DRVLIST="$DRVLIST emB "
[ -d /usr/lib/lli/emC ] && DRVLIST="$DRVLIST emC "
[ -d /usr/lib/lli/emD ] && DRVLIST="$DRVLIST emD "

tput clear
echo "\t\t\tTCP/IP Ethernet Driver Configuration"
while true ; do
    while true ; do
	    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

	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
	emA)
		IFCONFIG="	ifconfig emA$EMA_CNT $IP -trailers $NETMASK $BROADCAST"
		TESTIF="ifconfig emA$EMA_CNT"
		NODE=$ND/emA$EMA_CNT
		;;
	emB)
		IFCONFIG="	ifconfig emB$EMB_CNT $IP onepacket 512 3 -trailers $NETMASK $BROADCAST"
		TESTIF="ifconfig emB$EMB_CNT"
		NODE=$ND/emB$EMB_CNT
		;;
	emC)
		IFCONFIG="	ifconfig emC$EMC_CNT $IP -trailers $NETMASK $BROADCAST"
		TESTIF="ifconfig emC$EMC_CNT"
		NODE=$ND/emC$EMC_CNT
		;;
	emD)
		IFCONFIG="	ifconfig emD$EMD_CNT $IP -trailers $NETMASK $BROADCAST"
		TESTIF="ifconfig emD$EMD_CNT"
		NODE=$ND/emD$EMD_CNT
		;;
	*)
		echo "Unknown Driver.  Configuration Aborted"
		exit 1
		;;
    esac

    #
    # Determine whether nodes are cloning or not
    #

    if [ ! -f $NODE ]; then
	if [ $drv = "emA" ] ; then
	echo "$drv$EMA_CNT is not installed on this system."
	elif [ $drv = "emB" ] ; then
	echo "$drv$EMB_CNT is not installed on this system."
	elif [ $drv = "emC" ] ; then
	echo "$drv$EMC_CNT is not installed on this system."
	elif [ $drv = "emD" ] ; then
	echo "$drv$EMD_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 
    echo Adding $node
    if [ $major = clone ]; then
	TESTCF="cenetb ip \\/dev\\/$node"
	case $drv in
		emA)
			OUTPUT="	cenetb ip /dev/$node emA$EMA_CNT"
			EMA_CNT=`expr $EMA_CNT + 1`
			;;
		emB)
			OUTPUT="	cenetb ip /dev/$node emB$EMB_CNT"
			EMB_CNT=`expr $EMB_CNT + 1`
			;;
		emC)
			OUTPUT="	cenetb ip /dev/$node emC$EMC_CNT"
			EMC_CNT=`expr $EMC_CNT + 1`
			;;
		emD)
			OUTPUT="	cenetb ip /dev/$node emD$EMD_CNT"
			EMD_CNT=`expr $EMD_CNT + 1`
			;;
		*)
			OUTPUT="	cenetb ip /dev/$node en0"
			;;
	esac
    else
	read major2 node2 type2 minor2
	TESTCF="senetb ip \\/dev\\/$node"
	case $drv in
		emA)
			OUTPUT="	senet ip /dev/$node /dev/$node2 emA$EMA_CNT"
			EMA_CNT=`expr $EMA_CNT + 1`
			;;
		emB)
			OUTPUT="	senet ip /dev/$node /dev/$node2 emB$EMB_CNT"
			EMB_CNT=`expr $EMB_CNT + 1`
			;;
		emC)
			OUTPUT="	senet ip /dev/$node /dev/$node2 emC$EMC_CNT"
			EMC_CNT=`expr $EMC_CNT + 1`
			;;
		emD)
			OUTPUT="	senet ip /dev/$node /dev/$node2 emD$EMD_CNT"
			EMD_CNT=`expr $EMD_CNT + 1`
			;;
		*)
			OUTPUT="	senet ip /dev/$node /dev/$node2 en0"
			;;
	esac
    fi


    #
    # Modify strcf
    #

    if [ -n "$OUTPUT" ] ; then
	sed -e "/$TESTCF/d" /etc/strcf > /tmp/bog$$
	cp /tmp/bog$$ /etc/strcf
	rm -f /tmp/bog$$
	ed -s /etc/strcf << TOAST > /dev/null
/	loopback/
i
$OUTPUT
.
w
q
TOAST
    fi

    #
    # Modify /etc/tcp
    #

    if [ -n "$IFCONFIG" ] ; then
	sed -e "/$TESTIF/d" /etc/tcp > /tmp/bog$$
	cp /tmp/bog$$ /etc/tcp
	rm -f /tmp/bog$$
	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
