summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-04-20 02:11:10 +0000
committernormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-04-20 02:11:10 +0000
commitb88296be43b7fe0c0a3b477dae04aa26ee71128e (patch)
treed47ee804618835c70185fe3a54e5dc2cfa93e175
parent038c0e5a804f1736e884f6741b9d7e84606580d7 (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--ChangeLog6
-rw-r--r--ext/socket/socket.c6
-rw-r--r--test/socket/test_nonblock.rb2
3 files changed, 14 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 3e4ea1d00f..a83ec77486 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Mon Apr 20 11:10:46 2015 Eric Wong <e@80x24.org>
+
+ * 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 <crb002@gmail.com>
* 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))