diff options
| author | Mike Makonnen <mtm@FreeBSD.org> | 2004-07-24 14:56:21 +0000 |
|---|---|---|
| committer | Mike Makonnen <mtm@FreeBSD.org> | 2004-07-24 14:56:21 +0000 |
| commit | 15eb1e8b45c557d8c756eebf9cf4207b706a2fd1 (patch) | |
| tree | 1de98826a1f0bbc22606d374247c4d05cc5f4af7 | |
| parent | b874fdd40d97ab49421e3b21d58aff36842854c7 (diff) | |
Notes
| -rw-r--r-- | UPDATING | 13 | ||||
| -rw-r--r-- | etc/rc.d/localpkg | 155 | ||||
| -rw-r--r-- | sys/sys/param.h | 2 |
3 files changed, 148 insertions, 22 deletions
@@ -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. diff --git a/etc/rc.d/localpkg b/etc/rc.d/localpkg index add28fe00860..9ddd3837c767 100644 --- a/etc/rc.d/localpkg +++ b/etc/rc.d/localpkg @@ -11,31 +11,120 @@ . /etc/rc.subr name="localpkg" -start_cmd="pkg_start" -stop_cmd="pkg_stop" +_arg1="$1" -pkg_start() +# 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() { - # For each dir in $local_startup, search for init scripts matching *.sh + 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() +{ + 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 + + # 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 diff --git a/sys/sys/param.h b/sys/sys/param.h index 2a0a77eb60af..3575f1cada31 100644 --- a/sys/sys/param.h +++ b/sys/sys/param.h @@ -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> |
