Nmap Development mailing list archives
Re: [NSE][PATCH] datafiles.lua
From: Sven Klemm <sven () c3d2 de>
Date: Sat, 13 Sep 2008 09:23:03 +0200
Hi jah, jah wrote:
So I've tested the code with your patch and fixed some bugs and a couple of typo's, most of which were present from the start: not returning services in the same fashion as parse_services(protocol) did; bad logic prevented parse_file( filename, { } ) from returning an array of lines where filename was one of Nmap's data files (as it does for other files); creating a table key with a value of nil when the pattern for the key matches, but the pattern for the value doesn't - this was made most obvious by the recent changes as it prevented them returning the correct data and; a few minor details.
thanks for testing and posting your opinion and your patch. I've applied both patches. I have one more patch for datafiles. Currently parse_rpc(), parse_protocols() and parse_services() don't really have any functionality on their own but just call parse_file() with the filename as argument. So I removed the common_files table and moved the parse instructions to those functions. This certainly makes parse_file() nicer as we don't have to check for common_files in parse_file() anymore.
Cheers, Sven -- Sven Klemm http://cthulhu.c3d2.de/~sven/
Index: nselib/datafiles.lua =================================================================== --- nselib/datafiles.lua (revision 10129) +++ nselib/datafiles.lua (working copy) @@ -10,20 +10,6 @@ --- --- Holds tables containing captures for common data files, indexed by filename. --- @type table --- @name common_files -local common_files = { - ["nmap-rpc"] = { [function(ln) return tonumber( ln:match( "^%s*[^%s#]+%s+(%d+)" ) ) end] = "^%s*([^%s#]+)%s+%d+" }, - ["nmap-protocols"] = { [function(ln) return tonumber( ln:match( "^%s*[^%s#]+%s+(%d+)" ) ) end] = "^%s*([^%s#]+)%s+%d+" }, - ["nmap-services"] = { ["tcp"] = { [function(ln) return tonumber( ln:match( "^%s*[^%s#]+%s+(%d+)/tcp" ) ) end] = "^%s*([^%s#]+)%s+%d+/tcp" }, - ["udp"] = { [function(ln) return tonumber( ln:match( "^%s*[^%s#]+%s+(%d+)/udp" ) ) end] = "^%s*([^%s#]+)%s+%d+/udp" } - } - -} - - ---- -- This function reads and parses Nmap's nmap-protocols file. -- bool is a Boolean value indicating success. If bool is true, then the -- second returned value is a table with protocol numbers indexing the @@ -32,12 +18,7 @@ -- @return bool, table|err -- @see parse_file parse_protocols = function() - local status, protocols_table = parse_file("nmap-protocols") - if not status then - return false, "Error parsing nmap-protocols" - end - - return true, protocols_table + return parse_file("nmap-protocols", { [function(ln) return tonumber( ln:match( "^%s*[^%s#]+%s+(%d+)" ) ) end] = "^%s*([^%s#]+)%s+%d+" }) end @@ -50,12 +31,7 @@ -- @return bool, table|err -- @see parse_file parse_rpc = function() - local status, rpc_table = parse_file("nmap-rpc") - if not status then - return false, "Error parsing nmap-rpc" - end - - return true, rpc_table + return parse_file( "nmap-rpc", { [function(ln) return tonumber( ln:match( "^%s*[^%s#]+%s+(%d+)" ) ) end] = "^%s*([^%s#]+)%s+%d+" }) end @@ -72,16 +48,14 @@ -- @return bool, table|err -- @see parse_file parse_services = function(protocol) - if protocol and protocol ~= "tcp" and protocol ~= "udp" then - return false, "Bad protocol for nmap-services: use tcp or udp" - end + local parse = { ["tcp"] = { [function(ln) return tonumber( ln:match( "^%s*[^%s#]+%s+(%d+)/tcp" ) ) end] = "^%s*([^%s#]+)%s+%d+/tcp" }, + ["udp"] = { [function(ln) return tonumber( ln:match( "^%s*[^%s#]+%s+(%d+)/udp" ) ) end] = "^%s*([^%s#]+)%s+%d+/udp" } } - local status, services_table = parse_file("nmap-services", protocol) - if not status then - return false, "Error parsing nmap-services" + if protocol and not parse[protocol] then + return false, "Bad protocol for nmap-services: use tcp or udp" end - return true, services_table + return parse_file("nmap-services", parse[protocol] or parse) end @@ -100,16 +74,10 @@ return false, "Error in datafiles.parse_file: No file to parse." end - -- is filename a member of common_files? is second parameter a key in common_files or is it a table? - if common_files[filename] and type( arg[1] ) == "string" and common_files[filename][arg[1]] then - data_struct = { common_files[filename][arg[1]] } - elseif common_files[filename] and #arg == 0 then - data_struct = { common_files[filename] } - elseif type( arg[1] ) == "table" then - data_struct = arg - elseif type( arg[1] ) ~= "table" then + if type( arg[1] ) ~= "table" then return false, "Error in datafiles.parse_file: Expected second parameter as table." end + data_struct = arg if type( data_struct ) == "table" then for i, struc in ipairs( data_struct ) do
_______________________________________________ Sent through the nmap-dev mailing list http://cgi.insecure.org/mailman/listinfo/nmap-dev Archived at http://SecLists.Org
Current thread:
- [NSE][PATCH] datafiles.lua Sven Klemm (Sep 09)
- Re: [NSE][PATCH] datafiles.lua jah (Sep 09)
- Re: [NSE][PATCH] datafiles.lua Sven Klemm (Sep 10)
- Re: [NSE][PATCH] datafiles.lua jah (Sep 10)
- Re: [NSE][PATCH] datafiles.lua Sven Klemm (Sep 13)
- Re: [NSE][PATCH] datafiles.lua jah (Sep 13)
- Re: [NSE][PATCH] datafiles.lua Sven Klemm (Sep 15)
- Re: [NSE][PATCH] datafiles.lua David Fifield (Sep 15)
- Re: [NSE][PATCH] datafiles.lua Sven Klemm (Sep 10)
- Re: [NSE][PATCH] datafiles.lua jah (Sep 09)