diff options
Diffstat (limited to '')
-rw-r--r-- | nselib/match.lua | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/nselib/match.lua b/nselib/match.lua new file mode 100644 index 0000000..a514cf8 --- /dev/null +++ b/nselib/match.lua @@ -0,0 +1,62 @@ +--- +-- Buffered network I/O helper functions. +-- +-- The functions in this module can be used for delimiting data received by the +-- <code>nmap.receive_buf</code> function in the Network I/O API (which see). +-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html + +local stdnse = require "stdnse" +local find = (require "string").find +_ENV = stdnse.module("match", stdnse.seeall) + +--various functions for use with NSE's nsock:receive_buf - function + +-- e.g. +-- sock:receive_buf(numbytes(80), true) - is the buffered version of +-- sock:receive_bytes(80) - i.e. it +-- returns exactly 80 bytes and no more + +--- Return a function that allows delimiting at a certain number of bytes. +-- +-- This function can be used to get a buffered version of +-- <code>sock:receive_bytes(n)</code> in case a script requires more than one +-- fixed-size chunk, as the unbuffered version may return more bytes than +-- requested and thus would require you to do the parsing on your own. +-- +-- The <code>keeppattern</code> parameter to receive_buf should be set to +-- <code>true</code>, otherwise the string returned will be 1 less than +-- <code>num</code> +-- @param num Number of bytes. +-- @usage sock:receive_buf(match.numbytes(80), true) +-- @see nmap.receive_buf +numbytes = function(num) + local n = num + return function(buf) + if(#buf >=n) then + return n, n + end + return nil + end +end + +--- Search for a pattern within a set number of bytes +-- +-- This function behaves just like passing a pattern to receive_buf, but it +-- will only receive a predefined number of bytes before returning the buffer. +-- @param pattern The pattern to search for +-- @param within The number of bytes to consume +-- @usage sock:receive_buf(match.pattern_limit("\r\n", 80), true) +pattern_limit = function (pattern, within) + local n = within + return function(buf) + local left, right = find(buf, pattern) + if left then + return left, right + elseif #buf >= n then + return n, n + end + return nil + end +end + +return _ENV; |