plugins/mod_muc_unique: Fix undefined global access (thanks Lance)
[prosody.git] / net / server_select.lua
index 4a36617cf2f34bfaea531621b3a4f0dcfed8f339..9b8e41d9b682e5f5fb1b8da4e18be7b077269922 100644 (file)
@@ -286,6 +286,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
        local disconnect = listeners.ondisconnect
        local drain = listeners.ondrain
        local onreadtimeout = listeners.onreadtimeout;
+       local detach = listeners.ondetach
 
        local bufferqueue = { } -- buffer array
        local bufferqueuelen = 0        -- end of buffer array
@@ -317,11 +318,15 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
        handler.onreadtimeout = onreadtimeout;
 
        handler.setlistener = function( self, listeners )
+               if detach then
+                       detach(self) -- Notify listener that it is no longer responsible for this connection
+               end
                dispatch = listeners.onincoming
                disconnect = listeners.ondisconnect
                status = listeners.onstatus
                drain = listeners.ondrain
                handler.onreadtimeout = listeners.onreadtimeout
+               detach = listeners.ondetach
        end
        handler.getstats = function( )
                return readtraffic, sendtraffic
@@ -710,6 +715,7 @@ local function link(sender, receiver, buffersize)
                        sender:lock_read(true);
                end
        end
+       sender:set_mode("*a");
 end
 
 ----------------------------------// PUBLIC //--
@@ -966,7 +972,7 @@ local addclient = function( address, port, listeners, pattern, sslctx, typ )
        end
        client:settimeout( 0 )
        local ok, err = client:connect( address, port )
-       if ok or err == "timeout" then
+       if ok or err == "timeout" or err == "Operation already in progress" then
                return wrapclient( client, address, port, listeners, pattern, sslctx )
        else
                return nil, err