1 -- load our favourite library
2 local dispatch
= require("dispatch")
3 local handler
= dispatch
.newhandler()
5 -- make sure the user knows how to invoke us
6 if table.getn(arg
) < 1 then
8 print(" lua forward.lua <iport:ohost:oport> ...")
12 -- function to move data from one socket to the other
13 local function move(foo
, bar
)
16 local data
, error, partial
= foo
:receive(2048)
17 live
= data
or error == "timeout"
18 data
= data
or partial
19 local result
, error = bar
:send(data
)
20 if not live
or not result
then
28 -- for each tunnel, start a new server
29 for i
, v
in ipairs(arg
) do
30 -- capture forwarding parameters
31 local _
, _
, iport
, ohost
, oport
= string.find(v
, "([^:]+):([^:]+):([^:]+)")
32 assert(iport
, "invalid arguments")
33 -- create our server socket
34 local server
= assert(handler
.tcp())
35 assert(server
:setoption("reuseaddr", true))
36 assert(server
:bind("*", iport
))
37 assert(server
:listen(32))
38 -- handler for the server object loops accepting new connections
39 handler
:start(function()
41 local client
= assert(server
:accept())
42 assert(client
:settimeout(0))
43 -- for each new connection, start a new client handler
44 handler
:start(function()
45 -- handler tries to connect to peer
46 local peer
= assert(handler
.tcp())
47 assert(peer
:settimeout(0))
48 assert(peer
:connect(ohost
, oport
))
49 -- if sucessful, starts a new handler to send data from
51 handler
:start(function()
54 -- afte starting new handler, enter in loop sending data from
62 -- simply loop stepping the server