aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDag-Erling Smørgrav <des@FreeBSD.org>2026-06-23 15:23:30 +0000
committerDag-Erling Smørgrav <des@FreeBSD.org>2026-06-23 15:23:30 +0000
commita95d324dd3107afcbc16767d183acca7a57ebca9 (patch)
treef5e7c625fdcdbb82bee9978b2a02327749e2ab71
parentcfe1962a19259fea8f51673f4da6c96656776486 (diff)
rc: Improve load_kld
* Centralize the usage message. * Document and enforce that -e and -m are mutually exclusive; previously, speficying both would result in only -e being applied. * If -e was not specified, and -m was not specified or did not match, fall back to `kldstat -n file` which will always work for modules that aren't built into the kernel. This means the kld and ntpd scripts can now rely on load_kld to dtrt. MFC after: 1 week Reviewed by: imp Differential Revision: https://reviews.freebsd.org/D57706
-rwxr-xr-xlibexec/rc/rc.d/kld6
-rwxr-xr-xlibexec/rc/rc.d/ntpd2
-rw-r--r--libexec/rc/rc.subr27
3 files changed, 19 insertions, 16 deletions
diff --git a/libexec/rc/rc.d/kld b/libexec/rc/rc.d/kld
index d18ba2f08346..851db5dd6a32 100755
--- a/libexec/rc/rc.d/kld
+++ b/libexec/rc/rc.d/kld
@@ -44,10 +44,12 @@ kld_start()
local _kld
- startmsg "Loading kernel modules: ${kld_list}"
+ startmsg -n "Loading kernel modules:"
for _kld in $kld_list ; do
- load_kld -e ${_kld}.ko $_kld
+ load_kld $_kld
+ startmsg -n " ${_kld}"
done
+ startmsg "."
}
load_rc_config $name
diff --git a/libexec/rc/rc.d/ntpd b/libexec/rc/rc.d/ntpd
index e7e42da8acc7..a46a32144cce 100755
--- a/libexec/rc/rc.d/ntpd
+++ b/libexec/rc/rc.d/ntpd
@@ -67,7 +67,7 @@ can_run_nonroot()
# the policy module if not already present, then check whether the
# policy has been disabled via tunable or sysctl.
[ -n "$(sysctl -qn security.mac.version)" ] || return 1
- sysctl -qn security.mac.ntpd >/dev/null || kldload -qn mac_ntpd || return 1
+ load_kld mac_ntpd || return 1
[ "$(sysctl -qn security.mac.ntpd.enabled)" == "1" ] || return 1
# On older existing systems, the ntp dir may by owned by root, change
diff --git a/libexec/rc/rc.subr b/libexec/rc/rc.subr
index 101c69e93cde..7cb652e5ec17 100644
--- a/libexec/rc/rc.subr
+++ b/libexec/rc/rc.subr
@@ -2423,37 +2423,38 @@ mount_md()
# Code common to scripts that need to load a kernel module
# if it isn't in the kernel yet. Syntax:
-# load_kld [-e regex] [-m module] file
+# load_kld [-e regex | -m module] file
# where -e or -m chooses the way to check if the module
# is already loaded:
-# regex is egrep'd in the output from `kldstat -v',
-# module is passed to `kldstat -m'.
-# The default way is as though `-m file' were specified.
+# -e greps the output from `kldstat -v',
+# -m uses `kldstat -m module'.
+# The default way is as though `-m file` was specified.
load_kld()
{
- local _loaded _mod _opt _re
+ local _loaded _mod _opt _re _x
+ _x=0
while getopts "e:m:" _opt; do
case "$_opt" in
e) _re="$OPTARG" ;;
m) _mod="$OPTARG" ;;
- *) err 3 'USAGE: load_kld [-e regex] [-m module] file' ;;
+ *) _x=999 ;;
esac
+ _x=$((_x + 1))
done
shift $(($OPTIND - 1))
- if [ $# -ne 1 ]; then
- err 3 'USAGE: load_kld [-e regex] [-m module] file'
+ if [ $# -ne 1 ] || [ $_x -gt 1 ]; then
+ err 3 'USAGE: load_kld [-e regex | -m module] file'
fi
- _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
+ elif kldstat -q -m "${_mod:-$1}"; then
+ _loaded=true
+ elif kldstat -q -n "$1"; then
+ _loaded=true
fi
if ! $_loaded; then
if ! kldload "$1"; then