-
Notifications
You must be signed in to change notification settings - Fork 0
/
dkms_find-provides
executable file
·93 lines (80 loc) · 2.35 KB
/
dkms_find-provides
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
#! /bin/sh
# heavily based upon find-suggests.ksyms by Andreas Gruenbacher <[email protected]>.
# with modifications by Michael Brown <[email protected]>
#
# -- added module versioning info to modalias() symbols
# -- removed code which inspects spec files.
IFS=$'\n'
print_modaliases() {
declare class=$1 variants=$2 pos=$3
if [ -n "$variants" ]; then
echo "${class:0:pos}[$variants]${class:pos+1}"
else
[ -z "$class" ] || echo "$class"
fi
}
combine_modaliases() {
declare tag class variants pos n
read class
while read tag; do
for ((n=0; n<${#class}; n++)); do
if [ "*" != "${class:n:1}" -a \
"${class:0:n}" = "${tag:0:n}" -a \
"${class:n+1}" = "${tag:n+1}" ] &&
( [ -z "$pos" ] || [ $n = $pos ] ); then
variants="${variants:-${class:n:1}}${tag:n:1}"
pos=$n
break
fi
done
if [ $n -eq ${#class} ]; then
print_modaliases "$class" "$variants" "$pos"
variants=
pos=
class=$tag
fi
done
print_modaliases "$class" "$variants" "$pos"
}
get_modinfo() {
module=$1
# | head -n1 because some modules have *two* version tags. *cough*b44*cough*
modver=$(/sbin/modinfo -F version "$module"| head -n1)
modver=${modver// /_}
# only add version tag if it has a version
if [ -n "$modver" ]; then
/sbin/modinfo -F alias "$module" \
| sed -nre "s,(.+),modalias(\\1) = $modver,p"
else
/sbin/modinfo -F alias "$module" \
| sed -nre "s,(.+),modalias(\\1),p"
fi
}
tmp=${TMPDIR:-/tmp}
TMPDIR=$(mktemp -d ${tmp}/dkms-findprovides-$$-$RANDOM-XXXXXX)
trap "rm -rf $TMPDIR >/dev/null 2>&1" QUIT EXIT HUP INT TERM
modlist=
for cand in $(grep -E '(/lib/modules/.+\.ko$|tgz$|tbz$|tar\.(gz|bz2|xz)$)') $*; do
if echo $cand | grep -q -E '/lib/modules/.+\.ko$' > /dev/null 2>&1; then
modlist="$modlist $cand"
fi
[ -f $cand ] || continue
opts=x
if gzip -t $cand >/dev/null 2>&1; then
opts=${opts}z
elif bzip2 -t $cand >/dev/null 2>&1; then
opts=${opts}j
elif xz -t $cand >/dev/null 2>&1; then
opts=${opts}J
fi
tar ${opts}f $cand -C $TMPDIR > /dev/null 2>&1
done
for module in $(find $TMPDIR -name \*.ko) $modlist; do
if echo $module | grep -q -E '.ko$' >/dev/null 2>&1; then
# it is a straight module
get_modinfo $module
continue
fi
done \
| sort -u \
| combine_modaliases