Merge with 0.7
[prosody.git] / net / server_select.lua
index 76548f3f5f60ade4beb13ff4c467807d6fd0ef32..685cd13e978503f6bdc310399b5acca8e13c771d 100644 (file)
@@ -55,8 +55,8 @@ local coroutine_yield = coroutine.yield
 
 --// extern libs //--
 
-local luasec = select( 2, pcall( require, "ssl" ) )
-local luasocket = require "socket"
+local luasec = use "ssl"
+local luasocket = use "socket" or require "socket"
 
 --// extern lib methods //--
 
@@ -472,7 +472,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
                        _sendlistlen = removesocket( _sendlist, socket, _sendlistlen ) -- delete socket from writelist
                        _ = needtls and handler:starttls(nil, true)
                        _writetimes[ handler ] = nil
-               _ = toclose and handler.close( )
+                       _ = toclose and handler.close( )
                        return true
                elseif byte and ( err == "timeout" or err == "wantwrite" ) then -- want write
                        buffer = string_sub( buffer, byte + 1, bufferlen ) -- new buffer
@@ -532,75 +532,79 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
                        end
                )
        end
-       if sslctx then -- ssl?
-               handler:set_sslctx(sslctx);
-               out_put("server.lua: ", "starting ssl handshake")
-               local err
-               socket, err = ssl_wrap( socket, sslctx )        -- wrap socket
-               if err then
-                       out_put( "server.lua: ssl error: ", tostring(err) )
-                       --mem_free( )
-                       return nil, nil, err    -- fatal error
-               end
-               socket:settimeout( 0 )
-               handler.readbuffer = handshake
-               handler.sendbuffer = handshake
-               handshake( socket ) -- do handshake
-               if not socket then
-                       return nil, nil, "ssl handshake failed";
-               end
-       else
-               local sslctx;
-               handler.starttls = function( self, _sslctx, now )
-                       if _sslctx then
-                               sslctx = _sslctx;
-                               handler:set_sslctx(sslctx);
-                       end
-                       if not now then
-                               out_put "server.lua: we need to do tls, but delaying until later"
-                               needtls = true
-                               return
-                       end
-                       out_put( "server.lua: attempting to start tls on " .. tostring( socket ) )
-                       local oldsocket, err = socket
+       if luasec then
+               if sslctx then -- ssl?
+                       handler:set_sslctx(sslctx);
+                       out_put("server.lua: ", "starting ssl handshake")
+                       local err
                        socket, err = ssl_wrap( socket, sslctx )        -- wrap socket
-                       --out_put( "server.lua: sslwrapped socket is " .. tostring( socket ) )
                        if err then
-                               out_put( "server.lua: error while starting tls on client: ", tostring(err) )
-                               return nil, err -- fatal error
+                               out_put( "server.lua: ssl error: ", tostring(err) )
+                               --mem_free( )
+                               return nil, nil, err    -- fatal error
                        end
-                       
                        socket:settimeout( 0 )
+                       handler.readbuffer = handshake
+                       handler.sendbuffer = handshake
+                       handshake( socket ) -- do handshake
+                       if not socket then
+                               return nil, nil, "ssl handshake failed";
+                       end
+               else
+                       local sslctx;
+                       handler.starttls = function( self, _sslctx, now )
+                               if _sslctx then
+                                       sslctx = _sslctx;
+                                       handler:set_sslctx(sslctx);
+                               end
+                               if not now then
+                                       out_put "server.lua: we need to do tls, but delaying until later"
+                                       needtls = true
+                                       return
+                               end
+                               out_put( "server.lua: attempting to start tls on " .. tostring( socket ) )
+                               local oldsocket, err = socket
+                               socket, err = ssl_wrap( socket, sslctx )        -- wrap socket
+                               --out_put( "server.lua: sslwrapped socket is " .. tostring( socket ) )
+                               if err then
+                                       out_put( "server.lua: error while starting tls on client: ", tostring(err) )
+                                       return nil, err -- fatal error
+                               end
 
-                       -- add the new socket to our system
+                               socket:settimeout( 0 )
+       
+                               -- add the new socket to our system
+       
+                               send = socket.send
+                               receive = socket.receive
+                               shutdown = id
 
-                       send = socket.send
-                       receive = socket.receive
-                       shutdown = id
+                               _socketlist[ socket ] = handler
+                               _readlistlen = addsocket(_readlist, socket, _readlistlen)
 
-                       _socketlist[ socket ] = handler
-                       _readlistlen = addsocket(_readlist, socket, _readlistlen)
+                               -- remove traces of the old socket
 
-                       -- remove traces of the old socket
+                               _readlistlen = removesocket( _readlist, oldsocket, _readlistlen )
+                               _sendlistlen = removesocket( _sendlist, oldsocket, _sendlistlen )
+                               _socketlist[ oldsocket ] = nil
 
-                       _readlistlen = removesocket( _readlist, oldsocket, _readlistlen )
-                       _sendlistlen = removesocket( _sendlist, oldsocket, _sendlistlen )
-                       _socketlist[ oldsocket ] = nil
+                               handler.starttls = nil
+                               needtls = nil
 
-                       handler.starttls = nil
-                       needtls = nil
-                               
-                       -- Secure now
-                       ssl = true
+                               -- Secure now
+                               ssl = true
 
-                       handler.readbuffer = handshake
-                       handler.sendbuffer = handshake
-                       handshake( socket ) -- do handshake
+                               handler.readbuffer = handshake
+                               handler.sendbuffer = handshake
+                               handshake( socket ) -- do handshake
+                       end
+                       handler.readbuffer = _readbuffer
+                       handler.sendbuffer = _sendbuffer
                end
+       else
                handler.readbuffer = _readbuffer
                handler.sendbuffer = _sendbuffer
        end
-
        send = socket.send
        receive = socket.receive
        shutdown = ( ssl and id ) or socket.shutdown