#!/bin/sh
#
# $Id$
# A script to build the AFS kernel module

usage() {
    echo "Usage: $0 [ -n ] [ -k KERNVERS ]"
    echo "       -k   Build module for kernel version KERNVERS instead of"
    echo "            currently running kernel (from uname -r)"
    echo "       -n   Run without any user interaction"
    exit 255
}


opt_noninter=0
while getopts ":nk:" opt; do
  case $opt in
      k)
	  kvers=$OPTARG
	  ;;
      n) 
	  opt_noninter=1
	  ;;
      *)
	  usage
	  ;;
  esac
done

setuproot=/opt/mit-openafs-setup
config=$setuproot/etc/setup.config
funcs=$setuproot/lib/functions.sh

if [ -r $config ]; then
    source $config
else
    echo "ERROR: Unable to read $config"
    exit 1
fi

if [ -r $funcs ]; then
    source $funcs
else
    echo "ERROR: Unable to read $funcs"
    exit 1
fi

[ -z "$kvers" ] && kvers=`uname -r`

kernhead=/lib/modules/$kvers/build
moddir=/lib/modules/$kvers/kernel/extra/openafs
logfile=/opt/mit-openafs-setup/log/openafs-build-log.$$
afsver=`rpm -q --qf "%{VERSION}" openafs-kernel-source`
if [ $? != 0 ]; then
    output "ERROR: The openafs-kernel-source package does not appear to be installed."
    exit 1
fi

case $kvers in
    2.6*)
	ksrcrpm=devel
	modext=.ko
	;;
    2.4*)
	ksrcrpm=source
	modext=.o
	;;
    *)
	output "Unsupported kernel version: $kvers"
	exit 1
	;;
esac
case $kvers in 
    *smp)
	kbaserpm=kernel-smp
	pkvers=`echo $kvers | sed -e 's/smp//g'`
	if [ $modext = .ko ]; then
	    modext=.mp.ko
	fi
	;;
    *hugemem)
	kbaserpm=kernel-hugemem
	pkvers=`echo $kvers | sed -e 's/hugemem//g'`
	;;
    *)
	kbaserpm=kernel
	pkvers=$kvers
	;;
esac
ksrcrpm=$kbaserpm-$ksrcrpm-$pkvers
rpm --quiet -q $ksrcrpm
if [ $? != 0 ]; then
    output "The $ksrcrpm package is required to build the AFS kernel"
    output "module.  Please install this package and try again."
    exit 1
fi
rpm --quiet -q gcc
if [ $? != 0 ]; then
    output "You do not appear to have a C compiler (such as gcc) installed."
    output "A C compiler is required."
    exit 1
fi
if [ -f $moddir/openafs$modext ]; then
    echo "There already appears to be a module for that kernel."
    if [ $opt_noninter -ne 1 ]; then
	echo -n "Replace it? (y/n) "
	read answer
	case $answer in 
	    y|Y)
		;;
	    n|N)
		exit 0;
		;;
	    *)
		echo "Invalid response, assuming 'n'"
		exit 0;
		;;
	esac
    else
	exit 1
    fi
fi

echo "Beginning module build at "`date` > $logfile
output "Building AFS kernel module..."
output "   for kernel $kvers"
output "   results will be logged to $logfile"
if [ ! -d /usr/src/openafs-kernel-${afsver}/src ]; then
    output "Please check that the openafs-kernel-source package is installed."
    exit 1
fi
cd /usr/src/openafs-kernel-${afsver}/src
cd src/libafs
if [ -f Makefile ]; then
    output "   cleaning previous build..."
    echo "############   CLEAN   #############" >> $logfile
    make clean >> $logfile 2>&1
fi
cd /usr/src/openafs-kernel-${afsver}/src
output "   configuring..."
echo "############ CONFIGURE #############" >> $logfile
./configure --with-linux-kernel-headers=$kernhead >> $logfile 2>&1
if [ $? != 0 ]; then
    output "AFS kernel module configuration failed."
    output "Please see $logfile for more information."
    exit 1
fi
output "   compiling... (this can take a long time - please be patient)"
echo "############ MAKE #############" >> $logfile
make >> $logfile 2>&1
if [ $? != 0 ]; then
    output "AFS kernel module compilation failed."
    output "Please see $logfile for more information."
    exit 1
fi
echo "############ INSTALL #############" >> $logfile
modname=libafs-${kvers}$modext
mod=`find src/libafs/ -name $modname`
if [ ! -f "$mod" ]; then
    output "Could not find libafs, trying openafs..."
    modname=openafs$modext
    mod=`find src/libafs/ -name $modname`
fi
if [ -f "$mod" ]; then
    mkdir -p $moddir
    output "Copying module..."
    cp -fv $mod $moddir/openafs$modext >> $logfile 2>&1
    if [ $? != 0 ]; then
	output "Failed to copy module."
	exit 1
    fi
else
    output "The module compiled, however I could not locate the module to copy it to the kernel modules directory."
    exit 1
fi
/sbin/depmod -a
/sbin/modprobe -nq openafs 2>/dev/null
if [ $? = 0 ]; then
    output "Module installed succesfully."
else
    output "modprobe was still unable to locate the module."
    exit 1
fi

exit 0
