Bug in forward.lua. Wasn't breaking from the loop.

This commit is contained in:
Diego Nehab 2005-04-21 05:38:07 +00:00
parent 434e8e014c
commit 9596c7f95d
3 changed files with 18 additions and 12 deletions

View File

@ -2,7 +2,7 @@
local socket = require"socket" local socket = require"socket"
-- creates a new set data structure -- creates a new set data structure
function newset() function newset(a)
local reverse = {} local reverse = {}
local set = {} local set = {}
return setmetatable(set, {__index = { return setmetatable(set, {__index = {
@ -29,7 +29,7 @@ end
-- timeout before an inactive thread is kicked -- timeout before an inactive thread is kicked
local TIMEOUT = 10 local TIMEOUT = 10
-- set of connections waiting to receive data -- set of connections waiting to receive data
local receiving = newset() local receiving = newset(1)
-- set of sockets waiting to send data -- set of sockets waiting to send data
local sending = newset() local sending = newset()
-- context for connections and servers -- context for connections and servers
@ -77,8 +77,8 @@ function connect(who, host, port)
wait(who, "output") wait(who, "output")
ret, err = who:connect(host, port) ret, err = who:connect(host, port)
if not ret and err ~= "already connected" then if not ret and err ~= "already connected" then
kick(who)
kick(context[who].peer) kick(context[who].peer)
kick(who)
return return
end end
end end
@ -87,11 +87,11 @@ end
-- gets rid of a client -- gets rid of a client
function kick(who) function kick(who)
if who and context[who] then if who then
sending:remove(who) sending:remove(who)
receiving:remove(who) receiving:remove(who)
context[who] = nil
who:close() who:close()
context[who] = nil
end end
end end
@ -159,6 +159,7 @@ function forward(who)
if not rec_err then if not rec_err then
kick(who) kick(who)
kick(peer) kick(peer)
break
end end
end end
end end
@ -171,14 +172,18 @@ function go()
readable, writable = socket.select(receiving, sending) readable, writable = socket.select(receiving, sending)
-- for all readable connections, resume its thread -- for all readable connections, resume its thread
for _, who in ipairs(readable) do for _, who in ipairs(readable) do
if context[who] then
receiving:remove(who) receiving:remove(who)
coroutine.resume(context[who].thread, who) coroutine.resume(context[who].thread, who)
end end
end
-- for all writable connections, do the same -- for all writable connections, do the same
for _, who in ipairs(writable) do for _, who in ipairs(writable) do
if context[who] then
sending:remove(who) sending:remove(who)
coroutine.resume(context[who].thread, who) coroutine.resume(context[who].thread, who)
end end
end
-- put all inactive threads in death row -- put all inactive threads in death row
local now = socket.gettime() local now = socket.gettime()
local deathrow local deathrow

View File

@ -105,7 +105,7 @@ function metat.__index:send(sendt)
if self.pasvt then self:pasvconnect() end if self.pasvt then self:pasvconnect() end
-- get the transfer argument and command -- get the transfer argument and command
local argument = sendt.argument or local argument = sendt.argument or
url.unescape(string.gsub(sendt.path or "", "^/", "")) url.unescape(string.gsub(sendt.path or "", "^[/\\]", ""))
if argument == "" then argument = nil end if argument == "" then argument = nil end
local command = sendt.command or "stor" local command = sendt.command or "stor"
-- send the transfer command and check the reply -- send the transfer command and check the reply
@ -138,7 +138,7 @@ function metat.__index:receive(recvt)
self.try(self.pasvt or self.server, "need port or pasv first") self.try(self.pasvt or self.server, "need port or pasv first")
if self.pasvt then self:pasvconnect() end if self.pasvt then self:pasvconnect() end
local argument = recvt.argument or local argument = recvt.argument or
url.unescape(string.gsub(recvt.path or "", "^/", "")) url.unescape(string.gsub(recvt.path or "", "^[/\\]", ""))
if argument == "" then argument = nil end if argument == "" then argument = nil end
local command = recvt.command or "retr" local command = recvt.command or "retr"
self.try(self.tp:command(command, argument)) self.try(self.tp:command(command, argument))

View File

@ -213,13 +213,14 @@ static int meth_connect(lua_State *L)
unsigned short port = (unsigned short) luaL_checknumber(L, 3); unsigned short port = (unsigned short) luaL_checknumber(L, 3);
p_tm tm = tm_markstart(&tcp->tm); p_tm tm = tm_markstart(&tcp->tm);
const char *err = inet_tryconnect(&tcp->sock, address, port, tm); const char *err = inet_tryconnect(&tcp->sock, address, port, tm);
/* have to set the class even if it failed due to non-blocking connects */
aux_setclass(L, "tcp{client}", 1);
if (err) { if (err) {
lua_pushnil(L); lua_pushnil(L);
lua_pushstring(L, err); lua_pushstring(L, err);
return 2; return 2;
} }
/* turn master object into a client object */ /* turn master object into a client object */
aux_setclass(L, "tcp{client}", 1);
lua_pushnumber(L, 1); lua_pushnumber(L, 1);
return 1; return 1;
} }