Page MenuHomeFreeBSD

D50325.id155373.diff
No OneTemporary

D50325.id155373.diff

diff --git a/libexec/rc/rc.subr b/libexec/rc/rc.subr
--- a/libexec/rc/rc.subr
+++ b/libexec/rc/rc.subr
@@ -1421,28 +1421,17 @@
;;
enable)
- _out=$(/usr/sbin/sysrc -vs "$name" "$rcvar=YES") &&
- echo "$name enabled in ${_out%%:*}"
+ _out=$(write_rcvar "$rcvar" "YES") &&
+ echo "$name enabled in $_out"
;;
disable)
- _out=$(/usr/sbin/sysrc -vs "$name" "$rcvar=NO") &&
- echo "$name disabled in ${_out%%:*}"
+ _out=$(write_rcvar "$rcvar" "NO") &&
+ echo "$name disabled in $_out"
;;
delete)
- _files=
- for _file in $(/usr/sbin/sysrc -lEs "$name"); do
- _out=$(/usr/sbin/sysrc -Fif $_file "$rcvar") && _files="$_files $_file"
- done
- /usr/sbin/sysrc -x "$rcvar" && echo "$rcvar deleted in ${_files# }"
- # delete file in rc.conf.d if desired and empty.
- checkyesno service_delete_empty || _files=
- for _file in $_files; do
- [ "$_file" = "${_file#*/rc.conf.d/}" ] && continue
- [ $(/usr/bin/stat -f%z $_file) -gt 0 ] && continue
- /bin/rm "$_file" && echo "Empty file $_file removed"
- done
+ delete_rcvar "$rcvar"
;;
status)
@@ -2735,6 +2724,92 @@
esac
}
+# _find_rcvar var
+# Find the rc.conf file (other than /etc/defaults/rc.conf) that sets $var.
+_find_rcvar()
+{
+ local _var
+ local _dir
+ local _files
+ local _subfile
+
+ [ -n "$1" ] || return 1
+ _var="$1"; shift
+
+ _files="/etc/rc.conf"
+ for _dir in /etc ${local_startup}; do
+ _dir="${_dir%/rc.d}"
+ _files="${_files} ${_dir}/rc.conf.d/${name}"
+ done
+
+ for _file in $_files; do
+ if [ -f "$_file" ]; then
+ if /usr/bin/grep -q "^${_var}=" "$_file"; then
+ echo "$_file"
+ return
+ fi
+ elif [ -d "$_file" ]; then
+ for _subfile in "$_file"/*; do
+ if [ -f "$_subfile" ] && \
+ /usr/bin/grep -q "^${_var}=" "$_subfile"; then
+ echo "$_subfile"
+ return
+ fi
+ done
+ fi
+ done
+}
+
+# write_rcvar var value
+# Add or replace the rc var $var with the value $value.
+# Look for a current setting of $var in /etc/rc.conf or /etc/rc.conf.d/$name,
+# and if found, modify it there; otherwise, append to /etc/rc.conf.
+write_rcvar()
+{
+ local _var
+ local _value
+ local _file
+
+ [ -n "$1" ] || return 1
+ _var="$1"; shift
+ [ -n "$1" ] || return 1
+ _value="$1"; shift
+
+ _file="$(_find_rcvar "$_var")"
+ if [ -n "$_file" ]; then
+ /usr/bin/sed -i '' "s/^${_var}=.*/${_var}=\"$_value\"/" "$_file"
+ echo $_file
+ else
+ echo "${_var}=\"${_value}\"" >>/etc/rc.conf
+ echo "/etc/rc.conf"
+ fi
+}
+
+# delete_rcvar var
+# Remove the rc var $var.
+# Look for a current setting of $var in /etc/rc.conf or /etc/rc.conf.d/$name,
+# and if found, remove it. If service_delete_empty is enabled, and the
+# resulting file is empty, also delete the file.
+delete_rcvar()
+{
+ local _var
+ local _files
+
+ [ -n "$1" ] || return 1
+ _var="$1"; shift
+
+ _file="$(_find_rcvar "$_var")"
+ if [ -n "$_file" ]; then
+ /usr/bin/sed -i '' "/^${_var}=/d" "$_file"
+ echo "$_var deleted in $_file"
+
+ if checkyesno service_delete_empty && [ ! -s "$_file" ]; then
+ /bin/rm -f "$_file"
+ echo "Empty file $_file removed"
+ fi
+ fi
+}
+
# If the loader env variable rc.debug is set, turn on debugging. rc.conf will
# still override this, but /etc/defaults/rc.conf can't unconditionally set this
# since it would undo what we've done here.

File Metadata

Mime Type
text/plain
Expires
Mon, Mar 30, 12:20 AM (6 h, 41 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
30563175
Default Alt Text
D50325.id155373.diff (3 KB)

Event Timeline