summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-06-24 23:31:29 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-06-24 23:31:29 +0000
commit68a117d8e2ca53777af1c7bd88d14f5431f64787 (patch)
tree221b5ffeb34d4245ce1f652472cbc3ffe7039095 /ext
parent7d5188a2823801fd48c04be759705454c2bdb9c9 (diff)
* eval.c (rb_thread_atfork): remove "fork terminates thread"
warning. [ruby-dev: * object.c (rb_obj_clone): backport FL_FINALIZE patch from 1.9. [ruby-core:02786][ruby-core:03067] * ext/socket/socket.c (sock_sockaddr): Socket#gethostbyname() should give us packed address, not struct sockaddr. [ruby-core:03053] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@6516 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext')
-rw-r--r--ext/socket/socket.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/ext/socket/socket.c b/ext/socket/socket.c
index 2cf100cac8..574bb3963a 100644
--- a/ext/socket/socket.c
+++ b/ext/socket/socket.c
@@ -2044,7 +2044,24 @@ sock_sockaddr(addr, len)
struct sockaddr *addr;
size_t len;
{
- return rb_str_new((char*)addr, len);
+ char *ptr;
+
+ switch (addr->sa_family) {
+ case AF_INET:
+ ptr = (char*)&((struct sockaddr_in*)addr)->sin_addr.s_addr;
+ len = sizeof(((struct sockaddr_in*)addr)->sin_addr.s_addr);
+ break;
+#ifdef INET6
+ case AF_INET6:
+ ptr = (char*)&((struct sockaddr_in6*)addr)->sin6_addr.s6_addr;
+ len = sizeof(((struct sockaddr_in6*)addr)->sin6_addr.s6_addr);
+ break;
+#endif
+ default:
+ rb_raise(rb_eSocket, "unknown socket family:%d", addr->sa_family);
+ break;
+ }
+ return rb_str_new(ptr, len);
}
static VALUE