aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDoug Barton <dougb@FreeBSD.org>2005-12-02 20:06:07 +0000
committerDoug Barton <dougb@FreeBSD.org>2005-12-02 20:06:07 +0000
commit0f3ce2b32c1dd5e82c838030e87f1f868cf58af9 (patch)
tree51bcd0baa3852d62ab93efd232c48f0a2015ed8a
parent0eeba503f696d3f00afb37b2c0d6f09011e90d04 (diff)
downloadsrc-0f3ce2b32c1dd5e82c838030e87f1f868cf58af9.tar.gz
src-0f3ce2b32c1dd5e82c838030e87f1f868cf58af9.zip
Introduce startup scripts from the local_startup directories to
the base rcorder. This is accomplished by running rcorder twice, first to get all the disks mounted (through mountcritremote), then again to include the local_startup directories. This dramatically changes the behavior of rc.d/localpkg, as all "local" scripts that have the new rc.d semantics are now run in the base rcorder, so only scripts that have not been converted yet will run in rc.d/localpkg. Make a similar change in rc.shutdown, and add some functions in rc.subr to support these changes. Bump __FreeBSD_version to reflect this change.
Notes
Notes: svn path=/head/; revision=153027
-rw-r--r--etc/rc34
-rw-r--r--etc/rc.d/localpkg37
-rw-r--r--etc/rc.shutdown8
-rw-r--r--etc/rc.subr38
-rw-r--r--sys/sys/param.h2
5 files changed, 84 insertions, 35 deletions
diff --git a/etc/rc b/etc/rc
index bc2e6f906cff..a94d923cf24d 100644
--- a/etc/rc
+++ b/etc/rc
@@ -53,7 +53,7 @@ export HOME PATH
. /etc/rc.subr
# Note: the system configuration files are loaded as part of
-# the RCNG system (rc.d/rcconf.sh). Do not load them here as it may
+# the rc.d system (rc.d/rcconf.sh). Do not load them here as it may
# interfere with diskless booting.
#
if [ "$1" = autoboot ]; then
@@ -72,10 +72,42 @@ fi
skip="-s nostart"
[ `/sbin/sysctl -n security.jail.jailed` -eq 1 ] && skip="$skip -s nojail"
+
+# Do a first pass to get everything up to mountcritremote so that
+# we can do a second pass that includes $local_startup directories
+#
files=`rcorder ${skip} /etc/rc.d/* 2>/dev/null`
for _rc_elem in ${files}; do
run_rc_script ${_rc_elem} ${_boot}
+
+ case "$_rc_elem" in
+ */mountcritremote) break ;;
+ esac
+done
+
+unset files local_rc
+
+# Now that disks are mounted, for each dir in $local_startup
+# search for init scripts that use the new rc.d semantics.
+#
+case ${local_startup} in
+[Nn][Oo] | '') ;;
+*) find_local_scripts_new ;;
+esac
+
+files=`rcorder ${skip} /etc/rc.d/* ${local_rc} 2>/dev/null`
+_skip_early=1
+for _rc_elem in ${files}; do
+ case "$_skip_early" in
+ 1) case "$_rc_elem" in
+ */mountcritremote) _skip_early=0 ;;
+ esac
+ continue
+ ;;
+ esac
+
+ run_rc_script ${_rc_elem} ${_boot}
done
echo ''
diff --git a/etc/rc.d/localpkg b/etc/rc.d/localpkg
index c4ade879024b..0eba5239fa1c 100644
--- a/etc/rc.d/localpkg
+++ b/etc/rc.d/localpkg
@@ -23,29 +23,16 @@ pkg_start()
;;
*)
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
- script_save_sep="$IFS"
- IFS="${script_name_sep}"
- for script in ${slist}; do
+ find_local_scripts_old
+ for script in ${zlist} ${slist}; do
if [ -x "${script}" ]; then
(set -T
trap 'exit 1' 2
${script} start)
elif [ -f "${script}" -o -L "${script}" ]; then
- echo -n " (skipping ${script##*/}, not executable)"
+ echo -n " (skipping ${script}, not executable)"
fi
done
- IFS="${script_save_sep}"
echo '.'
;;
esac
@@ -53,33 +40,19 @@ pkg_start()
pkg_stop()
{
- # For each dir in $local_startup, search for init scripts matching *.sh
case ${local_startup} in
[Nn][Oo] | '')
;;
*)
echo -n 'Shutting down daemon processes:'
- 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
- script_save_sep="$IFS"
- IFS="${script_name_sep}"
- for script in `reverse_list ${slist}`; do
+ find_local_scripts_old
+ for script in `reverse_list ${slist} ${zlist}`; do
if [ -x "${script}" ]; then
(set -T
trap 'exit 1' 2
${script} stop)
fi
done
- IFS="${script_save_sep}"
echo '.'
;;
esac
diff --git a/etc/rc.shutdown b/etc/rc.shutdown
index 075881f3d4f4..ebe79d74132b 100644
--- a/etc/rc.shutdown
+++ b/etc/rc.shutdown
@@ -82,7 +82,13 @@ fi
#
rcorder_opts="-k shutdown"
[ `/sbin/sysctl -n security.jail.jailed` -eq 1 ] && rcorder_opts="$rcorder_opts -s nojail"
-files=`rcorder ${rcorder_opts} /etc/rc.d/* 2>/dev/null`
+
+case ${local_startup} in
+[Nn][Oo] | '') ;;
+*) find_local_scripts_new ;;
+esac
+
+files=`rcorder ${rcorder_opts} /etc/rc.d/* ${local_rc} 2>/dev/null`
for _rc_elem in `reverse_list $files`; do
debug "run_rc_script $_rc_elem faststop"
diff --git a/etc/rc.subr b/etc/rc.subr
index ff88433c5e58..d3d52b71968a 100644
--- a/etc/rc.subr
+++ b/etc/rc.subr
@@ -1355,4 +1355,42 @@ geli_make_list()
echo ${devices2}
}
+# Find scripts in local_startup directories that use the old syntax
+#
+find_local_scripts_old () {
+ zlist=''
+ slist=''
+ for dir in ${local_startup}; do
+ if [ -d "${dir}" ]; then
+ for file in ${dir}/[0-9]*.sh; do
+ grep '^# PROVIDE:' $file >/dev/null 2>&1 &&
+ continue
+ zlist="$zlist $file"
+ done
+ for file in ${dir}/[^0-9]*.sh; do
+ grep '^# PROVIDE:' $file >/dev/null 2>&1 &&
+ continue
+ slist="$slist $file"
+ done
+ fi
+ done
+}
+
+find_local_scripts_new () {
+ local_rc=''
+ for dir in ${local_startup}; do
+ if [ -d "${dir}" ]; then
+ for file in `grep -l '^# PROVIDE:' ${dir}/*`; do
+ case "$file" in
+ *.sample) ;;
+ *) if [ -x "$file" ]; then
+ local_rc="${local_rc} ${file}"
+ fi
+ ;;
+ esac
+ done
+ fi
+ done
+}
+
fi
diff --git a/sys/sys/param.h b/sys/sys/param.h
index 7a19c81af93f..3cf4e58f33e7 100644
--- a/sys/sys/param.h
+++ b/sys/sys/param.h
@@ -57,7 +57,7 @@
* is created, otherwise 1.
*/
#undef __FreeBSD_version
-#define __FreeBSD_version 700006 /* Master, propagated to newvers */
+#define __FreeBSD_version 700007 /* Master, propagated to newvers */
#ifndef LOCORE
#include <sys/types.h>