Ports related rc.d cleanups:

o Separate out local (ports) scripts that use rc.d, and the old style
  startup/shutdown scripts and execute them separately. On startup the
  rc.d style scripts are executed first and then the old-style scripts.
  On shutdown, exactly the reverse happens.
o The rc.d ports scripts should now behave more like base system scripts.
  Scripts ending in .sh will be sourced into the current shell, while the
  rest will be executed in a subshell. Previously, all ports scripts,
  regardless of the .sh suffix, were executed in a subshell.
o The parent script, /etc/rc.d/localpkg, passes its command line arguments
  straight to the rc.d ports scripts. This means they should now honor
  faststop and faststart commands as well. Old style scripts, should not see
  any differences. They will still get either a start or stop command.
o The initial phrase shown during shutdown has been changed to use
  "local packages" instead of "daemon processes" to be more inline with the
  phrase used during local package startup. The phrases are also used only for
  old-style ports script startup/shutdown, whereas previously they were being
  used for both rc.d and old-style scripts. This should make startup/shutdown
  output a bit less ugly.

Discussed with:	portmgr
Has Reservations: eik
This commit is contained in:
Mike Makonnen 2004-07-24 14:56:21 +00:00
parent b874fdd40d
commit 15eb1e8b45
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=132597
3 changed files with 149 additions and 23 deletions

View File

@ -17,6 +17,19 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 5.x IS SLOW:
developers choose to disable these features on build machines
to maximize performance.
20040724:
The rc.d/loclpkg script now "does the right thing" with respect
to ports rc.d scripts. The most disruptive change is that scripts
ending in *.sh are sourced in the same shell as rc.d/localpkg (as
opposed to a subshell) and may cause the script to end prematurely
if a script calls exit. Some broken scripts may not recognize the
'fast' prefix to a command. The first problem can be fixed by simply
renaming the script so that it doesn't have a '.sh' ending. Another
temporary work-arround is to completely remove the 'PROVIDE' line
from the script. If you notice a broken ports rc.d script please
notify the maintainer. Legacy scripts should not be affected.
__FreeBSD_version bumped to 502124.
20040716:
The sound device drivers are renamed. `sound' is always required,
while `snd_*' should be configured accordingly to your hardware.

View File

@ -11,31 +11,120 @@
. /etc/rc.subr
name="localpkg"
start_cmd="pkg_start"
stop_cmd="pkg_stop"
_arg1="$1"
# script_is_rcd script
# Checks that script is an rc.d style script.
# Returns 0 if it is, otherwise, it returns 1.
#
script_is_rcd()
{
local _s match
_s="$1"
[ -z "$_s" ] && return 1
match=`grep -c -m1 '^# PROVIDE:' "$_s" 2> /dev/null`
[ "$match" = "1" ] && return 0
return 1
}
# cooked_scriptlist type
# Uses values from rc.conf(5) to prepare a list of scripts to
# execute. It assumes the global variable script_name_sep and IFS are set
# properly. If type is set to the string "rcd" the list will contain only
# rc.d style scripts and they will be ordered according to thier
# dependencies. If it is set to "rcOG" then it will contain
# only old style ports startup scripts. The list is echoed on stdout.
#
cooked_scriptlist()
{
local _type slist fpattern skip
slist=""
_type="$1"
case "$_type" in
rcd)
fpattern="*"
;;
rcOG)
fpattern="*.sh"
;;
*)
return
;;
esac
for dir in ${local_startup}; do
if [ -d "${dir}" ]; then
for script in ${dir}/${fpattern}; do
# Weed out scripts that don't belong in the
# category that we are preparing.
#
if [ "$_type" = "rcd" ]; then
case "$script" in
*.sample|*-dist)
continue;;
esac
script_is_rcd "$script" || continue
else
script_is_rcd "$script" && continue
fi
slist="${slist}${script_name_sep}${script}"
done
fi
done
# If this is an rc.d list put the scripts in the right order.
#
if [ "$_type" = "rcd" ]; then
skip="-s nostart"
[ `/sbin/sysctl -n security.jail.jailed` -eq 1 ] && \
skip="$skip -s nojail"
# Some scripts do not define a FreeBSD keyword, so we can't
# specify it in a keep list.
slist=`/sbin/rcorder ${skip} ${slist} 2>/dev/null`
# Substitute the newlines used by rcorder(8) with the
# script separator.
slist=`echo $slist | /usr/bin/tr "\n" "$script_name_sep"`
fi
echo -n $slist
}
pkg_start()
{
# For each dir in $local_startup, search for init scripts matching *.sh
#
local slist
case ${local_startup} in
[Nn][Oo] | '')
;;
*)
echo -n 'Local package initialization:'
slist=""
if [ -z "${script_name_sep}" ]; then
script_name_sep=" "
fi
for dir in ${local_startup}; do
if [ -d "${dir}" ]; then
for script in ${dir}/*.sh; do
slist="${slist}${script_name_sep}${script}"
done
fi
done
# Do rc.d style scripts.
#
script_save_sep="$IFS"
IFS="${script_name_sep}"
slist=`cooked_scriptlist rcd`
debug "localpkg rc.d scripts: $slist"
for script in ${slist}; do
run_rc_script "$script" "$_arg1"
done
IFS="${script_save_sep}"
# Do old-style ports startup scripts.
#
echo -n 'Local package initialization:'
script_save_sep="$IFS"
IFS="${script_name_sep}"
slist=`cooked_scriptlist rcOG`
debug "localpkg rcOG scripts: $slist"
for script in ${slist}; do
if [ -x "${script}" ]; then
(set -T
@ -53,26 +142,24 @@ pkg_start()
pkg_stop()
{
echo -n 'Shutting down daemon processes:'
local slist
# For each dir in $local_startup, search for init scripts matching *.sh
case ${local_startup} in
[Nn][Oo] | '')
;;
*)
slist=""
if [ -z "${script_name_sep}" ]; then
script_name_sep=" "
fi
for dir in ${local_startup}; do
if [ -d "${dir}" ]; then
for script in ${dir}/*.sh; do
slist="${slist}${script_name_sep}${script}"
done
fi
done
# Do old-style scripts
#
script_save_sep="$IFS"
IFS="${script_name_sep}"
slist=`cooked_scriptlist rcOG`
debug "localpkg rcOG scripts: $slist"
echo -n 'Shutting down local packages:'
for script in `reverse_list ${slist}`; do
if [ -x "${script}" ]; then
(set -T
@ -82,9 +169,35 @@ pkg_stop()
done
IFS="${script_save_sep}"
echo '.'
# Do rc.d style scripts
#
script_save_sep="$IFS"
IFS="${script_name_sep}"
slist=`cooked_scriptlist rcd`
debug "localpkg rc.d scripts: $slist"
for script in `reverse_list ${slist}`; do
run_rc_script "$script" $_arg1
done
;;
esac
}
load_rc_config $name
run_rc_command "$1"
# We can't use the normal rc.subr(8) start/stop plumbing
# because we call run_rc_script(), which unsets all the
# global variables that said plumbing needs.
#
case "$1" in
start|faststart)
pkg_start
;;
stop|faststop)
pkg_stop
;;
restart|fastrestart)
pkg_stop
pkg_start
;;
esac

View File

@ -55,7 +55,7 @@
* scheme is: <major><two digit minor><0 if release branch, otherwise 1>xx
*/
#undef __FreeBSD_version
#define __FreeBSD_version 502123 /* Master, propagated to newvers */
#define __FreeBSD_version 502124 /* Master, propagated to newvers */
#ifndef LOCORE
#include <sys/types.h>