zoneconf.in: Isolate our local variables from the configuration file.
authorMark Wooding <mdw@distorted.org.uk>
Thu, 24 Jan 2013 09:56:48 +0000 (09:56 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Thu, 24 Jan 2013 09:56:48 +0000 (09:56 +0000)
I had a signature failure after changing the configuration file caused
by variables set in the config file interfering with those in the
command procedure.  There are good reasons why `confspc-eval' uses
`uplevel'; but this situation is bad, so it wants fixing properly.

Introduce a new procedure `isolate' which exists largely so its
variables can be clobbered with impunity.

zoneconf.in

index d16e74a..22f170f 100755 (executable)
@@ -198,6 +198,13 @@ proc run {what command args} {
   }
 }
 
+proc isolate {body} {
+  ## Evaluate BODY without changing the caller's variables.  Return its
+  ## result.
+
+  eval $body
+}
+
 ###--------------------------------------------------------------------------
 ### Configuration spaces.
 ###
@@ -1330,7 +1337,7 @@ defcmd outputs {} {
 } {
   global ZONECFG CONFFILE
 
-  confspc-eval toplevel [list source $CONFFILE]
+  isolate [list confspc-eval toplevel [list source $CONFFILE]]
   foreach view $ZONECFG(all-views) { puts [output-file-name $view] }
 }
 
@@ -1340,7 +1347,7 @@ defcmd update {} {
   global ZONECFG ZONES CONFFILE
 
   ## Read the configuration.
-  confspc-eval toplevel [list source $CONFFILE]
+  isolate [list confspc-eval toplevel [list source $CONFFILE]]
 
   ## Safely update the files.
   set win false
@@ -1395,7 +1402,7 @@ provided by the named USER."
   global QUIS ZONECFG ZONES CONFFILE errorInfo errorCode
 
   ## Read the configuration.
-  confspc-eval toplevel [list source $CONFFILE]
+  isolate [list confspc-eval toplevel [list source $CONFFILE]]
 
   ## Make sure there's a temporary directory.
   file mkdir [file join $ZONECFG(home-dir) "tmp"]
@@ -1494,7 +1501,7 @@ defcmd sign {} {
   set rc 0
 
   ## Read the configuration.
-  confspc-eval toplevel [list source $CONFFILE]
+  isolate [list confspc-eval toplevel [list source $CONFFILE]]
 
   ## Grind through all of the zones.
   array unset seen