diff --git a/dahdi-modules b/dahdi-modules new file mode 100755 index 0000000..230cd50 --- /dev/null +++ b/dahdi-modules @@ -0,0 +1,72 @@ +#!/bin/sh + +MODULES="dahdi" +DAHDI_MODULES_FILE="/etc/dahdi/modules" + +usage() { + cat < + +* load: Loads all modules listed in /etc/dahdi/modules (one per line) +* unload: Unloads the DAHDI modules (all the modules that are dependencies + of $MODULES). +EOF +} + +# recursively unload a module and its dependencies, if possible. +# where's modprobe -r when you need it? +# inputs: module to unload. +# returns: the result from +unload_module() { + module="$1" + line=`lsmod 2>/dev/null | grep "^$1 "` + if [ "$line" = '' ]; then return; fi # module was not loaded + + set -- $line + # $1: the original module, $2: size, $3: refcount, $4: deps list + mods=`echo $4 | tr , ' '` + ec_modules="" + # xpp_usb keeps the xpds below busy if an xpp hardware is + # connected. Hence must be removed before them: + case "$module" in xpd_*) mods="xpp_usb $mods";; esac + + for mod in $mods; do + case "$mod" in + dahdi_echocan_*) + ec_modules="$mod $ec_modules" + ;; + *) + # run in a subshell, so it won't step over our vars: + (unload_module $mod) + ;; + esac + done + # Now that all the other dependencies are unloaded, we can unload the + # dahdi_echocan modules. The drivers that register spans may keep + # references on the echocan modules before they are unloaded. + for mod in $ec_modules; do + (unload_module $mod) + done + rmmod $module +} + +unload_modules() { + for module in "$@"; do + unload_module $module + done +} + +load_modules() { + modules=`sed -e 's/#.*$//' $DAHDI_MODULES_FILE 2>/dev/null` + for line in $modules; do + modprobe $line + done +} + +case "$1" in + load) load_modules "$@";; + unload) unload_modules $MODULES;; + *) usage;; +esac