diff options
Diffstat (limited to 'etc/forward.lua')
-rw-r--r-- | etc/forward.lua | 65 |
1 files changed, 0 insertions, 65 deletions
diff --git a/etc/forward.lua b/etc/forward.lua deleted file mode 100644 index 05ced1a..0000000 --- a/etc/forward.lua +++ /dev/null | |||
@@ -1,65 +0,0 @@ | |||
1 | -- load our favourite library | ||
2 | local dispatch = require("dispatch") | ||
3 | local handler = dispatch.newhandler() | ||
4 | |||
5 | -- make sure the user knows how to invoke us | ||
6 | if #arg < 1 then | ||
7 | print("Usage") | ||
8 | print(" lua forward.lua <iport:ohost:oport> ...") | ||
9 | os.exit(1) | ||
10 | end | ||
11 | |||
12 | -- function to move data from one socket to the other | ||
13 | local function move(foo, bar) | ||
14 | local live | ||
15 | while 1 do | ||
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 | ||
21 | foo:close() | ||
22 | bar:close() | ||
23 | break | ||
24 | end | ||
25 | end | ||
26 | end | ||
27 | |||
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() | ||
40 | while 1 do | ||
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 | ||
50 | -- client to peer | ||
51 | handler:start(function() | ||
52 | move(client, peer) | ||
53 | end) | ||
54 | -- afte starting new handler, enter in loop sending data from | ||
55 | -- peer to client | ||
56 | move(peer, client) | ||
57 | end) | ||
58 | end | ||
59 | end) | ||
60 | end | ||
61 | |||
62 | -- simply loop stepping the server | ||
63 | while 1 do | ||
64 | handler:step() | ||
65 | end | ||