#!@SBINDIR@/openrc-run
# Copyright (c) 2016 The OpenRC Authors.
# See the Authors file at the top-level directory of this distribution and
# https://github.com/OpenRC/openrc/blob/master/AUTHORS
#
# This file is part of OpenRC. It is subject to the license terms in
# the LICENSE file found in the top-level directory of this
# distribution and at https://github.com/OpenRC/openrc/blob/master/LICENSE
# This file may not be copied, modified, propagated, or distributed
# except according to the terms contained in the LICENSE file.

description="Loads a list of modules from systemd-compatible locations."

depend()
{
	keyword -docker -lxc -openvz -prefix -systemd-nspawn -vserver
}

find_modfiles()
{
	local dirs="/usr/lib/modules-load.d /run/modules-load.d /etc/modules-load.d"
	local basenames files fn x y
	for x in $dirs; do
		[ ! -d $x ] && continue
		for y in $x/*.conf; do
			[ -f $y ] && basenames="${basenames}\n${y##*/}"
		done
	done
	basenames=$(printf "$basenames" | sort -u)
	for x in $basenames; do
		for y in $dirs; do
			[ -r $y/$x ] &&
				fn=$y/$x
		done
		files="$files $fn"
	done
	echo $files
}

load_modules()
{
	local file m modules rc x
	file=$1
	[ -z "$file" ] && return 0
	while read m x; do
		case $m in
			\;*) continue ;;
			\#*) continue ;;
			*) modules="$modules $m"
			;;
		esac
	done < $file
	for x in $modules; do
		ebegin "Loading module $x"
		case "$RC_UNAME" in
			FreeBSD) kldload "$x"; rc=$? ;;
			Linux) modprobe --use-blacklist -q "$x"; rc=$? ;;
			*) ;;
		esac
		eend $rc "Failed to load $x"
	done
}

start()
{
	local x
	files=$(find_modfiles)
	for x in $files; do
		load_modules $x
	done
	return 0
}
