svn commit: r334912 - head/stand/lua

Kyle Evans kevans at FreeBSD.org
Sun Jun 10 02:36:39 UTC 2018


Author: kevans
Date: Sun Jun 10 02:36:38 2018
New Revision: 334912
URL: https://svnweb.freebsd.org/changeset/base/334912

Log:
  lualoader: Support variable substitution in env var settings
  
  We support both of the following cases of substitution:
  
  bar="y"
  foo="${bar}"
  foo="$bar"
  
  The latter substitution syntax is, of course, not recommended- all
  punctuation must be considered potential variable names, and we do not go
  through the effort of searching the different combinations of, for instance,
  "$x.y.z" to determine if the variable is $x, $x.y, or $x.y.z.
  
  This is not officially documented as supported, but it has worked in
  forthloader for what is most likely a long time as `evaluate` is used to
  process the right hand side of the assignment.

Modified:
  head/stand/lua/config.lua

Modified: head/stand/lua/config.lua
==============================================================================
--- head/stand/lua/config.lua	Sun Jun 10 02:34:41 2018	(r334911)
+++ head/stand/lua/config.lua	Sun Jun 10 02:36:38 2018	(r334912)
@@ -102,6 +102,25 @@ local function setKey(key, name, value)
 	modules[key][name] = value
 end
 
+-- Escapes the named value for use as a literal in a replacement pattern.
+-- e.g. dhcp.host-name gets turned into dhcp%.host%-name to remove the special
+-- meaning.
+local function escapeName(name)
+	return name:gsub("([%p])", "%%%1")
+end
+
+local function processEnvVar(value)
+	for name in value:gmatch("${([^}]+)}") do
+		local replacement = loader.getenv(name) or ""
+		value = value:gsub("${" .. escapeName(name) .. "}", replacement)
+	end
+	for name in value:gmatch("$([%w%p]+)%s*") do
+		local replacement = loader.getenv(name) or ""
+		value = value:gsub("$" .. escapeName(name), replacement)
+	end
+	return value
+end
+
 local pattern_table = {
 	{
 		str = "^%s*(#.*)",
@@ -172,7 +191,7 @@ local pattern_table = {
 	{
 		str = "^%s*([%w%p]+)%s*=%s*\"([%w%s%p]-)\"%s*(.*)",
 		process = function(k, v)
-			if setEnv(k, v) ~= 0 then
+			if setEnv(k, processEnvVar(v)) ~= 0 then
 				print(MSG_FAILSETENV:format(k, v))
 			end
 		end,
@@ -181,7 +200,7 @@ local pattern_table = {
 	{
 		str = "^%s*([%w%p]+)%s*=%s*(%d+)%s*(.*)",
 		process = function(k, v)
-			if setEnv(k, v) ~= 0 then
+			if setEnv(k, processEnvVar(v)) ~= 0 then
 				print(MSG_FAILSETENV:format(k, tostring(v)))
 			end
 		end,


More information about the svn-src-head mailing list