From bdee29794f33aeb62867fd324b87b9acf74eda56 Mon Sep 17 00:00:00 2001
From: "Dmitry E. Oboukhov" <unera@debian.org>
Date: Thu, 10 Jul 2014 14:41:17 +0400
Subject: [PATCH] Fix tcp_connect by Mons's review.

---
 src/lua/bsdsocket.lua     | 26 +++++++++++++++++++++++---
 test/box/bsdsocket.result |  4 ----
 test/box/bsdsocket.test   |  3 ++-
 3 files changed, 25 insertions(+), 8 deletions(-)

diff --git a/src/lua/bsdsocket.lua b/src/lua/bsdsocket.lua
index 284f1c156e..e0d701ee4f 100644
--- a/src/lua/bsdsocket.lua
+++ b/src/lua/bsdsocket.lua
@@ -929,9 +929,29 @@ local function tcp_connect(host, port, timeout)
                 break
             end
 
-            if s:writable(timeout) then
-                box.errno(0)
-                return s
+            while true do
+
+                if s:writable(timeout) then
+                    if s:peer(self) ~= nil then
+                        box.errno(0)
+                        return s
+
+                    elseif box.errno() ~= box.errno.EAGAIN then
+                        break
+                    end
+
+                    timeout = timeout - (box.time() - started)
+                    started = box.time()
+
+                    if timeout <= 0 then
+                        s:close()
+                        break
+                    end
+
+                else
+                    break
+                end
+
             end
         end
 
diff --git a/test/box/bsdsocket.result b/test/box/bsdsocket.result
index 6b76980062..2bae5340e9 100644
--- a/test/box/bsdsocket.result
+++ b/test/box/bsdsocket.result
@@ -724,10 +724,6 @@ lua s:close()
 ---
  - true
 ...
-lua box.socket.tcp_connect('mail.ru', 80, 0.00000000001)
----
- - nil
-...
 lua s = box.socket.tcp_connect('127.0.0.1', box.cfg.primary_port)
 ---
 ...
diff --git a/test/box/bsdsocket.test b/test/box/bsdsocket.test
index f051b8ed75..6211b77162 100644
--- a/test/box/bsdsocket.test
+++ b/test/box/bsdsocket.test
@@ -226,7 +226,8 @@ exec admin "lua string.match(header, '\\r\\n\\r\\n$') ~= nil"
 exec admin "lua string.match(header, '200 [Oo][Kk]') ~= nil"
 exec admin "lua s:close()"
 
-exec admin "lua box.socket.tcp_connect('mail.ru', 80, 0.00000000001)"
+# exec admin "lua box.socket.tcp_connect('mail.ru', 80, 0.00000000001)"
+# exec admin "lua box.socket.tcp_connect('mail.ru', 12345)"
 
 
 exec admin "lua s = box.socket.tcp_connect('127.0.0.1', box.cfg.primary_port)"
-- 
GitLab