#! /bin/bash -efu # heavily based upon find-suggests.ksyms by Andreas Gruenbacher . # with modifications by Michael Brown # # -- added module versioning info to modalias() symbols # -- removed code which inspects spec files. IFS=$'\n' # # Initially, dont generate modalias() lines for kernel package. This needs # additional discussion. Would like to eventually add them for # completeness, so that we can determine when drivers are folded into # mainline kernel. # is_kernel_package="" 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 # Check for presence of the commands used. # "command" is a builtin, faster to use than fork+execing "which" - see # https://pubs.opengroup.org/onlinepubs/9699919799/utilities/command.html command -v /sbin/modinfo >/dev/null || exit 1 command -v sed >/dev/null || exit 1 command -v sort >/dev/null || exit 1 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 # Due to set -e, we can exit with exitcode 1 on read EOF # and this makes our caller think we failed. "|| return 0" prevents this: read class || return 0 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" } for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do # | head -n1 because some modules have *two* version tags. *cough*b44*cough* modver=$(/sbin/modinfo -F version "$module"| head -n1) modver=${modver//[^0-9a-zA-Z._]/_} # only add version tag if it has a version [ -z "$modver" ] || modver=" = $modver" /sbin/modinfo -F alias "$module" \ | sed -nre "s,[^][0-9a-zA-Z._:*?/-],_,g; s,(.+),modalias(\\1)$modver,p" done \ | sort -u \ | combine_modaliases