From: "Toshihiko SHIMOKAWA / 下川俊彦" Date: 1999-07-15T21:24:11+09:00 Subject: [ruby-dev:7321] Re: resolver を呼ばない UDPsocket#recvfrom ----Next_Part(Thu_Jul_15_21:23:34_1999_809)-- Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit From: Toshihiko SHIMOKAWA / 下川俊彦 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 です。こんなんだと採用の見込みあるかしらん? -- としちゃん ----Next_Part(Thu_Jul_15_21:23:34_1999_809)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=dif --- 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); ----Next_Part(Thu_Jul_15_21:23:34_1999_809)----