[#3006] CVS repository — "Eugene Scripnik" <hoaz@...>

Hello.

21 messages 2004/06/16
[#3008] Re: CVS repository — ts <decoux@...> 2004/06/16

>>>>> "E" == Eugene Scripnik <hoaz@gala.net> writes:

[#3009] Re: CVS repository — Michal Rokos <michal@...> 2004/06/16

Hi!

[#3057] Ruby 1.8.2 to be released. — matz@... (Yukihiro Matsumoto)

Hi,

20 messages 2004/06/23

Re: More networking issues

From: matz@... (Yukihiro Matsumoto)
Date: 2004-06-23 16:06:37 UTC
List: ruby-core #3056
Hi,

In message "More networking issues"
    on 04/06/23, Dave Thomas <dave@pragprog.com> writes:

|In 1.6, gethostbyname returned (for IPv4) the 4 byte address of the 
|given host. In Ruby 1.9, it returns a 16 byte structure, which I'm 
|assuming is a sockaddr_in.
|
|First, is that correct--was there a change between 1.6 and 1.8/9 on the 
|return type of gethostbyname?

You're right.  1.8 (and 1.9) return packed struct sockaddr, but it
should return packed address information.  Can you try the attached
fix?

							matz.

Index: ext/socket/socket.c
===================================================================
RCS file: /var/cvs/src/ruby/ext/socket/socket.c,v
retrieving revision 1.125
diff -p -u -1 -r1.125 socket.c
--- ext/socket/socket.c	23 Jun 2004 13:22:28 -0000	1.125
+++ ext/socket/socket.c	23 Jun 2004 16:05:34 -0000
@@ -2097,3 +2097,20 @@ sock_sockaddr(addr, 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);
 }

In This Thread