#!/bin/sh
#
# This is the update-modules script for Debian GNU/Linux.
# Copyright 1998-2001 Wichert Akkerman <wakkerma@debian.org>
# Licensed under the GNU GPL, version 2
#

MODCONFFILE=/etc/modules.conf
MODCONFTMPFILE="${MODCONFFILE}.$$"
MODULESFILE=/etc/modules
MODULESTMPFILE="${MODULESFILE}.$$"

ARCHDIR=/etc/modutils/arch
CPUDIR=/etc/modutils/cpu
HEADER="### This file is automatically generated by update-modules"

set -e

if [ "$1" = "force" ] ; then
	force=1
else
	force=
fi

# Reset the sorting order since we depend on it
LC_COLLATE=C
export LC_COLLATE

depdir()
{
	dep=`grep '[[:space:]]*depfile' "${MODCONFFILE}" | tail -n 1 | sed -e 's/depfile=//' -e 's,/[^/]*$,,'`
	if [ -z "$dep" ] ; then
		dep="/lib/modules/`uname -r`"
	fi

	echo $dep
}

arch() {
	local model=`uname -m`
	case $model in
		i[0-9]86) model=i386; ;;
		sun4u) model=sparc64; ;;
		arm*) model=arm; ;;
		ppc) model=powerpc; ;;
	esac
	echo $model
}

archmodel() {
	local arch=`arch`
	local model=""
	if [ $arch = "m68k" ]; then
		if [ -f /proc/hardware ]; then
			model=`sed -ne 's/^Model:[[:space:]]*//p' /proc/hardware`
			case $model in
				Atari*) model="atari"; ;;
				Amiga*) model="amiga"; ;;
				Macintosh*) model="mac"; ;;
				Motorola*) model="MVME"; ;;
				*) model="generic"; ;;
			esac
			model=".${model}"
		else
			echo "/proc/hardware does not exist, assuming general m68k system"
			model=".generic"
		fi
	elif [ $arch = "powerpc" ]; then
		if [ -f /proc/cpuinfo ]; then
			model=`sed -ne 's/^machine[[:space:]]*:[[:space:]]*//p' /proc/cpuinfo`
			case $model in
				Amiga*) model="apus"; ;;
				Power*) model="pmac"; ;;
				*) model="generic"; ;;
			esac
			model=".${model}"
		else
			echo "/proc/cpuinfo does not exist, assuming general powerpc system"
			model=".generic"
		fi
	fi
	echo "${arch}${model}"
}

checkoverwrite() {
	local cfgfile="$1"

	if [ -f "$cfgfile" ]; then
		if ! sed -ne 1p "$cfgfile" | grep -q "^$HEADER" ; then
			echo "Error: the current $cfgfile is not automatically generated." >&2
			if [ -z "$force" ]; then
				echo "Use \"update-modules force\" to force (re)generation."
				exit 1
			else
				echo "force specified, (re)generating file anyway."
			fi
		fi
	fi
}

createfile() {
	cat <<EOF > "$1"
$HEADER"
#
# Please do not edit this file directly. If you want to change or add
# anything please take a look at the files in /etc/modutils, /etc/modules-load.d 
# and read the manpage for update-modules.
#
EOF
}

addfile() {
	local src="$1"
	local tgt="$2"

	echo "### update-modules: start processing $src" >> "$tgt"
	if [ -x "$src" ]; then
		if !  "$src" >> "$tgt" ; then
			echo "Error while executing $src, aborting" >&2
			exit 1
		fi
	else
		cat "$src" >> "$tgt"
	fi
	cat <<EOF >> "$tgt"

### update-modules: end processing $cfg

EOF
}


checkoverwrite "$MODCONFFILE"

if [ 0 -ne "`id -u`" ]; then
	echo "You have to be root to do this." >&2
	exit 2
fi

model=`archmodel`
oldmodel=$model

while [ ! -f "${ARCHDIR}/${model}" ]; do
	oldmodel=$model
	model=`echo $oldmodel | sed -e 's/\.[^.]\+//'`
	if [ "$model" = "$oldmodel" ]; then
		break
	fi
	echo "Configuration for $oldmodel not found, trying $model"
done

CONF="${ARCHDIR}/${model}"

if [ ! -f "$CONF" ]; then
	## echo "Architecture-specific modutils configuration not found, using defaults"
	CONF="${ARCHDIR}/generic"
fi

[ -e "$MODCONFFILE" ] && cp -f "$MODCONFFILE" "${MODCONFFILE}.old"

createfile "$MODCONFTMPFILE"
createfile "$MODULESTMPFILE"

# well we're using /etc/modprobe.d/*.conf instead of /etc/modutils/*.conf anyway..
for cfg in /etc/modutils/* $CONF ; do
	if [ -f "$cfg" ]; then # this check is necesarry to skip /etc/modutils/archs
		if echo $cfg | grep -q '\.dpkg-[a-z]*\|~$' ; then
		        true
		elif echo $cfg | grep -q '\.conf$' ; then
			addfile "$cfg" "$MODCONFTMPFILE"
		else
			echo "Please migrate your $cfg file to /etc/modules-load.d/*.conf"
			addfile "$cfg" "$MODULESTMPFILE"
		fi
	fi
done
for cfg in /etc/modules-load.d/*.conf; do
	if [ -f "$cfg" ]; then # this check is necesarry to skip weird entries
		if echo $cfg | grep -q '\.dpkg-[a-z]*\|~$' ; then
		        true
		else
			addfile "$cfg" "$MODULESTMPFILE"
		fi
	fi
done

first_time=0
if [ ! -f $MODULESFILE ]; then
  first_time=1
fi

mv "$MODCONFTMPFILE" "$MODCONFFILE"
mv "$MODULESTMPFILE" "$MODULESFILE"

# Don't run modutils.sh if systemd is installed
if [ $first_time -eq 1 ] && [ ! -e /bin/systemctl ]; then
  /etc/init.d/modutils.sh || true
fi

# We also call depmod here to stop insmod from complaining that modules.conf
# is more recent then modules.dep
#
if [ -d "`depdir`" -a -f /proc/modules ]
then
	depmod -A || true
fi

exit 0

