[#39325] File.fnmatch の改良について — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

はじめまして、山本です。

18 messages 2004/03/05

[#39429] trial version of Ruby/Tk — Hidetoshi NAGAI <nagai@...>

永井@知能.九工大です.

18 messages 2004/03/23
[#39454] Re: trial version of Ruby/Tk — "Shirai,Kaoru" <shirai@...> 2004/03/31

白井です。

[#39460] Re: trial version of Ruby/Tk — Hidetoshi NAGAI <nagai@...> 2004/04/01

永井@知能.九工大です.

[#39465] Re: trial version of Ruby/Tk — "Shirai,Kaoru" <shirai@...> 2004/04/01

白井です。

[#39466] Re: trial version of Ruby/Tk — Hidetoshi NAGAI <nagai@...> 2004/04/01

永井@知能.九工大です.

[#39453] Re: int/int in Ruby2? — Masaaki Sakano <mas@...>

坂野 正明です。

36 messages 2004/03/31
[#39455] Re: int/int in Ruby2? — NISHIMATSU Takeshi <t-nissie@...> 2004/03/31

西松と申します.

[#39470] Re: int/int in Ruby2? — Masaaki Sakano <mas@...> 2004/04/01

坂野 正明です。

[#39473] Re: int/int in Ruby2? — matz@... (Yukihiro Matsumoto) 2004/04/01

まつもと ゆきひろです

[#39484] Re: int/int in Ruby2? — Masaaki Sakano <mas@...> 2004/04/03

坂野 正明です。

[#39528] Re: int/int in Ruby2? — "T Akutsu" <locrian@...> 2004/04/09

あくつです。なんかわくわくしてきだぞ。(^^;)

[ruby-list:39444] gethostbynameでホスト名が引けない

From: 堀川 久 <vzw00011@...>
Date: 2004-03-28 09:02:22 UTC
List: ruby-list #39444
こんにちは。

Socket/TCPSocket.gethostbyname()で"123.123.123.123"形式でアドレスを与
えるとホスト名が引けませんでした。

FreeBSD 4.6.2-RELEASE-p2 です。

getnameinfo()でエラーになっているようだったので、これを回避するように
しました。しかし、IPv4べったりになっています。どうするのが良いでしょう
か?

-- 
HORIKAWA Hisashi (in Kanji: 堀川 久)
Netsphere Laboratories  http://www.nslabs.jp/

Attachments (1)

socket-q1.diff (2.98 KB, text/x-diff)
--- ruby-1.8.1-20040308.orig/ext/socket/socket.c	2004-01-27 11:09:34.000000000 +0900
+++ ruby-1.8.1-20040308-cur/ext/socket/socket.c	2004-03-28 17:50:50.764725384 +0900
@@ -1027,57 +1027,63 @@
 #endif
 
 static VALUE
-make_hostent(addr, ipaddr)
-    struct addrinfo *addr;
-    VALUE (*ipaddr) _((struct sockaddr*, size_t));
+make_hostent(
+    VALUE host,
+    VALUE (*ipaddr)(const char*, int))
 {
-    struct addrinfo *ai;
-    struct hostent *h;
+    struct hostent* h;
+    in_addr_t ia;
     VALUE ary, names;
     char **pch;
+    const char* hostname = StringValueCStr(host);
 
     ary = rb_ary_new();
-    rb_ary_push(ary, rb_str_new2(addr->ai_canonname));
-#if defined(HAVE_GETIPNODEBYNAME)
-    {
-	int error;
 
-	h = getipnodebyname(addr->ai_canonname, addr->ai_family, AI_ALL, &error);
-    }
-#elif defined(HAVE_GETHOSTBYNAME2)
-    h = gethostbyname2(addr->ai_canonname, addr->ai_family);
-#else
-    h = gethostbyname(addr->ai_canonname);
-#endif
+    ia = inet_addr(hostname);
+    if (ia != (in_addr_t) -1)
+        h = gethostbyaddr(&ia, sizeof(ia), AF_INET);
+    else
+        h = gethostbyname(hostname);
+
     if (h) {
+        rb_ary_push(ary, rb_str_new2(h->h_name));
 	names = rb_ary_new();
 	if (h->h_aliases != NULL) {
 	    for (pch = h->h_aliases; *pch; pch++) {
 		rb_ary_push(names, rb_str_new2(*pch));
 	    }
 	}
-#if defined(HAVE_GETIPNODEBYNAME)
-	freehostent(h);
-#endif
     }
     else {
+        rb_ary_push(ary, rb_str_new2(hostname));
 	names = rb_ary_new2(0);
     }
     rb_ary_push(ary, names);
-    rb_ary_push(ary, INT2NUM(addr->ai_family));
-    for (ai = addr; ai; ai = ai->ai_next) {
-	rb_ary_push(ary, (*ipaddr)(ai->ai_addr, ai->ai_addrlen));
+    rb_ary_push(ary, INT2NUM(h->h_addrtype));
+    for (pch = h->h_addr_list; *pch; pch++) {
+        rb_ary_push(ary, (*ipaddr)(*pch, h->h_length));
     }
 
     return ary;
 }
 
 VALUE
-tcp_sockaddr(addr, len)
-    struct sockaddr *addr;
-    size_t len;
+tcp_sockaddr(
+    const char* addr,
+    int len)
 {
-    return make_ipaddr(addr);
+    char buf[1024];
+    char* p = buf;
+    if (len > 0) {
+        for (; len > 0; len--) {
+            p += sprintf(p, "%d.", *(unsigned char*) addr);
+            addr++;
+        }
+        *(p - 1) = '\0';
+    }
+    else
+        buf[0] = '\0';
+    return rb_str_new2(buf);
 }
 
 static VALUE
@@ -1085,7 +1091,7 @@
     VALUE obj, host;
 {
     rb_secure(3);
-    return make_hostent(sock_addrinfo(host, Qnil, SOCK_STREAM, AI_CANONNAME), tcp_sockaddr);
+    return make_hostent(host, tcp_sockaddr);
 }
 
 static VALUE
@@ -1984,11 +1990,11 @@
 }
 
 VALUE
-sock_sockaddr(addr, len)
-    struct sockaddr *addr;
-    size_t len;
+sock_sockaddr(
+    const char* addr,
+    int len)
 {
-    return rb_str_new((char*)addr, len);
+    return rb_str_new(addr, len);
 }
 
 static VALUE
@@ -1996,7 +2002,7 @@
     VALUE obj, host;
 {
     rb_secure(3);
-    return make_hostent(sock_addrinfo(host, Qnil, SOCK_STREAM, AI_CANONNAME), sock_sockaddr);
+    return make_hostent(host, sock_sockaddr);
 }
 
 static VALUE

In This Thread

Prev Next