From: Thomas Uehlinger Date: 2004-02-06T07:03:12+09:00 Subject: Patch for socket.c: control reverse lookup for every instance This is a multi-part message in MIME format. --Multipart=_Thu__5_Feb_2004_23_02_58_+0100_jQH48UbF=k3Ofvzd Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Hi all While experimenting with Webrick I felt that it would be nice if I could control for every socket whether reverse lookup should be done or not (instead of using the global BasicSocket.do_not_reverse_lookup flag). So I created the attached patch for socket.c. Usage is now for example as follows: require 'socket' sock = TCPSocket.new(...) sock.do_not_reverse_lookup = true [use the socket...] What do you thing about that? -- Thomas Uehlinger --Multipart=_Thu__5_Feb_2004_23_02_58_+0100_jQH48UbF=k3Ofvzd Content-Type: text/x-diff; name="socket.c.patch" Content-Disposition: attachment; filename="socket.c.patch" Content-Transfer-Encoding: 7bit --- socket_old.c 2004-02-05 22:44:19.996780704 +0100 +++ socket.c 2004-02-05 22:52:38.644974656 +0100 @@ -64,8 +64,6 @@ #endif #include "sockport.h" -static int do_not_reverse_lookup = 0; - VALUE rb_cBasicSocket; VALUE rb_cIPSocket; VALUE rb_cTCPSocket; @@ -392,7 +390,24 @@ return INT2FIX(n); } -static VALUE ipaddr _((struct sockaddr*)); +static VALUE +bsock_do_not_reverse_lookup(obj) + VALUE obj; +{ + return rb_ivar_get(obj, rb_intern("@do_not_reverse_lookup")); +} + +static VALUE +bsock_do_not_reverse_lookup_set(obj, state) + VALUE obj; + VALUE state; +{ + rb_secure(4); + return rb_ivar_set(obj, rb_intern("@do_not_reverse_lookup"), state); +} + + +static VALUE ipaddr _((VALUE, struct sockaddr*)); #ifdef HAVE_SYS_UN_H static VALUE unixaddr _((struct sockaddr_un*)); #endif @@ -460,7 +475,7 @@ 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(sock, (struct sockaddr*)buf)); #ifdef HAVE_SYS_UN_H case RECV_UNIX: return rb_assoc_new(str, unixaddr((struct sockaddr_un*)buf)); @@ -481,21 +496,6 @@ return s_recvfrom(sock, argc, argv, RECV_RECV); } -static VALUE -bsock_do_not_rev_lookup() -{ - return do_not_reverse_lookup?Qtrue:Qfalse; -} - -static VALUE -bsock_do_not_rev_lookup_set(self, val) - VALUE self, val; -{ - rb_secure(4); - do_not_reverse_lookup = RTEST(val); - return val; -} - static void make_ipaddr0(addr, buf, len) struct sockaddr *addr; @@ -655,14 +655,16 @@ } static VALUE -ipaddr(sockaddr) +ipaddr(obj, sockaddr) + VALUE obj; struct sockaddr *sockaddr; { VALUE family, port, addr1, addr2; VALUE ary; int error; char hbuf[1024], pbuf[1024]; - + int do_not_reverse_lookup = 0; + switch (sockaddr->sa_family) { case AF_UNSPEC: family = rb_str_new2("AF_UNSPEC"); @@ -689,6 +691,9 @@ family = rb_str_new2(pbuf); break; } + + if (obj) do_not_reverse_lookup = RTEST(rb_ivar_get(obj, rb_intern("@do_not_reverse_lookup"))); + if (!do_not_reverse_lookup) { error = getnameinfo(sockaddr, SA_LEN(sockaddr), hbuf, sizeof(hbuf), NULL, 0, 0); @@ -1254,7 +1259,7 @@ if (getsockname(fileno(fptr->f), (struct sockaddr*)&addr, &len) < 0) rb_sys_fail("getsockname(2)"); - return ipaddr((struct sockaddr*)&addr); + return ipaddr(sock, (struct sockaddr*)&addr); } static VALUE @@ -1269,7 +1274,7 @@ if (getpeername(fileno(fptr->f), (struct sockaddr*)&addr, &len) < 0) rb_sys_fail("getpeername(2)"); - return ipaddr((struct sockaddr*)&addr); + return ipaddr(sock, (struct sockaddr*)&addr); } static VALUE @@ -1985,7 +1990,7 @@ } base = rb_ary_new(); for (res = res0; res; res = res->ai_next) { - ary = ipaddr(res->ai_addr); + ary = ipaddr((VALUE)0, res->ai_addr); if (res->ai_canonname) { RARRAY(ary)->ptr[2] = rb_str_new2(res->ai_canonname); } @@ -2385,10 +2390,6 @@ rb_cBasicSocket = rb_define_class("BasicSocket", rb_cIO); rb_undef_method(rb_cBasicSocket, "initialize"); - rb_define_singleton_method(rb_cBasicSocket, "do_not_reverse_lookup", - bsock_do_not_rev_lookup, 0); - rb_define_singleton_method(rb_cBasicSocket, "do_not_reverse_lookup=", - bsock_do_not_rev_lookup_set, 1); rb_define_singleton_method(rb_cBasicSocket, "for_fd", bsock_s_for_fd, 1); rb_define_method(rb_cBasicSocket, "close_read", bsock_close_read, 0); @@ -2400,7 +2401,9 @@ rb_define_method(rb_cBasicSocket, "getpeername", bsock_getpeername, 0); rb_define_method(rb_cBasicSocket, "send", bsock_send, -1); rb_define_method(rb_cBasicSocket, "recv", bsock_recv, -1); - + rb_define_method(rb_cBasicSocket, "do_not_reverse_lookup", bsock_do_not_reverse_lookup, 0); + rb_define_method(rb_cBasicSocket, "do_not_reverse_lookup=", bsock_do_not_reverse_lookup_set, 1); + rb_cIPSocket = rb_define_class("IPSocket", rb_cBasicSocket); rb_define_global_const("IPsocket", rb_cIPSocket); rb_define_method(rb_cIPSocket, "addr", ip_addr, 0); --Multipart=_Thu__5_Feb_2004_23_02_58_+0100_jQH48UbF=k3Ofvzd--