#!/bin/sh
#
# Configure 1.74 1998/07/03 17:47:57
#
# The contents of this file are subject to the Mozilla Public License
# Version 1.0 (the "License"); you may not use this file except in
# compliance with the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS"
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
# the License for the specific language governing rights and
# limitations under the License.
#
# The initial developer of the original code is David A. Hinds
# <dhinds@hyper.stanford.edu>.  Portions created by David A. Hinds
# are Copyright (C) 1998 David A. Hinds.  All Rights Reserved.
#
#=======================================================================

fail ()
{
    echo ""
    echo "Configuration failed."
    echo ""
    exit 1
}

# Minimal requirements for sanity
if /bin/echo --version | grep -q -- -version ; then
    echo "Ack!  Your shell utilities are too old for this script!"
    echo "    Upgrade to GNU shell utilities version 1.16 or later."
    exit 1
fi
if [ ! -f src/Makefile ] ; then
    echo "Ack!  The distribution is incomplete/damaged!"
    echo "    Unpack again."
    exit 1
fi

if [ -r config.out ] ; then
    . ./config.out 2>/dev/null
else
    if [ ! -r config.in ] ; then
	echo "config.in does not exist!"
	fail
    fi
    . ./config.in
fi

#=======================================================================

PROMPT=y

arg () {
    VALUE="`echo X"$2" | sed -e 's/^X--[a-zA-Z_]*=//'`"
    eval $1=\"$VALUE\"
}

usage () {
    echo "usage: $0 [-n|--noprompt] [--kernel=src-dir] [--target=dir]"
    echo "    [--moddir=dir] [--cc=path] [--ld=path] [--debug=debug-flags]"
    echo "    [--{no}trust] [--{no}cardbus] [--current] [--srctree] [--manual]"
    exit 1
}

while [ $# -gt 0 ] ; do
    case "$1" in
    -n|--noprompt)	PROMPT=n		;;
    --kernel=*)		arg LINUX $1 		;;
    --target=*)		arg PREFIX $1		;;
    --moddir=*)		arg MODDIR $1		;;
    --cc=*)		arg CC "$1"		;;
    --ld=*)		arg LD "$1"		;;
    --debug=*)		arg PCDEBUG "$1"	;;
    --trust)		UNSAFE_TOOLS=y		;;
    --notrust)		UNSAFE_TOOLS=n		;;
    --cardbus)		CONFIG_CARDBUS=y	;;
    --nocardbus)	CONFIG_CARDBUS=n	;;
    --current)		CONF_SRC=1		;;
    --srctree)		CONF_SRC=2		;;
    --manual)		CONF_SRC=3		;;
    *)			usage			;;
    esac
    shift
done

#=======================================================================

CONFIG=config.new
CONFIG_MK=config.mk
MODVER=include/linux/modversions.h
mkdir -p include/linux
rm -f .prereq.ok $CONFIG $CONFIG_H $CONFIG_MK $MODVER
touch $CONFIG_MK

cat << 'EOF' > $CONFIG
#
# Automatically generated by 'make config' -- don't edit!
#
EOF

write_bool() {
    value=`eval echo '$'$1`
    if [ "$value" = "y" ] ; then
	echo "$1=y" >> $CONFIG
	echo "$1=y" >> $CONFIG_MK
    else
	echo "# $1 is not defined" >> $CONFIG
	echo "# $1 is not defined" >> $CONFIG_MK
    fi
}

write_str () {
    value=`eval echo '$'$1`
    echo "$1"=\"$value\" >> $CONFIG
    echo "$1=$value" >> $CONFIG_MK
}

prompt () {
    eval $3=\"$2\"
    if [ "$PROMPT" = "y" ] ; then
	/bin/echo -n "$1 [$2]: "
	read tmp
	if [ -n "$tmp" ] ; then eval $3=\"$tmp\" ; fi
    else
	/bin/echo "$1 [$2]"
    fi
}

ask_bool () {
    default=`eval echo '$'$2`
    if [ ! "$default" ] ; then default=n ; fi
    answer=""
    while [ "$answer" != "n" -a "$answer" != "y" ] ; do
	prompt "$1 (y/n)" "$default" answer
    done
    eval "$2=$answer"
    write_bool $2
}

ask_str () {
    default=`eval echo '$'$2`
    prompt "$1" "`echo $default`" answer
    eval $2=\"$answer\"
    write_str $2
}

#=======================================================================

echo ""
echo "Zero-Knowledge kernel shim build configuration"
echo ""
echo "The default responses for each question are correct for most users."
echo ""

ask_str "Linux source directory" LINUX

if [ ! -f $LINUX/Makefile ] ; then
    echo "Linux source tree $LINUX is incomplete or missing!"
    if [ -d $LINUX/include/linux ] ; then
	echo "    The kernel header files are present, but not " \
	     "the full source code."
    fi
    echo "    See the HOWTO for a list of FTP sites for current" \
	 "kernel sources."
    fail
fi

# What kernel are we compiling for?

version () {
    expr $1 \* 65536 + $2 \* 256 + $3
}

echo ""
for TAG in VERSION PATCHLEVEL SUBLEVEL EXTRAVERSION ; do
    eval `sed -ne "/^$TAG/s/[ 	]//gp" $LINUX/Makefile`
done
SRC_RELEASE=$VERSION.$PATCHLEVEL.$SUBLEVEL$EXTRAVERSION
VERSION_CODE=`version $VERSION $PATCHLEVEL $SUBLEVEL`
echo "The kernel source tree is version $SRC_RELEASE."
if [ $VERSION_CODE -lt `version 2 0 0` ] ; then
    echo "This package requires at least a 2.0 series kernel."
    fail
fi
CUR_RELEASE=`uname -r`
if [ "$SRC_RELEASE" != "$CUR_RELEASE" ] ; then
    echo "WARNING: the current kernel is actually version $CUR_RELEASE."
fi
ARCH=`uname -m | sed -e 's/i.86/i386/'`

# Check for consistent kernel build dates

CUR_D=`uname -v | sed -e 's/^#[0-9]* //;s/SMP //'`
CUR_D=`echo $CUR_D | sed -e 's/\(:[0-9][0-9]\) .* \([12][90]\)/\1 \2/'`
echo "The current kernel build date is $CUR_D."
UTS_VERSION="unknown";
if [ -f $LINUX/include/linux/compile.h ] ; then
    UTS_VERSION=`grep UTS_VERSION $LINUX/include/linux/compile.h |
	sed -e 's/.*"\(.*\)"/\1/'`
    SRC_D=`echo $UTS_VERSION | sed -e 's/^#[0-9]* //;s/SMP //'`
    SRC_D=`echo $SRC_D | sed -e 's/\(:[0-9][0-9]\) .* \([12][90]\)/\1 \2/'`
    if [ $SRC_RELEASE = $CUR_RELEASE -a "$SRC_D" != "$CUR_D" ] ; then
	echo "WARNING: the source tree has a build date of $SRC_D."
	if [ `date -d "$SRC_D" +%s` -gt `date -d "$CUR_D" +%s` ] ; then
	    echo "   Did you forget to install your new kernel?!?"
	fi
    fi
fi
echo ""

ask_str "Alternate target install directory" PREFIX
if [ ! "$MODDIR" ] ; then
    if [ -d /lib/modules/preferred ] ; then
	MODDIR=/lib/modules/preferred
    else
	MODDIR=/lib/modules/$SRC_RELEASE
    fi
else
    MODDIR=`echo $MODDIR | \
        sed -e "s/[0-9]\.[0-9]\.[0-9]*\(-[A-Za-z0-9]*\)*/$SRC_RELEASE/"`
fi
ask_str "  Module install directory" MODDIR

ask_str "C compiler name" CC

ask_str "Linker name" LD

ask_str "Compiler flags for debugging" PCDEBUG

echo ""
echo "The module needs to be compiled to match the kernel it"
echo "will be used with, or it may fail to load."
echo ""
echo "How would you like to set kernel-specific options?"
echo "    1 - Read from the currently running kernel"
echo "    2 - Read from the Linux source tree"

ans=""
while [ "$ans" != 1 -a "$ans" != 2  ] ; do
    prompt "Enter option (1-2)" "$CONF_SRC" ans
done
CONF_SRC=$ans
echo "CONF_SRC=$CONF_SRC" >> $CONFIG
echo ""

#=======================================================================

symcheck () {
    if $KSYMS | grep "$1" >/dev/null ; then
	eval "$2=y"
    else
	eval "$2=n"
    fi
}

# I can't _believe_ we have to check for Red Hat
rhcheck () {
    ZK_REDHAT=`cat /etc/redhat-release | sed -e 's/[a-zA-Z ]*\([0-9]*\).\([0-9]*\)[()A-Za-z ]*/\1\2/'`
    KERNEL_PATCH_LEVEL=`uname -r | sed -e 's/[0-9\.]*-\?\([0-9]\)*.*/\1/'`
    if [ "x$ZK_REDHAT" != "x" ] ; then
	write_str ZK_REDHAT
	write_str KERNEL_PATCH_LEVEL
    fi
}

modcheck () {
    if [ "$2" = "y" ] ; then return ; fi
    /sbin/insmod $1 > /dev/null 2>&1
    if /sbin/lsmod | grep -q "^$1 " ; then
	eval "$2=y"
	INSTALL_DEPMOD=y
    fi
}

configcheck () {
    if grep -q "^$1=y" $AUTOCONF ; then
	eval "$1=y"
    elif grep -q "^$1=m" $AUTOCONF ; then
	eval "$1=y"
	INSTALL_DEPMOD=y
    else
	eval "$1=n"
    fi
}

printflag() {
    value=`eval echo '$'$2`
    /bin/echo -n "    $1 is "
    if [ "$value" = "y" ] ; then
	echo "enabled."
    else
	echo "disabled."
    fi
    write_bool $2
}


printconfig () {
    echo "Kernel configuration options:"
    printflag "Symmetric multiprocessing support" CONFIG_SMP
    printflag "Advanced Power Management (APM) support" CONFIG_APM
    printflag "Networking support" CONFIG_INET
    printflag "Module version checking" CONFIG_MODVERSIONS
}

echo "" >> $CONFIG
echo "" >> $CONFIG_MK

case $CONF_SRC in
    1)
	if [ -x /sbin/ksyms ] ; then
	    KSYMS="/sbin/ksyms -a"
	else
	    echo "Hmmm... /sbin/ksyms is broken.  Using /proc/ksyms..."
	    KSYMS="cat /proc/ksyms"
	fi
	rhcheck
	echo "# Options from current kernel" >> $CONFIG
	echo "# Options from current kernel" >> $CONFIG_MK
	echo "CHECK=\"/proc/version\"" >> $CONFIG
	echo "CKSUM=\"`cksum < /proc/version`\"" >> $CONFIG
	symcheck smp_invalidate_needed CONFIG_SMP
	# No way to probe for this at the moment...
	CONFIG_MAX_MEMSIZE=1024
	symcheck apm_register_callback CONFIG_APM
	symcheck register_netdev CONFIG_INET
	symcheck inet_proto_ops CONFIG_IPV6_MODULE
	symcheck printk_R CONFIG_MODVERSIONS
	echo "Extracting kernel symbol versions..."
	echo "#ifndef __LINUX_MODVERSIONS_H" > $MODVER
	echo "#define __LINUX_MODVERSIONS_H" >> $MODVER
	$KSYMS | sed -ne 's/.* \(.*\)_R\([0-9a-f]*\)/\1 \2/p' | \
	    awk '{ printf "#define %s\t%s_R%s\n", $1, $1, $2 }' \
	    >> $MODVER
	echo "#endif" >> $MODVER
	printconfig
	;;
    2)
	AUTOCONF=$LINUX/.config
	if [ ! -r $AUTOCONF ] ; then
	    echo "Config file $AUTOCONF not present!"
	    echo "    To fix, run 'make config' in $LINUX."
	    fail
	fi
	rhcheck
	echo "# Options from $AUTOCONF" >> $CONFIG
	echo "# Options from $AUTOCONF" >> $CONFIG_MK
	echo "CHECK=\"$AUTOCONF\"" >> $CONFIG
	echo "CKSUM=\"`cksum < $AUTOCONF`\"" >> $CONFIG
	if grep "^ *SMP *= *1" $LINUX/Makefile >/dev/null ; then
	    CONFIG_SMP=y
	else
	    configcheck CONFIG_SMP
	fi
	if [ $VERSION_CODE -lt `version 2 1 7` ] ; then
	    configcheck CONFIG_BLK_DEV_IDE_PCMCIA
	fi
	for C in CONFIG_PCI CONFIG_APM CONFIG_SCSI \
	    CONFIG_INET CONFIG_NET_RADIO CONFIG_TR \
	    CONFIG_MODVERSIONS CONFIG_PROC_FS CONFIG_SERIAL ; do
	    configcheck $C
	done
	if [ $ARCH = "alpha" ] ; then
	    configcheck CONFIG_ALPHA_LCA
	fi
	if [ "$BIGMEM" ] ; then
	    configcheck CONFIG_1GB
	    configcheck CONFIG_2GB
	    configcheck CONFIG_3GB
	fi
	printconfig
	;;
    3)
	echo "# Configured manually" >> $CONFIG
	echo "# Configured manually" >> $CONFIG_MK
	echo "/* Configured manually */" >> $CONFIG_H
	ask_bool "Symmetric multiprocessing support" CONFIG_SMP
	ask_bool "PCI BIOS support" CONFIG_PCI
	tweak
	ask_bool "Advanced Power Management (APM) support" CONFIG_APM
	ask_bool "SCSI support" CONFIG_SCSI
	ask_bool "TCP/IP networking" CONFIG_INET
	ask_bool " Radio network interface support" CONFIG_NET_RADIO
	ask_bool " Token Ring device support" CONFIG_TR
	ask_bool "Set version information for module symbols" \
	    CONFIG_MODVERSIONS
	if [ $VERSION_CODE -lt `version 2 1 7` ] ; then
	    ask_bool "Include PCMCIA IDE device support" \
		CONFIG_BLK_DEV_IDE_PCMCIA
	fi
	if [ $ARCH = "alpha" ] ; then
	    ask_bool "DEC Alpha UDB target platform" CONFIG_ALPHA_LCA
	fi
	if [ "$BIGMEM" ] ; then
	    if [ ! "$MEMMAX" ] ; then MEMMAX=1GB ; fi
	    ans=""
	    while [ "$ans" != "1GB" -a "$ans" != "2GB" ] ; do
		prompt "Maximum physical memory (1GB, 2GB)" "$MEMMAX" ans
	    done
	    echo "MEMMAX=$MEMMAX" >> $CONFIG
	    if [ "$MEMMAX" = "1GB" ] ; then
		CONFIG_1GB=y ; CONFIG_2GB=n ; CONFIG_3GB=n
	    elif [ "$MEMMAX" = "2GB" ] ; then
		CONFIG_1GB=n ; CONFIG_2GB=y ; CONFIG_3GB=n
	    fi
	    write_bool CONFIG_1GB
	    write_bool CONFIG_2GB
	    write_bool CONFIG_3GB
	fi
	ask_bool "/proc filesystem support" CONFIG_PROC_FS
	;;
esac


ARCH=`uname -m`
echo "ARCH=$ARCH" >> $CONFIG_MK

if [ $CONF_SRC != "1" -a "$CONFIG_MODVERSIONS" = "y" ] ; then
    MODVER="$LINUX/$MODVER"
    if [ ! -r $MODVER ] ; then
	echo "$MODVER does not exist!"
	echo "    To fix, run 'make dep' in $LINUX."
	fail
    fi
else
    MODVER="../$MODVER"
fi

if [ "$CONFIG_MODVERSIONS" = "y" ] ; then
    echo "MFLAG=-DMODVERSIONS -include $MODVER" >> $CONFIG_MK
fi

if [ ! -r $LINUX/include/asm ] ; then
    echo "$LINUX/include/asm does not exist!"
    echo "    To fix, do 'ln -s asm-$ARCH asm' in $LINUX/include."
    fail
fi

if [ "$CONFIG_SMP" = "y" ] ; then
    echo "#define __SMP__ 1" >> $CONFIG_H
fi

echo "" >> $CONFIG
echo "" >> $CONFIG_MK

#=======================================================================

if [ $CONF_SRC -eq 1 ] ; then UTS_VERSION=`uname -v` ; fi


if [ $VERSION_CODE -ge `version 2 0 6` ] ; then
    NEW_QLOGIC=y
fi
if [ $VERSION_CODE -ge `version 2 1 31` -a \
     $VERSION_CODE -le `version 2 1 34` ] ; then
    echo "Kernel versions 2.1.31-33 are broken.  Upgrade to 2.1.34."
    fail
fi
if [ $VERSION_CODE -ge `version 2 1 90` -a \
     $VERSION_CODE -le `version 2 1 102` ] ; then
    echo "Kernel versions 2.1.90-2.1.102 are broken.  Upgrade to 2.2."
    fail
fi
if [ "$CONFIG_CARDBUS" = "y" -a \
     $VERSION_CODE -ge `version 2 1 90` ] ; then
    if [ $VERSION_CODE -lt `version 2 1 125` -o \
	 $VERSION_CODE -ge `version 2 1 132` ] ; then
	DO_APA1480=y
    fi
fi


UTS_RELEASE=$SRC_RELEASE
UTS_SHORT=$VERSION.$PATCHLEVEL
write_str UTS_SHORT
write_str UTS_RELEASE
write_str UTS_VERSION
echo "LINUX_VERSION_CODE=$VERSION_CODE" >> $CONFIG
echo "LINUX_VERSION_CODE=$VERSION_CODE" >> $CONFIG_MK

echo "" >> $CONFIG
echo "" >> $CONFIG_MK
echo ""


if [ $VERSION_CODE -ge `version 2 1 7` -o \
     "$CONFIG_BLK_DEV_IDE_PCMCIA" = "y" ] ; then
    echo "DO_IDE=y" >> $CONFIG_MK
fi

if [ $VERSION_CODE -ge `version 2 2 0` -a \
     $VERSION_CODE -lt `version 2 3 6` ] ; then
    echo "DO_PARPORT=y" >> $CONFIG_MK
fi


#=======================================================================

# Check out the module stuff

if [ ! -x /sbin/insmod -o ! -x /sbin/rmmod -o ! -x /sbin/lsmod ] ; then
    echo "Your module utilities (insmod, rmmod) are missing from /sbin!"
    echo "    To fix, you should build and install the latest set" \
         "of module tools,"
    echo "    available from FTP sites listed in the HOWTO."
    fail
fi

MOD_RELEASE=`/sbin/insmod -V 2>&1 | \
    sed -n -e 's/.*[Vv]ersion \([0-9][0-9.]*[0-9]\).*/\1/p'`
echo "Your module utilities are version $MOD_RELEASE."
X=`echo $MOD_RELEASE | sed -e 's/\./ /g'`
MOD_CODE=`version $X`
if [ $VERSION_CODE -ge `version 2 1 85` ] ; then
    NEED=`version 2 1 85` ; T=2.1.85
elif [ $VERSION_CODE -ge `version 2 1 18` ] ; then
    NEED=`version 2 1 23` ; T=2.1.23
else
    NEED=`version 2 0 0` ; T=2.0.0
fi

if [ $NEED -gt $MOD_CODE ] ; then
    echo "Your module utilities are too old for this kernel!"
    echo "    To fix, upgrade to at least version $T."
    fail
fi

#=======================================================================

# Is the boot setup OK?

if [ "$PREFIX" = "" ] ; then
    if [ -f /etc/lilo.conf -a -f /boot/map ] ; then
	if [ /vmlinuz -nt /boot/map ] ; then
	    echo "Your boot map file is older than /vmlinuz. "\
		 "If you installed /vmlinuz"
	    echo "by hand, please run 'lilo' to update your boot"\
		 "data, and then reboot."
#	else
#	    echo "Your 'lilo' installation appears to be OK."
	fi
    else
	echo "It doesn't look like you are using 'lilo'."
    fi
fi

#=======================================================================

# How should the startup scripts be configured?

echo ""


#=======================================================================


mv $CONFIG config.out

touch .prereq.ok

echo ""
echo "Configuration successful."
echo ""
