#!/bin/sh
# vi: ts=4 noexpandtab
# load modules

loadmods() {
	local line
	while read line; do
		line="${line%%#*}"
		[ -n "$line" ] || continue
		modprobe $line
	done
}

parse_modules() {
	local f="$1" arch="$2" march="" comment="" modinfo="" oifs="$IFS"
	local x="" found=false
	[ -f "$f" ] || return 1
	case "$arch" in
		i?86) march=",i386,x86,";;
		amd64|x86_64) march=",x86_64,x86,";;
		ppc64|powerpc) march=",powerpc,ppc64,";;
		arm*) march=",arm,$arch,";;
	esac
	while read line; do
		modinfo=${line%%#*}
		[ "$modinfo" = "$line" ] && comment="" ||
			comment="${line#${modinfo}#}"
		[ "${comment#*arch=}" = "$comment" ] &&
			{ echo "$modinfo"; continue; }
		found=false
		for tok in $comment; do
			[ "${tok#arch=}" != "$tok" ] || continue
			IFS=","; set -- ${tok#arch=}; IFS="$oifs";
			[ $# -eq 0 ] && continue
			for x in "$@"; do
				[ "${march#*,$x,}" != "$march" ] &&
					{ echo "$modinfo"; found=true; break; }
				shift;
			done
			$found && break
		done
	done < "$f"
}

MODULES_FILE="/etc/modules"

case "$1" in
	start)
		lxc-is-container && exit 0
		if [ -f "$MODULES_FILE" ]; then
			[ -d "/lib/modules/$(uname -r)" ] || exit 0
			march=$(uname -m)
			parse_modules "$MODULES_FILE" "$march" | loadmods
			[ "$march" = "ppc64" ] && sleep 1
		fi
		;;
	stop|restart|reload) : ;;
	parse_modules)
		parse_modules "$2" "$3";;
	*)
		echo $"Usage: $0 {start}"
		exit 1
esac

exit $?
