#!/bin/sh

err() { echo "usbmodules: error: $*" 1>&2 ; }

usage() {
	cat <<-EOF
	List relevant kernel modules for USB devices currently plugged in.  The
	module list is taken from the modules installed in /lib/modules/<ver>/.

	Usage: usbmodules [options] [kernel version]

	Options:
	  -m, --map <map>   Specify usbmap (default: /lib/modules/<ver>/modules.usbmap)
	  -h, --help        This help screen
	EOF
	if [ -n "$*" ] ; then
		err "$*"
		exit 1
	else
		exit 0
	fi
}

map=""

while [ -n "$1" ] ; do
	case $1 in
		-m|--map)  map=$2; shift;;
		-h|--help) usage;;
		--)        break;;
		-*)        usage "unknown option '$1'";;
		*)         break;;
	esac
	shift
done

ver=${1:-$(uname -r)}
map=${map:-/lib/modules/${ver}/modules.usbmap}

if [ ! -r "${map}" ] ; then
	err "unable to read map file: ${map}"
	exit 1
fi

for dev in $(lsusb | awk '{print $6}') ; do
	[ "${dev}" = "0000:0000" ] && continue

	IFS=:
	set -- ${dev}
	vendor=$1
	product=$2
	unset IFS

	alias="usb:v${vendor}p${product}"
	awk '$1 == "alias" && $2 ~ /^'${alias}'/ {print $NF}' ${map}
done

exit 0
