1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
|
#!/bin/bash
#
# BE CAREFUL! THIS SCRIPT IS INVOKED FROM A SETUID ROOT BINARY
#
function printhelp () {
echo "Usage: sys_uname [-h] [OPTION] [ -- mod_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 -a "$FIND_CLOSEST$FIND_AVAIL$FIND_EXACT" ] && {
printhelp 1>&2 ; exit 1;
}
MOD_PATHS=""
for x in $* ; do
# Only include a directory once
for y in $MOD_PATHS ; do
[ $x = $y -o $x -ef $y ] && x="" ; break
break;
done
MOD_PATHS="$MOD_PATHS $x"
done
###########################################################
# Determine the version string of the running kernel
###########################################################
# do not bother about smp or altivec
THIS_UNAME=`uname -r`
###########################################################
# Find all...
###########################################################
function find_avail () {
for x in $MOD_PATHS ; do
test -d $x || continue;
cd $x || continue;
_AVAIL=`find $x -maxdepth 1 -type d -exec test -f '{}/mol.o' -o -f '{}/mol.ko' \; -print`
for x in $_AVAIL ; do
echo $x
done
done
}
###########################################################
# Do it...
###########################################################
[ "$PRINT_THIS_UNAME" ] && {
echo $THIS_UNAME
exit 0
}
[ "$FIND_EXACT" ] && {
for x in $MOD_PATHS ; do
[ -f $x/$THIS_UNAME/mol.o -o -f $x/$THIS_UNAME/mol.ko ] && {
echo $x/$THIS_UNAME
exit 0
}
[ -f $x/$THIS_UNAME/misc/mol.o ] && {
echo $x/$THIS_UNAME/misc
exit 0
}
done
exit 1
}
[ "$FIND_AVAIL" ] && {
find_avail
}
[ "$FIND_CLOSEST" ] && {
AVAIL=`find_avail`
unset AVAIL_UNAMES
for x in $AVAIL ; do
AVAIL_UNAMES="$AVAIL_UNAMES `echo $x | sed s/.*modules[/]//`"
done
MATCH=`$BIN_DIR/kver_approx $THIS_UNAME $AVAIL_UNAMES` || exit $?
for x in $AVAIL ; do
s=`echo $x | sed s/.*modules[/]//`
[ "$s" = "$MATCH" ] && { echo $x ; exit 0 ; }
done
}
exit 0
|