Index: nse_main.lua =================================================================== --- nse_main.lua (revision 13398) +++ nse_main.lua (working copy) @@ -54,17 +54,19 @@ local traceback = debug.traceback; local byte = string.byte; +local find = string.find; local format = string.format; -local find = string.find; local gsub = string.gsub; local lower = string.lower; local match = string.match; +local concat = table.concat; local insert = table.insert; local remove = table.remove; local sort = table.sort; local nmap = require "nmap"; +local lpeg = require "lpeg" local cnse, rules = ...; -- The NSE C library and Script Rules @@ -490,11 +492,39 @@ progress "endTask"; end -do -- Load script arguments - local args = gsub((cnse.scriptargs or ""), "=([%w_]+)", "=\"%1\""); - local argsf, err = loadstring("return {"..args.."}", "Script Arguments"); +do -- Load script arguments (--script-args) + local given_args = cnse.scriptargs or ""; + + local space = lpeg.locale()space^0; + local V, P, S, C, Cc = lpeg.V, lpeg.P, lpeg.S, lpeg.C, lpeg.Cc; + + local parse_args = lpeg.Ct { + "table", + + table = space * C "{" * V "value_list" * C "}", + + value_list = space * (V "kv" + V "av") * space * + ((C "," * space * (#P "}" + V "value_list")) + #P "}"), + + kv = Cc "[" * V "string" * Cc "]" * space * C "=" * space * + (V "table" + V "string"), + + av = V "table" + V "string", + + string = V "qstring" + V "uqstring", + + qstring = C "'" * (C "\\'" + P "\\" / "\\\\" + C(1) - P "'")^0 * C "'"+ + C '"' * (C '\\"' + P "\\" / "\\\\" + C(1) - P '"')^0 * C '"', + + uqstring = Cc "'" * + (P "'" / "\\'" + P "\\" / "\\\\" + C(1) - S ",}= ")^1 * + Cc "'", + }; + + local args = concat(parse_args:match("{"..args.."}")); + local argsf, err = loadstring("return "..args, "Script Arguments"); if not argsf then - error("failed to parse --script-args:\n"..args.."\n"..err); + error("failed to parse --script-args:\n"..given_args.."\n"..err); else nmap.registry.args = argsf(); end