summaryrefslogtreecommitdiff
path: root/scripts/find-supplements.ksyms
blob: 1b94c1e4fb861803ae4abc2812326cee72bc7eef (plain)
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/sh

SPECFILE=${RPMBUILD_SPECFILE:-/usr/src/packages/SOURCES/$1.spec}
IFS=$'\n'
PACKAGE=$1

case "$1" in
kernel-module-*)    ;; # Fedora kernel module package names start with
		       # kernel-module.
kernel*)	   is_kernel_package=1 ;;
esac

if ! [ -z "$is_kernel_package" ]; then
    cat > /dev/null
    exit 0
fi

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

# Encode all characters other than [*:a-zA-Z0-9] in stdin as %XX.
# (This includes the % character itself, which becomes %25.)
hexenc() {
    local line hex

    while read line; do
            set -- "" "$line"
            while [[ "$2" =~ ([*:a-zA-Z0-9]*)([^*:a-zA-Z0-9])(.*) ]]; do
                hex=$(echo -n "${BASH_REMATCH[2]}" | hexdump -e '"%X"')
                set -- "$1${BASH_REMATCH[1]}%$hex" "${BASH_REMATCH[3]}"
            done
            echo "$1$2"
    done
}

aliases_of_filelist() {
    modlist=$(mktemp)
    have_module=1
    for module in $(grep -E '/lib/modules/.+\.ko$'); do
	vermagic=$(/sbin/modinfo -F vermagic "$module")
	krel=${vermagic%% *}
	if ! test -x /sbin/modinfo; then
		echo "ERROR: add module-init-tools to BuildRequires" >&2
		exit 1
	fi
	have_module=0
	/sbin/modinfo -F alias "$module" \
	| hexenc \
	| sed -nre "s,(.+:.+),modalias(kernel-${krel##*-}:\\1),p" | tee -a $modlist
    done
    if ! test -s "$modlist" && test $have_module = 0; then
        echo "packageand(kernel-${krel##*-}:$PACKAGE)"
    fi
    rm -f $modlist
}

aliases_of_specfile_macro() {
    declare regex

    regex=$(
	set -o noglob
	set -- $(sed -ne 's:^%supplements_kernel_module[ \t]::p' \
		     $SPECFILE)
	while [ $# -ge 1 ]; do
	    regex=$(echo "$1" \
		    | sed -e 's:[.]:\\.:g' \
			  -e 's:?:.:g' \
			  -e 's:\*:.*:g' \
			  -e 's:\\:\\\\:g')
	    echo -n "^$regex\$"
	    [ $# -ge 2 ] && echo -n "|"
	    shift
	done
    )

    if [ -n "$regex" ]; then
	awk '
	$1 == "alias" && $3 ~ regex { print $2 }
	' regex="$regex" /lib/modules/*/modules.alias
    fi
}

(   aliases_of_filelist
    aliases_of_specfile_macro "$1"
) \
| sort -u \
| combine_modaliases