X-Git-Url: http://git.archive.openwrt.org/?a=blobdiff_plain;f=modules%2Fluci-base%2Fluasrc%2Futil.lua;h=0e7334be87dc769c943ab5e464c52018c6bb928c;hb=8f5be58a56dee85189eaf5a3ecb3e73b89d8288d;hp=787bc66f90636c0c6c0e8e5f275a6cea2753017d;hpb=c123fa86b02f7e9ecd7d474a03359628b444bd1d;p=project%2Fluci.git diff --git a/modules/luci-base/luasrc/util.lua b/modules/luci-base/luasrc/util.lua index 787bc66f9..0e7334be8 100644 --- a/modules/luci-base/luasrc/util.lua +++ b/modules/luci-base/luasrc/util.lua @@ -16,7 +16,7 @@ local _ubus_connection = nil local getmetatable, setmetatable = getmetatable, setmetatable local rawget, rawset, unpack = rawget, rawset, unpack -local tostring, type, assert = tostring, type, assert +local tostring, type, assert, error = tostring, type, assert, error local ipairs, pairs, next, loadstring = ipairs, pairs, next, loadstring local require, pcall, xpcall = require, pcall, xpcall local collectgarbage, get_memory_limit = collectgarbage, get_memory_limit @@ -27,14 +27,27 @@ module "luci.util" -- Pythonic string formatting extension -- getmetatable("").__mod = function(a, b) + local ok, res + if not b then return a elseif type(b) == "table" then + local k, _ for k, _ in pairs(b) do if type(b[k]) == "userdata" then b[k] = tostring(b[k]) end end - return a:format(unpack(b)) + + ok, res = pcall(a.format, a, unpack(b)) + if not ok then + error(res, 2) + end + return res else if type(b) == "userdata" then b = tostring(b) end - return a:format(b) + + ok, res = pcall(a.format, a, b) + if not ok then + error(res, 2) + end + return res end end @@ -151,6 +164,28 @@ function striptags(value) return value and tparser.striptags(tostring(value)) end +-- for bash, ash and similar shells single-quoted strings are taken +-- literally except for single quotes (which terminate the string) +-- (and the exception noted below for dash (-) at the start of a +-- command line parameter). +function shellsqescape(value) + local res + res, _ = string.gsub(value, "'", "'\\''") + return res +end + +-- bash, ash and other similar shells interpret a dash (-) at the start +-- of a command-line parameters as an option indicator regardless of +-- whether it is inside a single-quoted string. It must be backlash +-- escaped to resolve this. This requires in some funky special-case +-- handling. It may actually be a property of the getopt function +-- rather than the shell proper. +function shellstartsqescape(value) + res, _ = string.gsub(value, "^\-", "\\-") + res, _ = string.gsub(res, "^-", "\-") + return shellsqescape(value) +end + -- containing the resulting substrings. The optional max parameter specifies -- the number of bytes to process, regardless of the actual length of the given -- string. The optional last parameter, regex, specifies whether the separator @@ -614,6 +649,23 @@ function libpath() return require "nixio.fs".dirname(ldebug.__file__) end +function checklib(fullpathexe, wantedlib) + local fs = require "nixio.fs" + local haveldd = fs.access('/usr/bin/ldd') + if not haveldd then + return false + end + local libs = exec("/usr/bin/ldd " .. fullpathexe) + if not libs then + return false + end + for k, v in ipairs(split(libs)) do + if v:find(wantedlib) then + return true + end + end + return false +end -- -- Coroutine safe xpcall and pcall versions modified for Luci