diff options
author | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-04-20 02:11:10 +0000 |
---|---|---|
committer | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-04-20 02:11:10 +0000 |
commit | b88296be43b7fe0c0a3b477dae04aa26ee71128e (patch) | |
tree | d47ee804618835c70185fe3a54e5dc2cfa93e175 | |
parent | 038c0e5a804f1736e884f6741b9d7e84606580d7 (diff) |
connect_nonblock(..., exception: false) does not raise EISCONN
* ext/socket/socket.c (sock_connect_nonblock): do not raise EISCONN
[ruby-core:68926] [Feature #11072]
* test/socket/test_nonblock.rb: check non-EISCONN on 2nd connect
This is to reduce exceptions for code which issues a
(IMHO, unnecessary) second connect() syscall.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50347 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | ext/socket/socket.c | 6 | ||||
-rw-r--r-- | test/socket/test_nonblock.rb | 2 |
3 files changed, 14 insertions, 0 deletions
@@ -1,3 +1,9 @@ +Mon Apr 20 11:10:46 2015 Eric Wong <[email protected]> + + * ext/socket/socket.c (sock_connect_nonblock): do not raise EISCONN + [ruby-core:68926] [Feature #11072] + * test/socket/test_nonblock.rb: check non-EISCONN on 2nd connect + Sun Apr 19 12:19:17 2015 Chad Brewbaker <[email protected]> * ext/{etc,openssl,tk}: Adding parens and comparisons around diff --git a/ext/socket/socket.c b/ext/socket/socket.c index a514b9ab09..bb23703706 100644 --- a/ext/socket/socket.c +++ b/ext/socket/socket.c @@ -509,6 +509,12 @@ sock_connect_nonblock(int argc, VALUE *argv, VALUE sock) } rb_readwrite_sys_fail(RB_IO_WAIT_WRITABLE, "connect(2) would block"); } + if (errno == EISCONN) { + if (!NIL_P(opts) && + Qfalse == rb_hash_lookup2(opts, sym_exception, Qundef)) { + return INT2FIX(0); + } + } rsock_sys_fail_raddrinfo_or_sockaddr("connect(2)", addr, rai); } diff --git a/test/socket/test_nonblock.rb b/test/socket/test_nonblock.rb index 6912046879..98de00eed9 100644 --- a/test/socket/test_nonblock.rb +++ b/test/socket/test_nonblock.rb @@ -69,6 +69,8 @@ class TestSocketNonblock < Test::Unit::TestCase assert_equal :wait_writable, rv end assert_equal([ [], [c], [] ], IO.select(nil, [c], nil, 60)) + assert_equal(0, c.connect_nonblock(servaddr, exception: false), + 'there should be no EISCONN error') s, sockaddr = serv.accept assert_equal(Socket.unpack_sockaddr_in(c.getsockname), Socket.unpack_sockaddr_in(sockaddr)) |