diff options
author | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-06-29 14:48:32 +0000 |
---|---|---|
committer | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-06-29 14:48:32 +0000 |
commit | 921f484775ea2a83462f354b8fff7fc1d5fe1297 (patch) | |
tree | 0633b4a90b5aaf32b7a3f0b26c68389c9af54837 /ext | |
parent | f895d9f59462077fe57e2cddb71b6aeb827e3151 (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
Diffstat (limited to 'ext')
-rw-r--r-- | ext/socket/raddrinfo.c | 28 |
1 files changed, 28 insertions, 0 deletions
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; |