#!/bin/sh -e
### BEGIN INIT INFO
# Provides:          kmod
# Required-Start:    
# Required-Stop:     
# Should-Start:      checkroot
# Should-Stop:
# Default-Start:     S
# Default-Stop:
# Short-Description: Load the modules listed in /etc/modules.
# Description:       Load the modules listed in /etc/modules.
### END INIT INFO

# Silently exit if the kernel does not support modules.
test -f /proc/modules || exit 0
test -x /sbin/modprobe || exit 0

test -f /etc/default/rcS && source /etc/default/rcS
source /lib/lsb/init-functions

setvar PATH = ''/sbin:/bin''

case (1) {
  start {
  if init_is_upstart {
    exit 1
  }
  }

  stop|restart|reload|force-reload {
  log_warning_msg "Action '$1' is meaningless for this init script"
  exit 0
  }

  * {
  log_success_msg "Usage: $0 start"
  exit 1
}
}

proc load_module {
  local module args
  setvar module = "$1"
  setvar args = "$2"

  if test $VERBOSE != no {
    log_action_msg "Loading kernel module $module"
    modprobe $module $args || true
  } else {
    modprobe $module $args > /dev/null 2>&1 || true
  }
}

proc 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 /lib/modules-load.d'
  local processed=' '
  local add_etc_modules=true

  for dir in $modules_load_dirs {
    test -d $dir || continue
    for file in $(run-parts --list --regex='\.conf$' $dir 2> /dev/null || true) {
      local base=${file##*/}
      if echo -n $processed | grep -qF " $base " {
        continue
      }
      if test $add_etc_modules -a -L $file \
	  -a $(readlink -f $file) = /etc/modules {
        setvar add_etc_modules = ''
      }
      setvar processed = ""$processed$base ""
      echo $file
    }
  }

  if test $add_etc_modules {
    echo /etc/modules
  }
}

if test $VERBOSE = no {
  log_action_begin_msg 'Loading kernel modules'
}

setvar files = $(modules_files)
if test $files  {
  grep -h '^[^#]' $files |
  while read module args {
    test $module || continue
    load_module $module $args
  }
}

if test $VERBOSE = no {
  log_action_end_msg 0
}