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