#!/bin/sh
#Copyright: 2026 Aitor <aitor@genuen.org>
#License: CC0-1.0
#Comment: oneshot; invoke with: sv once kmod

exec 2>&1

ebegin() { [ "${VERBOSE:-}" = no ] || echo "$@"; }
eend() { r=${1:-0}; shift || true; [ "$r" -eq 0 ] || [ "${VERBOSE:-}" = no ] || echo "$*" >&2; return "$r"; }
einfo() { [ "${VERBOSE:-}" = no ] || echo "$@"; }
ewarn() { echo "$@" >&2; }
eerror() { echo "$@" >&2; }

/usr/lib/runit-services/stage1/sv once checkroot.sh || exit 1

[ -f /proc/modules ] || exit 0
[ -x /sbin/modprobe ] || exit 0
[ -f /etc/default/rcS ] && . /etc/default/rcS
. /lib/init/vars.sh

load_module() {
	local module="$1" args="$2"
	if [ "$VERBOSE" != no ]; then
		einfo "Loading kernel module $module"
		modprobe $module $args || true
	else
		modprobe $module $args > /dev/null 2>&1 || true
	fi
}

modules_files() {
	local modules_load_dirs='/etc/modules-load.d /run/modules-load.d /usr/local/lib/modules-load.d /usr/lib/modules-load.d'
	local processed=' ' add_etc_modules=true dir file base
	for dir in $modules_load_dirs; do
		[ -d $dir ] || continue
		for file in $(run-parts --list --regex='\.conf$' $dir 2> /dev/null || true); do
			base=${file##*/}
			echo -n "$processed" | grep -qF " $base " && continue
			if [ "$add_etc_modules" ] && [ -L $file ] && [ "$(readlink -f $file)" = /etc/modules ]; then
				add_etc_modules=
			fi
			processed="$processed$base "
			echo $file
		done
	done
	[ "$add_etc_modules" ] && echo /etc/modules
}

ebegin "Loading kernel modules"
files=$(modules_files)
if [ "$files" ]; then
	grep -h '^[^#]' $files |
	while read module args; do
		[ "$module" ] || continue
		load_module "$module" "$args"
	done
fi
eend 0
exit 0
