net.server_select: Add 'server' method to client connections (present in server_event)
[prosody.git] / net / server_select.lua
index 6191986340058c036ca5cce8d45f0aa236b060bd..eccc7239f21cd13a0bfce492b239eee8dd1e51fe 100644 (file)
@@ -51,6 +51,7 @@ local coroutine_yield = coroutine.yield
 local has_luasec, luasec = pcall ( require , "ssl" )
 local luasocket = use "socket" or require "socket"
 local luasocket_gettime = luasocket.gettime
+local getaddrinfo = luasocket.dns.getaddrinfo
 
 --// extern lib methods //--
 
@@ -397,6 +398,9 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
                out_put "server.lua: closed client handler and removed socket from list"
                return true
        end
+       handler.server = function ( )
+               return server
+       end
        handler.ip = function( )
                return ip
        end
@@ -588,8 +592,9 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
                                                coroutine_yield( ) -- handshake not finished
                                        end
                                end
-                               out_put( "server.lua: ssl handshake error: ", tostring(err or "handshake too long") )
-                               _ = handler and handler:force_close("ssl handshake failed")
+                               err = "ssl handshake error: " .. ( err or "handshake too long" );
+                               out_put( "server.lua: ", err );
+                               _ = handler and handler:force_close(err)
                                return false, err -- handshake failed
                        end
                )
@@ -910,6 +915,7 @@ loop = function(once) -- this is the main loop of the program
                socket_sleep( _sleeptime )
        until quitting;
        if once and quitting == "once" then quitting = nil; return; end
+       closeall();
        return "quitting"
 end
 
@@ -942,23 +948,37 @@ local wrapclient = function( socket, ip, serverport, listeners, pattern, sslctx
        return handler, socket
 end
 
-local addclient = function( address, port, listeners, pattern, sslctx )
+local addclient = function( address, port, listeners, pattern, sslctx, typ )
        local err
        if type( listeners ) ~= "table" then
                err = "invalid listener table"
-       elseif type ( addr ) ~= "string" then
+       elseif type ( address ) ~= "string" then
                err = "invalid address"
        elseif type( port ) ~= "number" or not ( port >= 0 and port <= 65535 ) then
                err = "invalid port"
        elseif sslctx and not has_luasec then
                err = "luasec not found"
        end
+       if not typ then
+               local addrinfo, err = getaddrinfo(address)
+               if not addrinfo then return nil, err end
+               if addrinfo[1] and addrinfo[1].family == "inet6" then
+                       typ = "tcp6"
+               else
+                       typ = "tcp"
+               end
+       end
+       local create = luasocket[typ]
+       if type( create ) ~= "function"  then
+               err = "invalid socket type"
+       end
+
        if err then
                out_error( "server.lua, addclient: ", err )
                return nil, err
        end
 
-       local client, err = luasocket.tcp( )
+       local client, err = create( )
        if err then
                return nil, err
        end