summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-06-29 14:48:32 +0000
committeryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-06-29 14:48:32 +0000
commit921f484775ea2a83462f354b8fff7fc1d5fe1297 (patch)
tree0633b4a90b5aaf32b7a3f0b26c68389c9af54837
parentf895d9f59462077fe57e2cddb71b6aeb827e3151 (diff)
merges r28401 and r28402 from trunk into ruby_1_9_2.
-- * ext/socket/raddrinfo.c (ruby_getaddrinfo__darwin): new workaround for getaddrinfo problem on Mac OS X Snow Leopard. [ruby-core:29427] patch by Wataru Kimura. [ruby-core:30842] -- add a comment. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_2@28484 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog6
-rw-r--r--ext/socket/raddrinfo.c28
-rw-r--r--test/socket/test_socket.rb9
3 files changed, 43 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 0c789091af..18f5ee828c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Wed Jun 23 21:17:32 2010 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/raddrinfo.c (ruby_getaddrinfo__darwin): new workaround for
+ getaddrinfo problem on Mac OS X Snow Leopard. [ruby-core:29427]
+ patch by Wataru Kimura. [ruby-core:30842]
+
Wed Jun 23 06:44:05 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
* configure.in (fchown): need to check. a patch by Eric Wong
diff --git a/ext/socket/raddrinfo.c b/ext/socket/raddrinfo.c
index 5478d1006c..54b62aae37 100644
--- a/ext/socket/raddrinfo.c
+++ b/ext/socket/raddrinfo.c
@@ -97,6 +97,33 @@ ruby_getnameinfo__aix(const struct sockaddr *sa, size_t salen,
ruby_getnameinfo__aix((sa), (salen), (host), (hostlen), (serv), (servlen), (flags))
#endif
+static int str_isnumber __P((const char *));
+
+#if defined(__APPLE__)
+/* fix [ruby-core:29427] */
+static int
+ruby_getaddrinfo__darwin(const char *nodename, const char *servname,
+ struct addrinfo *hints, struct addrinfo **res)
+{
+ const char *tmp_servname;
+ struct addrinfo tmp_hints;
+ tmp_servname = servname;
+ MEMCPY(&tmp_hints, hints, struct addrinfo, 1);
+ if (nodename && servname) {
+ if (str_isnumber(tmp_servname) && atoi(servname) == 0) {
+ tmp_servname = NULL;
+#ifdef AI_NUMERICSERV
+ if (tmp_hints.ai_flags) tmp_hints.ai_flags &= ~AI_NUMERICSERV;
+#endif
+ }
+ }
+ int error = getaddrinfo(nodename, tmp_servname, &tmp_hints, res);
+ return error;
+}
+#undef getaddrinfo
+#define getaddrinfo(node,serv,hints,res) ruby_getaddrinfo__darwin((node),(serv),(hints),(res))
+#endif
+
#ifndef GETADDRINFO_EMU
struct getaddrinfo_arg
{
@@ -316,6 +343,7 @@ rsock_getaddrinfo(VALUE host, VALUE port, struct addrinfo *hints, int socktype_h
}
#if defined(__APPLE__) && defined(__MACH__)
+ /* [ruby-dev:23164] */
{
struct addrinfo *r;
r = res;
diff --git a/test/socket/test_socket.rb b/test/socket/test_socket.rb
index 999976b999..179e83f316 100644
--- a/test/socket/test_socket.rb
+++ b/test/socket/test_socket.rb
@@ -60,6 +60,15 @@ class TestSocket < Test::Unit::TestCase
assert_raise(SocketError) { Socket.getaddrinfo("www.kame.net", 80, "AF_UNIX") }
end
+ def test_getaddrinfo_raises_no_errors_on_port_argument_of_0 # [ruby-core:29427]
+ assert_nothing_raised('[ruby-core:29427]'){ Socket.getaddrinfo('localhost', 0, Socket::AF_INET, Socket::SOCK_STREAM, nil, Socket::AI_CANONNAME) }
+ assert_nothing_raised('[ruby-core:29427]'){ Socket.getaddrinfo('localhost', '0', Socket::AF_INET, Socket::SOCK_STREAM, nil, Socket::AI_CANONNAME) }
+ assert_nothing_raised('[ruby-core:29427]'){ Socket.getaddrinfo('localhost', '00', Socket::AF_INET, Socket::SOCK_STREAM, nil, Socket::AI_CANONNAME) }
+ assert_raise(SocketError, '[ruby-core:29427]'){ Socket.getaddrinfo(nil, nil, Socket::AF_INET, Socket::SOCK_STREAM, nil, Socket::AI_CANONNAME) }
+ assert_nothing_raised('[ruby-core:29427]'){ TCPServer.open('localhost', 0) {} }
+ end
+
+
def test_getnameinfo
assert_raise(SocketError) { Socket.getnameinfo(["AF_UNIX", 80, "0.0.0.0"]) }
end