#! /bin/sh

trap "rm -f tmp*; exit 0" 0
trap "rm -f tmp*; exit 1" 1 2 3 15

die()
{
    echo "$*"
    exit 1
}

yorn()
{
    while :
    do
        read ans

	case "${ans:-$1}" in
	[Yy]*)	return 0
		;;
	[Nn]*)	return 1
		;;
	*)	nonl "Please respond 'Y' or 'N': "
		;;
	esac
    done
}

find_exe()
{
for i in `echo $PATH |
	  sed -e 's/^:/.:/' \
		  -e 's/::/:.:/g' \
		  -e 's/:$/:./' \
		  -e 's/:/ /g`
do
	if [ -x "$i/$1" ]
	then
		return 0
	fi
done
return 1
}

case `echo -n` in
-n)	nonl() { echo "$*\c"; };;
*)	nonl() { echo -n "$*"; };;
esac

echo
echo "XC Configuration Utility -- written by lar3ry gensch, ESQ"
echo
echo "When a default answer is suggested [in brackets],"
echo "you may accept it by just hitting <ENTER>."
echo

need_answers=true

if [ -f configure.out ]
then
    echo "Configure has already been run."
    nonl "Do you wish to use the previous results? (Y/N) [N]: "
    if yorn N
    then
		. ./configure.out
		need_answers=false
    fi
fi

if $need_answers
then
    UUCPLIBDIR=/usr/lib/uucp

    if [ ! -d "$UUCPLIBDIR" ]
    then
		echo "*** Warning:  Cannot determine UUCP lib directory"
		echo "***           Using $UUCPLIBDIR"
		echo
    fi

    if [ -f $UUCPLIBDIR/ungetty -a -f /xenix ]
    then
		DIDO="2"	
    elif [ -d /var/spool/locks -a -f /usr/include/sys/mkdev.h ]
    then
		DIDO="4"
    elif [ -f /unix ]
    then
		DIDO="3"
    else
		DIDO="0"
    fi

    echo
    echo "Determining compile environment..."

    CC=""
    COPTS=""

	while :
	do
		if find_exe gcc
		then
			CC=gcc
			COPTS="-O2"
		elif find_exe cc
		then
			CC=cc
			COPTS="-O"
		else
			CC=""
		fi

		nonl "C compiler to use [${CC}]: "
		read cc

		[ -n "$cc" ] && CC="$cc"

		if find_exe $CC
		then
		   break
		fi
	done

    echo
    echo "C Compiler is $CC"

    default="$COPTS"
    while :
    do
		echo
		nonl "Enter compiler options [$default]: "
		read ans

		[ -n "$ans" ] && COPTS="$ans"

		echo "main() { }" >tmp.c
		$CC $COPTS tmp.c -o tmp >/dev/null 2>&1 && break

		echo "Those options don't seem quite right... try again."
    done

	echo
	echo "Determining where to find screen control functions..."

	echo "main() { tgetent(); }" >tmp.c
	for LDFLAGS in -ltermcap -ltinfo -lcurses ""
	do
		$CC tmp.c -o tmp $LDFLAGS >/dev/null 2>&1 && break
	done
		
	if [ ! $LDFLAGS ]
	then
		echo
		echo "*** We tried -ltermcap, -ltinfo, and -lcurses without success."
		while :
		do
			nonl "Enter a '-lLIB' option for a screen control library: "
			read LDFLAGS

			$CC tmp.c -o tmp $LDFLAGS >/dev/null 2>&1 && break

			echo "That isn't finding the tgetent() function... try again."
			echo
		done
	fi

    if [ -f /lib/libc_s.a -o -f /usr/lib/libc_s.a ]
    then
		LDFLAGS="$LDFLAGS -lc_s"
    fi

	echo
    echo "LDFLAGS = $LDFLAGS"

    echo
    echo "Checking run time library for functions..."

    eval `for i in "dup2(i,j)" \
		   "memset(s,c,i)" \
		   "strchr(s,c)" \
		   "strrchr(s,c)" \
		   "strdup(s)" \
		   "strstr(s,t)"
    do
		funct=\`echo "$i" | sed 's/(.*$//'\`

		cat >tmp.c <<!
int i,j;
char *s,*t;
char c;
main() { $i; }
!

		$CC $COPTS -o tmp tmp.c $LDFLAGS >/dev/null 2>&1 || rm -f tmp
		if [ -f tmp ]
		then
			val="1"
			echo "    $funct was found" 1>&2
		else
			val="0"
			echo "    $funct was not found" 1>&2
		fi

		rm -f tmp*
		echo "have_${funct}=$val"
    done`

    echo
    echo "Checking <sys/types.h> for typedefs..."

    eval `for i in pid_t ulong unchar ushort
    do
		if [ ! -f /usr/include/sys/types.h ]
		then
			echo "have_$i=false"
			continue
		fi

		cat >tmp.c <<!
#include <sys/types.h>
$i foo;
!

		$CC $COPTS -c tmp.c >/dev/null 2>&1
		if [ -f tmp.o ]
		then
			val=1
			echo "    $i was found" 1>&2
		else
			val=0
			echo "    $i was not found" 1>&2
		fi

		echo "have_$i=$val"
		rm -f tmp*
    done`

    echo
    echo "XC Local Configuration Section"

    while :
    do
		nonl "Enter user name to own xc [uucp]: "

		read ans

		OWNER="${ans:-uucp}"

		case "$OWNER" in
		*:*)	echo "Invalid user name"
			;;
		*)	grep "^${OWNER}:" /etc/passwd >/dev/null 2>&1 && break
			echo "User $OWNER not found in /etc/passwd"
			;;
		esac
    done

    while :
    do
		nonl "Enter group name to own xc [uucp]: "

		read ans

		GROUP="${ans:-uucp}"

		case "$GROUP" in
		*:*)	echo "Invalid group name"
			;;
		*)	grep "^${GROUP}:" /etc/group >/dev/null 2>&1 && break
			echo "Group $GROUP not found in /etc/group"
		;;
		esac
    done

    while :
    do
		nonl "Enter permissions for xc executable [4755]: "

		read ans

		BINMODE="${ans:-4755}"

		case "$BINMODE" in
		[0-1][0-7][0-7][0-7]|[0-7][0-7][0-7])
			echo "*** Warning permissions are not SUID or SGID"
			INSTALL="install"
			break
			;;

		[2-7][0-7][0-7][0-7])
			INSTALL="install.suid"
			INSTPREF="su to 'root', and then "
			break
			;;
		*)	echo "Invalid permissions"
			;;
		esac
    done

    echo

    MDIR=""
    MANDIR=""
    MANEXT=""

    for i in /usr/local/man /usr/catman /usr/man
    do
        if [ -d "$i" ]
	then
	    MANDIR=$i
	    break
	fi
    done

    if [ -z "$MANDIR" ]
    then
		echo "*** Warning:  Cannot determine MANDIR"
		echo "              Using /usr/man/mann"
		MANDIR=/usr/man
		MDIR=mann
		MANEXT=n
	else
        eval `for i in cat man
		do
			for j in n l 1 L LOCAL
			do
				dir=${i}${j}
				if [ -d "$MANDIR/$dir" ]
				then
					echo MDIR=$dir
					echo MANEXT=$j
					break 2
				fi
				dir=${i}.${j}
				if [ -d "$MANDIR/$dir" ]
				then
					echo MDIR=$dir
					echo MANEXT=$j
					break 2
				fi
			done
		done`

		if [ -z "$MDIR" ]
		then
			echo "*** Warning: Could not locate online man pages"
			MDIR=mann
			MANEXT=n
		fi
    fi

    echo "Using MANDIR $MANDIR/$MDIR ..."
    echo

    case "$MDIR" in
    cat*)	CATMAN=true
		;;
    *)		CATMAN=false
		;;
    esac

    default=""
	for i in /usr/local/bin /pub/bin /usr/lbin /usr/bin/local /u/bin
	do
		if [ -d "$i" ]
		then
			default="$i"
			break
		fi
	done

    while :
    do
		nonl "Enter installation directory [$default]: "
		read ans

		INSDIR="${ans:-$default}"

		case "$INSDIR" in
		/*)	[ -d "$INSDIR" ] && break
			echo "Directory $ans was not found"
			;;
		*)	echo "Directory $ans is not an absolute path"
			;;
		esac
	done

    echo
    nonl "Do you wish to add DEBUG code into XC? (Y/N) [Y]: "
    if yorn Y
	then
		DEBUG="1"
    else
		DEBUG="0"
    fi

    echo
    nonl "Do you wish to disallow shell escapes? (Y/N) [N]: "

    if yorn N
	then
		NOSHELL="1"
    else
		NOSHELL="0"
    fi

    echo
    nonl "Does dropping carrier cause your modem to hang up? (Y/N) [Y]: "

    if yorn Y
	then
		DTR_DROPS_CARRIER="1"
    else
		DTR_DROPS_CARRIER="0"
    fi

    default=""
    for i in /usr/local/lib /usr/lib/local /usr/lib /u/lib
    do
        if [ -d "$i" ]
	then
	    default="$i/xc"
	    break
	fi
    done

    echo
    while :
    do
		nonl "Enter default XC data file directory [$default]: "

		read ans

		LIBDIR=${ans:-$default}

		case "$LIBDIR" in
		/*)	[ -d "$LIBDIR" ] && break
			parent=`dirname $LIBDIR`
			[ -d "$parent" -a ! -f $LIBDIR ] && break
			if [ -d "$parent" ]
			then
				echo "$LIBDIR is not a directory"
			else
				echo "Parent directory $parent not found"
			fi
			;;
		*)	echo "Directory $LIBDIR is not an absolute path"
			;;
		esac
	done

    DATE=`date`
	USER=`id | sed -e 's/[^(]*(//' -e s'/).*$//'`

    cat >./configure.out <<!
BINMODE="$BINMODE"
CATMAN="$CATMAN"
CC="$CC"
COPTS="$COPTS"
DATE="$DATE"
DEBUG="$DEBUG"
DIDO="$DIDO"
DTR_DROPS_CARRIER="$DTR_DROPS_CARRIER"
GROUP="$GROUP"
have_dup2="$have_dup2"
have_memset="$have_memset"
have_pid_t="$have_pid_t"
have_strchr="$have_strchr"
have_strdup="$have_strdup"
have_strrchr="$have_strrchr"
have_strstr="$have_strstr"
have_ulong="$have_ulong"
have_unchar="$have_unchar"
have_ushort="$have_ushort"
INSDIR="$INSDIR"
INSTALL="$INSTALL"
INSTPREF="$INSTPREF"
LDFLAGS="$LDFLAGS"
LIBDIR="$LIBDIR"
MANDIR="$MANDIR"
MANEXT="$MANEXT"
MDIR="$MDIR"
NOSHELL="$NOSHELL"
OWNER="$OWNER"
USER="$USER"
!
fi

set -e

echo
echo "Creating xc.h ..."

sed "
s;{{DATE}};$DATE;g
s;{{DEBUG}};$DEBUG;g
s;{{DIDO}};$DIDO;g
s;{{DTR_DROPS_CARRIER}};$DTR_DROPS_CARRIER;g
s;{{HAVE_DUP2}};$have_dup2;g
s;{{HAVE_MEMSET}};$have_memset;g
s;{{HAVE_PID_T}};$have_pid_t;g
s;{{HAVE_STRCHR}};$have_strchr;g
s;{{HAVE_STRDUP}};$have_strdup;g
s;{{HAVE_STRRCHR}};$have_strrchr;g
s;{{HAVE_STRSTR}};$have_strstr;g
s;{{HAVE_ULONG}};$have_ulong;g
s;{{HAVE_UNCHAR}};$have_unchar;g
s;{{HAVE_USHORT}};$have_ushort;g
s;{{LIBDIR}};$LIBDIR;g
s;{{NOSHELL}};$NOSHELL;g
s;{{USER}};$USER;g
" xc.h.in >xc.h

echo
echo "Creating Makefile.xc ..."

sed "
s;{{BINMODE}};$BINMODE;g
s;{{CATMAN}};$CATMAN;g
s;{{CC}};$CC;g
s;{{COPTS}};$COPTS;g
s;{{DATE}};$DATE;g
s;{{GROUP}};$GROUP;g
s;{{INSDIR}};$INSDIR;g
s;{{INSTALL}};$INSTALL;g
s;{{INSTPREF}};$INSTPREF;g
s;{{LDFLAGS}};$LDFLAGS;g
s;{{LIBDIR}};$LIBDIR;g
s;{{MANDIR}};$MANDIR;g
s;{{MANEXT}};$MANEXT;g
s;{{MDIR}};$MDIR;g
s;{{OWNER}};$OWNER;g
s;{{USER}};$USER;g
" Makefile.in >Makefile.xc

echo
echo "XC Configuration is now complete..."

exit 0
