#!/bin/sh
# Loads the modules listed in modules-load.d(5) and in modules-load= on the
# kernel command line, like systemd-modules-load. A file in an earlier
# directory replaces one of the same name in a later one, a link to /dev/null
# masks it. Debian's /etc/modules is read through /etc/modules-load.d/modules.conf.
dirs="/etc/modules-load.d /run/modules-load.d /usr/local/lib/modules-load.d /usr/lib/modules-load.d /lib/modules-load.d"
r=0

load() {
	modprobe -b "$1" || { echo "modules-load: $1 failed" >&2; r=1; }
}

names=$(for d in $dirs; do
	for f in "$d"/*.conf; do [ -e "$f" ] && echo "${f##*/}"; done
done | sort -u)
for n in $names; do
	for d in $dirs; do
		[ -e "$d/$n" ] || continue
		[ "$(readlink -f "$d/$n")" = /dev/null ] && break
		while read -r m rest; do
			case $m in '' | \#* | \;*) continue ;; esac
			load "$m"
		done <"$d/$n"
		break
	done
done

read -r cmdline </proc/cmdline
for a in $cmdline; do
	case $a in
	modules-load=* | modules_load=* | rd.modules-load=* | rd.modules_load=*)
		for m in $(echo "${a#*=}" | tr , ' '); do load "$m"; done
		;;
	esac
done
exit $r
