diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2006-11-02 15:38:59 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2006-11-02 15:38:59 +0000 |
commit | e88e146e1f44f3ae8d4b897281b17fcb0a2d228d (patch) | |
tree | 1bbc29ffb9da0002ba80a7aedbf5b90dd4841c32 /ext/socket/socket.c | |
parent | a5e61d3f2ec837ccf8a9214c14fb8d495d907ed9 (diff) | |
download | ruby-e88e146e1f44f3ae8d4b897281b17fcb0a2d228d.tar.gz ruby-e88e146e1f44f3ae8d4b897281b17fcb0a2d228d.tar.xz ruby-e88e146e1f44f3ae8d4b897281b17fcb0a2d228d.zip |
* ext/socket/socket.c (ruby_getnameinfo__aix): AF_INET6 workaround
for AIX. a patch from Yutaka Kanemoto <kinpoco AT gmail.com>.
[ruby-dev:29744]
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@11272 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/socket/socket.c')
-rw-r--r-- | ext/socket/socket.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/ext/socket/socket.c b/ext/socket/socket.c index acb8cdf7d..419f08c6d 100644 --- a/ext/socket/socket.c +++ b/ext/socket/socket.c @@ -188,6 +188,34 @@ ruby_getaddrinfo__aix(char *nodename, char *servname, } #undef getaddrinfo #define getaddrinfo(node,serv,hints,res) ruby_getaddrinfo__aix((node),(serv),(hints),(res)) +static int +ruby_getnameinfo__aix(sa, salen, host, hostlen, serv, servlen, flags) + const struct sockaddr *sa; + size_t salen; + char *host; + size_t hostlen; + char *serv; + size_t servlen; + int flags; +{ + struct sockaddr_in6 *sa6; + u_int32_t *a6; + + if (sa->sa_family == AF_INET6) { + sa6 = (struct sockaddr_in6 *)sa; + a6 = sa6->sin6_addr.u6_addr.u6_addr32; + + if (a6[0] == 0 && a6[1] == 0 && a6[2] == 0 && a6[3] == 0) { + strncpy(host, "::", hostlen); + snprintf(serv, servlen, "%d", sa6->sin6_port); + return 0; + } + } + return getnameinfo(sa, salen, host, hostlen, serv, servlen, flags); +} +#undef getnameinfo +#define getnameinfo(sa, salen, host, hostlen, serv, servlen, flags) \ + ruby_getnameinfo__aix((sa), (salen), (host), (hostlen), (serv), (servlen), (flags)) #ifndef CMSG_SPACE # define CMSG_SPACE(len) (_CMSG_ALIGN(sizeof(struct cmsghdr)) + _CMSG_ALIGN(len)) #endif |