summaryrefslogtreecommitdiffstats
path: root/etc/rc.subr
diff options
context:
space:
mode:
authoryar <yar@FreeBSD.org>2006-06-21 09:42:55 +0000
committeryar <yar@FreeBSD.org>2006-06-21 09:42:55 +0000
commitad10a899ae4f7b7697616cc6c8e7c20b5e771653 (patch)
tree43ec796478581a575c843d33ff28451cadfeab1c /etc/rc.subr
parentaad45ca6a01bf8abf012ac7ec18ca7aa22333086 (diff)
downloadFreeBSD-src-ad10a899ae4f7b7697616cc6c8e7c20b5e771653.zip
FreeBSD-src-ad10a899ae4f7b7697616cc6c8e7c20b5e771653.tar.gz
Quite a number of rc.d scripts try to load kernel modules. Many
of them do that conditionally depending on kldstat. The code is duplicated all over, but bugs can be uniqie. To make the things more consistent, introduce a new rc.subr function, load_kld, which takes care of loading a kernel module conditionally. (Found this lying for a while in my p4 branch for various hacks.)
Diffstat (limited to 'etc/rc.subr')
-rw-r--r--etc/rc.subr39
1 files changed, 39 insertions, 0 deletions
diff --git a/etc/rc.subr b/etc/rc.subr
index 1037bbc..2928d3b 100644
--- a/etc/rc.subr
+++ b/etc/rc.subr
@@ -1356,6 +1356,45 @@ mount_md()
/sbin/mdmfs $flags -s $1 md $2
}
+# Code common to scripts that need to load a kernel module
+# if it isn't in the kernel yet. Syntax:
+# load_kld [-e regexp] [-m modname] filename
+# where -e or -m chooses the way to check if the module
+# is already loaded:
+# regexp is egrep'd in the output from `kldstat -v',
+# modname is passed to `kldstat -m'.
+# The default way is as though `-m filename' were specified.
+load_kld()
+{
+ local _loaded _mod _opt _re
+
+ while getopts "e:m:" _opt; do
+ case "$_opt" in
+ e) _re="$OPTARG" ;;
+ m) _mod="$OPTARG" ;;
+ esac
+ done
+ shift $(($OPTIND - 1))
+ _mod=${_mod:-$1}
+ _loaded=false
+ if [ -n "$_re" ]; then
+ if kldstat -v | egrep -q -e "$_re"; then
+ _loaded=true
+ fi
+ else
+ if kldstat -q -m "$_mod"; then
+ _loaded=true
+ fi
+ fi
+ if ! $_loaded; then
+ if ! kldload "$1"; then
+ warn "Unable to load kernel module $1"
+ return 1
+ fi
+ fi
+ return 0
+}
+
# ltr str src dst
# Change every $src in $str to $dst.
# Useful when /usr is not yet mounted and we cannot use tr(1), sed(1) nor
OpenPOWER on IntegriCloud