#!/bin/bash

function printhelp () 
{
	echo "Usage: sys_uname [-h] [OPTIION] [ -- module_path ]"
	echo "Prints kernel version string for modules"
	echo
	echo "  -h    Print this help"
	echo "  -f    Choose closest kernel"
	echo "  -l    List available kernels"
	echo "  -e    Try to find an exact match"
	echo "  -p    Print version string for the running kernel"
	exit 1
}
[ "$1" == "--help" ] && printhelp 1>&2


###########################################################
# Parse options
###########################################################

while getopts "hflep" x ; do
    WORKED=1
    case "$x" in
	p) PRINT_THIS_UNAME=Y ;;
	f) FIND_CLOSEST=Y ;;
	l) FIND_AVAIL=Y ;;
	e) FIND_EXACT=Y ;;
	h|*) printhelp ; exit 1 ;;
    esac
done
[ "$WORKED" != 1 ] && PRINT_THIS_UNAME=Y

shift `expr $OPTIND - 1`

[ $# == 0 ] && { printhelp 1>&2 ; exit 1; }
MOD_PATH=$1

###########################################################
# Determine the version string of the running kernel
###########################################################

SMP=""
ALTIVEC=""
cat /proc/version | grep SMP > /dev/null 
[ $? == 0 ] && SMP="-smp"
cat /proc/ksyms | grep altivec > /dev/null 
[ $? != 0 ] && ALTIVEC="-noav"

THIS_UNAME=`uname -r`$SMP$ALTIVEC


###########################################################
# Find all...
###########################################################

function find_avail () 
{
    cd $MOD_PATH
    _AVAIL=`find ./ -type d -exec test -f '{}/mol.o' \; -print`

    [ "$_AVAIL" == "" ] && {
	echo "No MOL-modules seems to be available (looked in `pwd`)"
	exit 1
    } 1>&2

    for x in $_AVAIL ; do
	echo $x | sed s/\.[/]//
    done
}


###########################################################
# Do it...
###########################################################

[ "$PRINT_THIS_UNAME" == Y ] && {
    echo $THIS_UNAME
}
[ "$FIND_EXACT" == Y ] && {
    [ -f $MOD_PATH/$THIS_UNAME/mol.o ] && { 
	echo $THIS_UNAME
	exit 0
    }
    exit 1
}
[ "$FIND_AVAIL" == Y ] && {
    find_avail
}
[ "$FIND_CLOSEST" == Y ] && {
    $MOL_BINLIB_DIR/bin/kver_approx $THIS_UNAME `find_avail`
    exit $?
}
exit 0
