File: mol_uname

package info (click to toggle)
mol 0.9.71.dfsg-5
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 7,612 kB
  • ctags: 12,442
  • sloc: ansic: 65,368; asm: 3,437; makefile: 793; sh: 710; yacc: 706; lex: 501; perl: 160; cpp: 121; pascal: 18
file content (125 lines) | stat: -rwxr-xr-x 2,814 bytes parent folder | download | duplicates (2)
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
118
119
120
121
122
123
124
125
#!/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
###########################################################

KVER=`uname -r | cut -d "." -f 2`;
if [ ${KVER} -eq 4 ]; then
	unset SMP ALTIVEC
	cat /proc/version | grep SMP > /dev/null
	[ $? == 0 ] && SMP="-smp"

	if [ -f /proc/ksyms ]; then
	    grep altivec /proc/ksyms
	    [ $? != 0 ] && ALTIVEC="-noav"
	fi
	THIS_UNAME=`uname -r`$SMP$ALTIVEC
else
	THIS_UNAME=`uname -r`
fi


###########################################################
# 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
	}
    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