git: b75bb99621fb - main - rc.subr add Exists so we can find sed
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 12 Feb 2024 22:40:30 UTC
The branch main has been updated by sjg:
URL: https://cgit.FreeBSD.org/src/commit/?id=b75bb99621fbebae3b7f56ea01e711333d0455d8
commit b75bb99621fbebae3b7f56ea01e711333d0455d8
Author: Simon J. Gerraty <sjg@FreeBSD.org>
AuthorDate: 2024-02-12 22:39:20 +0000
Commit: Simon J. Gerraty <sjg@FreeBSD.org>
CommitDate: 2024-02-12 22:39:20 +0000
rc.subr add Exists so we can find sed
SED=`Exists -x /usr/bin/sed /rescue/sed`
avoids adding /rescure to $PATH, and allows use of sed
before /usr is mounted (if a separate filesystem).
Reviewed by: jlduran_gmail.com
Differential Revision: https://reviews.freebsd.org/D43826
---
libexec/rc/rc.subr | 40 +++++++++++++++++++++++++++++++++++-----
libexec/rc/safe_eval.sh | 2 +-
2 files changed, 36 insertions(+), 6 deletions(-)
diff --git a/libexec/rc/rc.subr b/libexec/rc/rc.subr
index d76f0ba4f9a7..16b2c9fc5e88 100644
--- a/libexec/rc/rc.subr
+++ b/libexec/rc/rc.subr
@@ -156,6 +156,33 @@ vdot()
return $rc
}
+# Exists [test] file ...
+# report the first "file" that passes "test" (default -s).
+Exists()
+{
+ local f _t=-s
+
+ while :; do
+ : 1=$1
+ case "$1" in
+ -?)
+ _t=$1
+ shift
+ ;;
+ *)
+ break
+ ;;
+ esac
+ done
+
+ for f in "$@"; do
+ [ $_t $f ] || continue
+ echo $f
+ return 0
+ done
+ return 1
+}
+
# do we have $1 (could be a function)
have()
{
@@ -179,8 +206,8 @@ rc_trace()
[ -f $cf ] || return
if [ -s $cf ]; then
# don't try to set RC_LEVEL without sed
- if [ -x /usr/bin/sed ]; then
- RC_LEVEL=$(sed -n '/^RC_LEVEL=/ { s/.*=//p;q; }' $cf)
+ if [ -n "$SED" ]; then
+ RC_LEVEL=$($SED -n '/^RC_LEVEL=/ { s/.*=//p;q; }' $cf)
RC_LEVEL=${RC_LEVEL:-0}
fi
else
@@ -2498,6 +2525,8 @@ if [ -n "$boottrace_cmd" ] && [ "`${SYSCTL_N} -q kern.boottrace.enabled`" = "1"
rc_boottrace=YES
fi
+SED=${SED:-$(Exists -x /usr/bin/sed /rescue/sed)}
+
# Allow for local additions and overrides.
# Use vdot to ensure the file has not been tampered with.
vdot /etc/local.rc.subr
@@ -2514,10 +2543,11 @@ if ! have basename; then
{
return 0
}
-else
- # safe_eval.sh provides safe_dot - for untrusted files
- $_SAFE_EVAL_SH vdot /libexec/safe_eval.sh
+ # we cannot use safe_dot without sed
+ [ -z "$SED" ] && _SAFE_EVAL_SH=:
fi
+# safe_eval.sh provides safe_dot - for untrusted files
+$_SAFE_EVAL_SH vdot /libexec/safe_eval.sh
$_DEBUG_SH vdot /libexec/debug.sh
# Ensure we can still operate if debug.sh and
diff --git a/libexec/rc/safe_eval.sh b/libexec/rc/safe_eval.sh
index bd9bc9394814..10b6ed09c769 100644
--- a/libexec/rc/safe_eval.sh
+++ b/libexec/rc/safe_eval.sh
@@ -24,7 +24,7 @@ _SAFE_EVAL_SH=:
# any non-alphanumeric chars are replaced with '_'
#
safe_set() {
- sed 's/[ ]*#.*//;/^[A-Za-z_][A-Za-z0-9_]*=/!d;s;[^A-Za-z0-9_. "$,/=-];_;g'
+ ${SED:-sed} 's/[ ]*#.*//;/^[A-Za-z_][A-Za-z0-9_]*=/!d;s;[^A-Za-z0-9_. "$,/=-];_;g'
}
##