aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Makonnen <mtm@FreeBSD.org>2004-07-24 14:56:21 +0000
committerMike Makonnen <mtm@FreeBSD.org>2004-07-24 14:56:21 +0000
commit15eb1e8b45c557d8c756eebf9cf4207b706a2fd1 (patch)
tree1de98826a1f0bbc22606d374247c4d05cc5f4af7
parentb874fdd40d97ab49421e3b21d58aff36842854c7 (diff)
Notes
-rw-r--r--UPDATING13
-rw-r--r--etc/rc.d/localpkg155
-rw-r--r--sys/sys/param.h2
3 files changed, 148 insertions, 22 deletions
diff --git a/UPDATING b/UPDATING
index ce31b1a76771..fa1fca8986cd 100644
--- a/UPDATING
+++ b/UPDATING
@@ -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>