#!/bin/bash
### BEGIN INIT INFO
# Provides:            modules
# Required-Start:      sysctl cmdline
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start:       3 4 5
# Default-Stop:
# Short-Description:   Loads required modules.
# Description:         Loads modules for PRELOAD.
### END INIT INFO

[ "$1" = start ] || exit 0

. /.initrd/initenv

[ -z "${RD_DEPMOD-}" ] ||
	depmod -a

if [ "${RD_DRIVER_BLACKLIST:-0}" != 0 ]; then
	i=0
	while [ $i -lt ${RD_DRIVER_BLACKLIST:-0} ]; do
		eval "MODS=\"\$RD_DRIVER_BLACKLIST$i\""

		modnames=()
		readarray -t -d, modnames <<<"$MODS,"

		for modname in "${modnames[@]}"; do
			[ -n "$modname" ] && [ "$modname" != $'\n' ] ||
				continue
			printf 'blacklist %s\n' "$modname"
		done >> /etc/modprobe.d/initramfs-blacklist.conf
	done
fi

[ -n "${RD_PRELOAD_MODULES-}" ] ||
	exit 0

. /etc/init.d/functions

preload_modules()
{
	local check conf modname rc=0

	if [ "${RD_DRIVER_PRE:-0}" != 0 ]; then
		local i modnames MODS

		i=0
		while [ $i -lt ${RD_DRIVER_PRE:-0} ]; do
			eval "MODS=\"\$RD_DRIVER_PRE$i\""

			modnames=()
			readarray -t -d, modnames <<<"$MODS,"

			for modname in "${modnames[@]}"; do
				[ -n "$modname" ] && [ "$modname" != $'\n' ] ||
					continue
				modprobe "$modname" || rc=1
			done
		done
	fi 2>"/var/log/preload-modules.log"

	for conf in /etc/modules-load.d/*.conf /run/modules-load.d/*.conf /lib/modules-load.d/*.conf /etc/initrd/modules-preudev; do
		# shellcheck disable=SC2162
		[ ! -e "$conf" ] ||
		while read modname args; do
			[ -n "${modname##[\#;]*}" ] ||
				continue
			check="/lib/initrd/kmodules/check-$modname"
			[ ! -x "$check" ] || "$check" ||
				continue
			modprobe "$modname" $args || rc=1
		done < "$conf"
	done 2>>"/var/log/preload-modules.log"
	return $rc
}

action_shell 'Loading modules:' preload_modules
