Date: Mon, 10 Apr 2000 00:10:50 -0700 From: Doug Barton <Doug@gorean.org> To: freebsd-hackers@freebsd.org, adrian@creative.net.au Subject: Safe sourcing of rc files Message-ID: <38F17E7A.5892318A@gorean.org>
next in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
Since the move to /etc/defaults/rc.conf, one of the consistent examples
of foot-shooting is the user blindly copying that file to /etc/rc.conf
without reading the warning at the end not to do this, or at least to
delete the bit at the end that does the recursive sourcing of
/etc/rc.conf and /etc/rc.conf.local.
After careful experimentation, and a few abortive attempts, I have
developed the following technique. The major change is that instead of
the files being sourced from the bit of code in /etc/defaults/rc.conf
itself, that file defines a function that the other scripts which source
/etc/defaults/rc.conf use to do the recursive sort. That function uses a
local variable to keep track of which files it has already sourced in
order to prevent an infinite loop. The use of the function and the local
variable allow the rc.conf* files to be sourced by rc, then sourced
again by rc.firewall (for example) and still do the right thing all the
way around.
I have done extensive testing with a set of scripts that I developed to
emulate the /etc/rc*'s. I have also tested it in place, rebooting with
various configurations, including and especially the standard bonehead
user mode mentioned above. In each case the following patch does the
right thing. My testing included scenarios with multiple /etc/rc.conf*
files.
I believe that the attached patch is ready to be committed. Discussion
is welcome. This patch is applicable to PR 17595.
Doug
--
Excess on occasion is exhilarating. It prevents moderation from
acquiring the deadening effect of a habit.
-- W. Somerset Maugham
[-- Attachment #2 --]
Index: netstart
===================================================================
RCS file: /usr/ncvs/src/etc/netstart,v
retrieving revision 1.54
diff -u -r1.54 netstart
--- netstart 1999/08/27 23:23:42 1.54
+++ netstart 2000/04/10 06:12:38
@@ -12,6 +12,7 @@
# If there is a global system configuration file, suck it in.
if [ -f /etc/defaults/rc.conf ]; then
. /etc/defaults/rc.conf
+ sourcercs
elif [ -f /etc/rc.conf ]; then
. /etc/rc.conf
fi
Index: pccard_ether
===================================================================
RCS file: /usr/ncvs/src/etc/pccard_ether,v
retrieving revision 1.15
diff -u -r1.15 pccard_ether
--- pccard_ether 2000/02/11 14:49:42 1.15
+++ pccard_ether 2000/04/10 06:12:51
@@ -11,6 +11,7 @@
#
if [ -r /etc/defaults/rc.conf ]; then
. /etc/defaults/rc.conf
+ sourcercs
elif [ -r /etc/rc.conf ]; then
. /etc/rc.conf
fi
Index: rc
===================================================================
RCS file: /usr/ncvs/src/etc/rc,v
retrieving revision 1.214
diff -u -r1.214 rc
--- rc 2000/03/27 16:36:25 1.214
+++ rc 2000/04/10 06:13:10
@@ -38,6 +38,7 @@
#
if [ -r /etc/defaults/rc.conf ]; then
. /etc/defaults/rc.conf
+ sourcercs
elif [ -r /etc/rc.conf ]; then
. /etc/rc.conf
fi
Index: rc.devfs
===================================================================
RCS file: /usr/ncvs/src/etc/rc.devfs,v
retrieving revision 1.7
diff -u -r1.7 rc.devfs
--- rc.devfs 1999/10/12 19:23:51 1.7
+++ rc.devfs 2000/04/10 06:13:23
@@ -5,6 +5,7 @@
#
if [ -r /etc/defaults/rc.conf ]; then
. /etc/defaults/rc.conf
+ sourcercs
elif [ -r /etc/rc.conf ]; then
. /etc/rc.conf
fi
Index: rc.diskless2
===================================================================
RCS file: /usr/ncvs/src/etc/rc.diskless2,v
retrieving revision 1.5
diff -u -r1.5 rc.diskless2
--- rc.diskless2 2000/01/06 18:17:38 1.5
+++ rc.diskless2 2000/04/10 06:13:37
@@ -7,6 +7,7 @@
#
if [ -r /etc/defaults/rc.conf ]; then
. /etc/defaults/rc.conf
+ sourcercs
elif [ -r /etc/rc.conf ]; then
. /etc/rc.conf
fi
Index: rc.firewall
===================================================================
RCS file: /usr/ncvs/src/etc/rc.firewall,v
retrieving revision 1.30
diff -u -r1.30 rc.firewall
--- rc.firewall 2000/02/06 19:24:37 1.30
+++ rc.firewall 2000/04/10 06:14:07
@@ -5,6 +5,7 @@
# Suck in the configuration variables.
if [ -r /etc/defaults/rc.conf ]; then
. /etc/defaults/rc.conf
+ sourcercs
elif [ -r /etc/rc.conf ]; then
. /etc/rc.conf
fi
Index: defaults/rc.conf
===================================================================
RCS file: /usr/ncvs/src/etc/defaults/rc.conf,v
retrieving revision 1.58
diff -u -r1.58 rc.conf
--- defaults/rc.conf 2000/04/03 19:24:19 1.58
+++ defaults/rc.conf 2000/04/10 06:43:12
@@ -294,9 +294,22 @@
#
#
-for i in ${rc_conf_files}; do
- if [ -f $i ]; then
- . $i
- fi
-done
+if [ -z "${sourcercs_defined}" ]; then
+ sourcercs_defined=yes
+ sourcercs ( ) {
+ local sourced_files
+ for i in ${rc_conf_files}; do
+ case "${sourced_files}" in
+ *:$i:*)
+ ;;
+ *)
+ sourced_files="${sourced_files}:$i:"
+ if [ -r $i ]; then
+ . $i
+ fi
+ ;;
+ esac
+ done
+ }
+fi
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?38F17E7A.5892318A>
