[#7300] resolver を呼ばない UDPsocket#recvfrom — Toshihiko SHIMOKAWA / 下川俊彦 <toshi@...>

あんまり ruby-dev な話でも無いのですが、ちょっとした機能拡張の提案なので、

12 messages 1999/07/12
[#7321] Re: resolver を呼ばない UDPsocket#recvfrom — Toshihiko SHIMOKAWA / 下川俊彦 <toshi@...> 1999/07/15

From: Toshihiko SHIMOKAWA / 下川俊彦 <toshi@csce.kyushu-u.ac.jp>

[#7313] Ruby 1.3.5 — Yukihiro Matsumoto <matz@...>

Ruby 1.3.5 is out, check out:

59 messages 1999/07/15
[#7318] Re: Ruby 1.3.5 — WATANABE Hirofumi <watanabe@...> 1999/07/15

わたなべです.

[#7326] Re: Ruby 1.3.5 — Wakou Aoyama <wakou@...> 1999/07/15

青山です。

[#7331] Re: Ruby 1.3.5 — matz@... (Yukihiro Matsumoto) 1999/07/16

まつもと ゆきひろです

[#7340] Re: Ruby 1.3.5 — Wakou Aoyama <wakou@...> 1999/07/16

青山です。

[#7368] Re: Ruby 1.3.5 — matz@... (Yukihiro Matsumoto) 1999/07/19

まつもと ゆきひろです

[#7373] Re: Ruby 1.3.5 — Shin-ichiro Hara <sinara@...> 1999/07/19

原です。

[#7374] Re: Ruby 1.3.5 — matz@... (Yukihiro Matsumoto) 1999/07/19

まつもと ゆきひろです

[#7382] Re: Ruby 1.3.5 — Wakou Aoyama <wakou@...> 1999/07/19

青山です。

[#7386] Re: Ruby 1.3.5 — matz@... (Yukihiro Matsumoto) 1999/07/21

まつもと ゆきひろです

[#7388] Re: Ruby 1.3.5 — Wakou Aoyama <wakou@...> 1999/07/21

青山です。

[#7387] [PATCH]extconf.rb, tcltklib.c, and rubytest.rb for NetBSD — Ryo HAYASAKA <hayasaka@...21.u-aizu.ac.jp>

早坂@会津大学です。

10 messages 1999/07/21

[#7466] [PATCH] for djgpp — WATANABE Hirofumi <watanabe@...>

わたなべです.

21 messages 1999/07/29
[#7467] Re: [PATCH] for djgpp — Katsuyuki Komatsu <komatsu@...> 1999/07/29

小松です。

[ruby-dev:7321] Re: resolver を呼ばない UDPsocket#recvfrom

From: Toshihiko SHIMOKAWA / 下川俊彦 <toshi@...>
Date: 1999-07-15 12:24:11 UTC
List: ruby-dev #7321
From: Toshihiko SHIMOKAWA / 下川俊彦 <toshi@csce.kyushu-u.ac.jp>
Subject: [ruby-dev:7300] resolver を呼ばない UDPsocket#recvfrom
Date: Mon, 12 Jul 1999 11:53:12 +0900

> あまり一般的な要望では無いのは承知していますが、採用されると嬉しいなぁ。

案の定、全く反応が無い要望ですが、今回はちとましな patch を作ってみまし
た。

UDPsocket#recvfrom_noresolv ってメソッドを追加してみました。recvfrom に
引数付けるより影響少そうかな、と思いまして。

ruby-1.3.5 への patch です。こんなんだと採用の見込みあるかしらん?
--
としちゃん


Attachments (1)

dif (3.69 KB, text/plain)
--- socket.c-dist	Thu Jun 24 13:24:06 1999
+++ socket.c	Thu Jul 15 21:08:14 1999
@@ -329,7 +329,7 @@
     return INT2FIX(n);
 }
 
-static VALUE ipaddr _((struct sockaddr *));
+static VALUE ipaddr _((struct sockaddr *, int));
 #ifdef HAVE_SYS_UN_H
 static VALUE unixaddr _((struct sockaddr_un *));
 #endif
@@ -338,6 +338,7 @@
     RECV_RECV,			/* BasicSocket#recv(no from) */
     RECV_TCP,			/* TCPSocket#recvfrom */
     RECV_UDP,			/* UDPSocket#recvfrom */
+    RECV_UDP_NORESOLV,		/* UDPSocket#recvfrom_noresolv */
     RECV_UNIX,			/* UNIXSocket#recvfrom */
     RECV_SOCKET,		/* Socket#recvfrom */
 };
@@ -397,10 +398,17 @@
 	    rb_raise(rb_eTypeError, "sockaddr size differs - should not happen");
 	}
 #endif
-	return rb_assoc_new(str, ipaddr((struct sockaddr *)buf));
+	return rb_assoc_new(str, ipaddr((struct sockaddr *)buf, 1));
       case RECV_UDP:
         {
-	    VALUE addr = ipaddr((struct sockaddr *)buf);
+	    VALUE addr = ipaddr((struct sockaddr *)buf, 1);
+
+	    return rb_assoc_new(str, rb_assoc_new(RARRAY(addr)->ptr[2],
+						  RARRAY(addr)->ptr[1]));
+	}
+      case RECV_UDP_NORESOLV:
+        {
+	    VALUE addr = ipaddr((struct sockaddr *)buf, 0);
 
 	    return rb_assoc_new(str, rb_assoc_new(RARRAY(addr)->ptr[2],
 						  RARRAY(addr)->ptr[1]));
@@ -530,8 +538,9 @@
 }
 
 static VALUE
-ipaddr(sockaddr)
+ipaddr(sockaddr, flag)
     struct sockaddr *sockaddr;
+    int flag;
 {
     VALUE family, port, addr1, addr2;
     VALUE ary;
@@ -552,17 +561,23 @@
 	family = 0;
 	break;
     }
-    error = getnameinfo(sockaddr, SA_LEN(sockaddr), hbuf, sizeof(hbuf),
-			NULL, 0, 0);
-    if (error) {
+    if (flag) {
+      error = getnameinfo(sockaddr, SA_LEN(sockaddr), hbuf, sizeof(hbuf),
+			  NULL, 0, 0);
+      if (error) {
 	rb_raise(rb_eSocket, "%s", gai_strerror(error));
+      }
+      addr1 = rb_str_new2(hbuf);
     }
-    addr1 = rb_str_new2(hbuf);
+
     error = getnameinfo(sockaddr, SA_LEN(sockaddr), hbuf, sizeof(hbuf),
 			pbuf, sizeof(pbuf), NI_NUMERICHOST | NI_NUMERICSERV);
     if (error) {
 	rb_raise(rb_eSocket, "%s", gai_strerror(error));
     }
+    if (!flag) {
+      addr1 = rb_str_new2(hbuf);
+    }
     addr2 = rb_str_new2(hbuf);
     port = INT2FIX(atoi(pbuf));
     ary = rb_ary_new3(4, family, port, addr1, addr2);
@@ -999,7 +1014,7 @@
 
     if (getsockname(fileno(fptr->f), (struct sockaddr*)&addr, &len) < 0)
 	rb_sys_fail("getsockname(2)");
-    return ipaddr((struct sockaddr *)&addr);
+    return ipaddr((struct sockaddr *)&addr, 1);
 }
 
 static VALUE
@@ -1014,7 +1029,7 @@
 
     if (getpeername(fileno(fptr->f), (struct sockaddr*)&addr, &len) < 0)
 	rb_sys_fail("getpeername(2)");
-    return ipaddr((struct sockaddr *)&addr);
+    return ipaddr((struct sockaddr *)&addr, 1);
 }
 
 static VALUE
@@ -1150,6 +1165,15 @@
     return s_recv(sock, argc, argv, RECV_UDP);
 }
 
+static VALUE
+udp_recvfrom_noresolv(argc, argv, sock)
+    int argc;
+    VALUE *argv;
+    VALUE sock;
+{
+    return s_recv(sock, argc, argv, RECV_UDP_NORESOLV);
+}
+
 #ifdef HAVE_SYS_UN_H
 static VALUE
 unix_s_sock_open(sock, path)
@@ -1528,7 +1552,7 @@
     }
     base = rb_ary_new();
     for (res = res0; res; res = res->ai_next) {
-	ary = ipaddr(res->ai_addr);
+	ary = ipaddr(res->ai_addr, 1);
 	rb_ary_push(ary, INT2FIX(res->ai_family));
 	rb_ary_push(ary, INT2FIX(res->ai_socktype));
 	rb_ary_push(ary, INT2FIX(res->ai_protocol));
@@ -1868,6 +1892,7 @@
     rb_define_method(rb_cUDPSocket, "bind", udp_bind, 2);
     rb_define_method(rb_cUDPSocket, "send", udp_send, -1);
     rb_define_method(rb_cUDPSocket, "recvfrom", udp_recvfrom, -1);
+    rb_define_method(rb_cUDPSocket, "recvfrom_noresolv", udp_recvfrom_noresolv, -1);
 
 #ifdef HAVE_SYS_UN_H
     rb_cUNIXSocket = rb_define_class("UNIXSocket", rb_cBasicSocket);

In This Thread