diff --git a/libexec/rc/rc.subr b/libexec/rc/rc.subr --- a/libexec/rc/rc.subr +++ b/libexec/rc/rc.subr @@ -1411,7 +1411,9 @@ ;; *) # run in subshell if [ -x $_file ]; then - if [ -n "$rc_fast_and_loose" ]; then + if [ -n "$rc_boottrace" ]; then + boottrace_fn "$_file" "$_arg" + elif [ -n "$rc_fast_and_loose" ]; then set $_arg; . $_file else ( trap "echo Script $_file interrupted >&2 ; kill -QUIT $$" 3 @@ -1424,6 +1426,26 @@ esac } +boottrace_fn() +{ + local _file _arg + _file=$1 + _arg=$2 + + if [ -n "$rc_fast_and_loose" ]; then + boottrace_sysctl "$_file start" + set $_arg; . $_file + boottrace_sysctl "$_file done" + else + $boottrace_cmd "$_file" "$_arg" + fi +} + +boottrace_sysctl() +{ + ${SYSCTL} kern.boottrace.boottrace="$1" +} + # # load_rc_config [service] # Source in the configuration file(s) for a given service. @@ -2195,3 +2217,8 @@ if kenv -q rc.debug > /dev/null ; then rc_debug=YES fi + +boottrace_cmd=`command -v boottrace` +if [ -n "$boottrace_cmd" ] && [ "`${SYSCTL_N} -q kern.boottrace.enabled`" = "1" ]; then + rc_boottrace=YES +fi