Here's new diff that implements daemon_execdir.

Index: etc/rc.d/rc.subr
===================================================================
RCS file: /cvs/src/etc/rc.d/rc.subr,v
retrieving revision 1.153
diff -u -p -r1.153 rc.subr
--- etc/rc.d/rc.subr    21 May 2022 10:50:09 -0000      1.153
+++ etc/rc.d/rc.subr    22 May 2022 08:10:04 -0000
@@ -49,7 +49,7 @@ _rc_parse_conf() {
                while IFS='     ' read -r _l; do
                        [[ $_l == [!#=]*=* ]] || continue
                        _key=${_l%%*([[:blank:]])=*}
-                       [[ $_key == *_@(flags|logger|rtable|timeout|user) ]] ||
+                       [[ $_key == 
*_@(execdir|flags|logger|rtable|timeout|user) ]] ||
                                [[ " ${_allowed_keys[*]} " == *" $_key "* ]] ||
                                continue
                        [[ $_key == "" ]] && continue
@@ -114,14 +114,17 @@ _rc_write_runfile() {
        [ -d ${_RC_RUNDIR} ] || mkdir -p ${_RC_RUNDIR} &&
                cat >${_RC_RUNFILE} <<EOF
 daemon_class=${daemon_class}
+daemon_execdir=${daemon_execdir}
 daemon_flags=${daemon_flags}
 daemon_logger=${daemon_logger}
 daemon_rtable=${daemon_rtable}
 daemon_timeout=${daemon_timeout}
 daemon_user=${daemon_user}
 pexp=${pexp}
+rc_reload=${rc_reload}
 rc_reload_signal=${rc_reload_signal}
 rc_stop_signal=${rc_stop_signal}
+rc_usercheck=${rc_usercheck}
 EOF
 }
 
@@ -164,8 +167,11 @@ rc_exec() {
        [ "${daemon_rtable}" -eq "$(id -R)" ] ||
                _rcexec="route -T ${daemon_rtable} exec ${_rcexec}"
 
-       ${_rcexec} "${daemon_logger:+set -o pipefail; }$@${daemon_logger:+ 2>&1 
|
-               logger -ip ${daemon_logger} -t ${_name}}"
+       ${_rcexec} "${daemon_logger:+set -o pipefail; } \
+               ${daemon_execdir:+cd ${daemon_execdir} && } \
+               $@ \
+               ${daemon_logger:+ 2>&1 |
+                       logger -ip ${daemon_logger} -t ${_name}}"
 }
 
 rc_start() {
@@ -317,6 +323,7 @@ _rc_do _rc_parse_conf
 rc_reload_signal=${rc_reload_signal:=HUP}
 rc_stop_signal=${rc_stop_signal:=TERM}
 
+eval _rcexecdir=\${${_name}_execdir}
 eval _rcflags=\${${_name}_flags}
 eval _rclogger=\${${_name}_logger}
 eval _rcrtable=\${${_name}_rtable}
@@ -334,6 +341,7 @@ getcap -f /etc/login.conf.d/${_name}:/et
 [ -n "${_RC_FORCE}" -o "$1" != "start" ] && [ X"${_rcflags}" = X"NO" ] &&
        unset _rcflags
 
+[ -n "${_rcexecdir}" ] && daemon_execdir=${_rcexecdir}
 [ -n "${_rcflags}" ] && daemon_flags=${_rcflags}
 [ -n "${_rclogger}" ] && daemon_logger=${_rclogger}
 [ -n "${_rcrtable}" ] && daemon_rtable=${_rcrtable}
@@ -347,7 +355,7 @@ if [ -n "${_RC_DEBUG}" ]; then
 fi
 
 readonly daemon_class
-unset _rcflags _rclogger _rcrtable _rctimeout _rcuser
+unset _rcexecdir _rcflags _rclogger _rcrtable _rctimeout _rcuser
 # the shell will strip the quotes from daemon_flags when starting a daemon;
 # make sure pexp matches the process (i.e. doesn't include the quotes)
 pexp="$(eval echo ${daemon}${daemon_flags:+ ${daemon_flags}})"
Index: usr.sbin/rcctl/rcctl.8
===================================================================
RCS file: /cvs/src/usr.sbin/rcctl/rcctl.8,v
retrieving revision 1.39
diff -u -p -r1.39 rcctl.8
--- usr.sbin/rcctl/rcctl.8      1 Apr 2022 10:13:35 -0000       1.39
+++ usr.sbin/rcctl/rcctl.8      22 May 2022 08:10:04 -0000
@@ -62,6 +62,7 @@ The following commands are available
 .Ar variable
 can be one of
 .Cm class ,
+.Cm execdir ,
 .Cm flags ,
 .Cm logger ,
 .Cm rtable ,
@@ -206,7 +207,8 @@ flags:
 # rcctl set apmd flags -A
 # rcctl get apmd
 apmd_class=daemon
-apmd_flags=-A
+apmd_execdir=
+apmd_flags=NO
 apmd_logger=
 apmd_rtable=0
 apmd_timeout=30
Index: usr.sbin/rcctl/rcctl.sh
===================================================================
RCS file: /cvs/src/usr.sbin/rcctl/rcctl.sh,v
retrieving revision 1.112
diff -u -p -r1.112 rcctl.sh
--- usr.sbin/rcctl/rcctl.sh     10 Feb 2022 16:57:33 -0000      1.112
+++ usr.sbin/rcctl/rcctl.sh     22 May 2022 08:10:04 -0000
@@ -258,8 +258,8 @@ svc_get()
        [ -n "${_svc}" ] || return
 
        local _status=0 _val _var=$2
-       local daemon_class daemon_flags daemon_logger daemon_rtable
-       local daemon_timeout daemon_user
+       local daemon_class daemon_execdir daemon_flags daemon_logger
+       local daemon_rtable daemon_timeout daemon_user
 
        if svc_is_special ${_svc}; then
                daemon_flags="$(eval echo \${${_svc}})"
@@ -279,6 +279,12 @@ svc_get()
                                [ -z "${daemon_class}" ] && \
                                        daemon_class="$(svc_getdef ${_svc} 
class)"
                        fi
+                       if [ -z "${_var}" -o "${_var}" = "execdir" ]; then
+                               [ -z "${daemon_execdir}" ] && \
+                                       daemon_execdir="$(eval echo 
\"\${${_svc}_execdir}\")"
+                               [ -z "${daemon_execdir}" ] && \
+                                       daemon_execdir="$(svc_getdef ${_svc} 
execdir)"
+                       fi
                        if [[ -z ${_var} || ${_var} == @(flags|status) ]]; then
                                [ -z "${daemon_flags}" ] && \
                                        daemon_flags="$(eval echo 
\"\${${_svc}_flags}\")"
@@ -324,6 +330,7 @@ svc_get()
                        echo "${_svc}=${daemon_flags}"
                else
                        echo "${_svc}_class=${daemon_class}"
+                       echo "${_svc}_execdir=${daemon_execdir}"
                        echo "${_svc}_flags=${daemon_flags}"
                        echo "${_svc}_logger=${daemon_logger}"
                        echo "${_svc}_rtable=${daemon_rtable}"
@@ -341,8 +348,8 @@ svc_getdef()
        [ -n "${_svc}" ] || return
 
        local _status=0 _val _var=$2
-       local daemon_class daemon_flags daemon_logger daemon_rtable
-       local daemon_timeout daemon_user
+       local daemon_class daemon_execdir daemon_flags daemon_logger
+       local daemon_rtable daemon_timeout daemon_user
 
        if svc_is_special ${_svc}; then
                # unconditionally parse: we always output flags and/or status
@@ -382,6 +389,7 @@ svc_getdef()
                        echo "${_svc}=${daemon_flags}"
                else
                        echo "${_svc}_class=${daemon_class}"
+                       echo "${_svc}_execdir=${daemon_execdir}"
                        echo "${_svc}_flags=${daemon_flags}"
                        echo "${_svc}_logger=${daemon_logger}"
                        echo "${_svc}_rtable=${daemon_rtable}"
@@ -403,7 +411,7 @@ svc_rm()
                ( svc_getdef ${_svc} status ) && \
                        echo "${_svc}=NO" >>${_TMP_RCCONF}
        else
-               grep -Ev "^${_svc}_(flags|logger|rtable|timeout|user).*=" \
+               grep -Ev 
"^${_svc}_(execdir|flags|logger|rtable|timeout|user).*=" \
                        /etc/rc.conf.local >${_TMP_RCCONF}
                ( svc_getdef ${_svc} status ) && \
                        echo "${_svc}_flags=NO" >>${_TMP_RCCONF}
@@ -456,6 +464,10 @@ svc_set()
        fi
 
        if [ -n "${_args}" ]; then
+               if [ "${_var}" = "execdir" ]; then
+                       [[ ${_args%${_args#?}} == / ]] ||
+                               rcctl_err "\"${_args}\" must be an absolute 
path"
+               fi
                if [ "${_var}" = "logger" ]; then
                        logger -p "${_args}" </dev/null >/dev/null 2>&1 ||
                                rcctl_err "unknown priority name: \"${_args}\""
@@ -539,13 +551,13 @@ case ${action} in
                        rcctl_err "service ${svc} does not exist" 2
                if [ -n "${var}" ]; then
                        [ "${svc}" = "all" ] && usage
-                       [[ ${var} != 
@(class|flags|logger|rtable|status|timeout|user) ]] && usage
+                       [[ ${var} != 
@(class|execdir|flags|logger|rtable|status|timeout|user) ]] && usage
                        if svc_is_meta ${svc}; then
                                [ "${var}" != "status" ] && \
                                        rcctl_err "/etc/rc.d/${svc} is a meta 
script, cannot \"${action} ${var}\""
                        fi
                        if svc_is_special ${svc}; then
-                               [[ ${var} == 
@(class|logger|rtable|timeout|user) ]] && \
+                               [[ ${var} == 
@(class|execdir|logger|rtable|timeout|user) ]] && \
                                        rcctl_err "\"${svc}\" is a special 
variable, cannot \"${action} ${var}\""
                        fi
                fi
@@ -561,7 +573,7 @@ case ${action} in
                        svc_is_avail ${svc} || \
                                rcctl_err "service ${svc} does not exist" 2
                fi
-               [[ ${var} != @(class|flags|logger|rtable|status|timeout|user) 
]] && usage
+               [[ ${var} != 
@(class|execdir|flags|logger|rtable|status|timeout|user) ]] && usage
                svc_is_meta ${svc} && [ "${var}" != "status" ] && \
                        rcctl_err "/etc/rc.d/${svc} is a meta script, cannot 
\"${action} ${var}\""
                [[ ${var} = flags && ${args} = NO ]] && \
Index: share/man/man8/rc.d.8
===================================================================
RCS file: /cvs/src/share/man/man8/rc.d.8,v
retrieving revision 1.37
diff -u -p -r1.37 rc.d.8
--- share/man/man8/rc.d.8       9 Nov 2021 11:43:47 -0000       1.37
+++ share/man/man8/rc.d.8       22 May 2022 08:10:04 -0000
@@ -102,6 +102,8 @@ variables when starting a daemon.
 The following can be overridden by site-specific values provided in
 .Xr rc.conf.local 8 :
 .Bl -tag -width daemon_timeout -offset indent
+.It Ar daemon Ns _execdir
+Run daemon from the specified directory.
 .It Ar daemon Ns _flags
 Additional arguments to call the daemon with.
 These will be appended to any mandatory arguments already contained in the
Index: share/man/man8/rc.subr.8
===================================================================
RCS file: /cvs/src/share/man/man8/rc.subr.8,v
retrieving revision 1.43
diff -u -p -r1.43 rc.subr.8
--- share/man/man8/rc.subr.8    21 May 2022 14:11:39 -0000      1.43
+++ share/man/man8/rc.subr.8    22 May 2022 08:10:04 -0000
@@ -189,10 +189,11 @@ call
 .Ic rc_reload .
 .El
 .It Ic rc_exec
-Execute process using
+Execute argument using
 .Xr su 1
 according to
 .Va daemon_class ,
+.Va daemon_execdir ,
 .Va daemon_user ,
 .Va daemon_rtable
 and
@@ -256,6 +257,9 @@ script itself and uses that.
 If no such login class exists then
 .Dq daemon
 will be used.
+.It Va daemon_execdir
+Change to this directory before running
+.Ic rc_exec .
 .It Va daemon_flags
 Arguments to call the daemon with.
 .It Ar daemon Ns _logger
@@ -337,6 +341,7 @@ in an
 script, if the
 .Cm check
 action needs root privileges.
+.El
 .Pp
 All
 .Va daemon_*
@@ -347,6 +352,7 @@ Global defaults are provided by
 .Nm :
 .Bd -literal -offset indent
 daemon_class=daemon
+daemon_execdir=
 daemon_flags=
 daemon_logger=
 daemon_rtable=0
@@ -367,6 +373,7 @@ As noted in
 site-specific values provided in
 .Xr rc.conf.local 8
 for
+.Va daemon_execdir ,
 .Va daemon_flags ,
 .Va daemon_logger ,
 .Va daemon_rtable ,
@@ -374,7 +381,6 @@ for
 and
 .Va daemon_user
 will override those defaults.
-.El
 .El
 .Sh FILES
 .Bl -tag -width Ds

-- 
Antoine

Reply via email to