[#2367] Standard libraries — Dave Thomas <dave@...>

From ruby-dev summary:

60 messages 2004/02/11

[#2397] PATCH: deprecate cgi-lib, getopts, importenv, parsearg from standard library — Gavin Sinclair <gsinclair@...>

Index: cgi-lib.rb

15 messages 2004/02/12

[#2465] PATCH: OpenStruct#initialize to yield self — Gavin Sinclair <gsinclair@...>

This is a common approach I use to object initialization; I don't know

24 messages 2004/02/19

Re: Patch for socket.c: control reverse lookup for every instance

From: nobu.nokada@...
Date: 2004-02-05 23:40:14 UTC
List: ruby-core #2347
Hi,

At Fri, 6 Feb 2004 07:03:12 +0900,
Thomas Uehlinger wrote in [ruby-core:02346]:
> 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).

Your patch makes impossible to control it in singleton method
BasicSocket.getaddrinfo.


Index: ext/socket/socket.c
===================================================================
RCS file: /cvs/ruby/src/ruby/ext/socket/socket.c,v
retrieving revision 1.112
diff -u -2 -p -d -r1.112 socket.c
--- ext/socket/socket.c	27 Jan 2004 02:04:47 -0000	1.112
+++ ext/socket/socket.c	5 Feb 2004 23:39:11 -0000
@@ -66,4 +66,5 @@
 
 static int do_not_reverse_lookup = 0;
+#define FMODE_NOREVLOOKUP 0x100
 
 VALUE rb_cBasicSocket;
@@ -179,4 +180,7 @@ init_sock(sock, fd)
     fp->f2 = rb_fdopen(fd, "w");
     fp->mode = FMODE_READWRITE;
+    if (do_not_reverse_lookup) {
+	fp->mode |= FMODE_NOREVLOOKUP;
+    }
     rb_io_synchronized(fp);
 
@@ -393,5 +397,33 @@ bsock_send(argc, argv, sock)
 }
 
-static VALUE ipaddr _((struct sockaddr*));
+static VALUE
+bsock_do_not_reverse_lookup(sock)
+    VALUE sock;
+{
+    OpenFile *fptr;
+
+    GetOpenFile(sock, fptr);
+    return (fptr->mode & FMODE_NOREVLOOKUP) ? Qtrue : Qfalse;
+}
+
+static VALUE
+bsock_do_not_reverse_lookup_set(sock, state)
+    VALUE sock;
+    VALUE state;
+{
+    OpenFile *fptr;
+
+    rb_secure(4);
+    GetOpenFile(sock, fptr);
+    if (RTEST(state)) {
+	fptr->mode |= FMODE_NOREVLOOKUP;
+    }
+    else {
+	fptr->mode &= ~FMODE_NOREVLOOKUP;
+    }
+    return sock;
+}
+
+static VALUE ipaddr _((struct sockaddr*, int));
 #ifdef HAVE_SYS_UN_H
 static VALUE unixaddr _((struct sockaddr_un*));
@@ -461,5 +493,5 @@ s_recvfrom(sock, argc, argv, from)
 	}
 #endif
-	return rb_assoc_new(str, ipaddr((struct sockaddr*)buf));
+	return rb_assoc_new(str, ipaddr((struct sockaddr*)buf, fptr->mode & FMODE_NOREVLOOKUP));
 #ifdef HAVE_SYS_UN_H
       case RECV_UNIX:
@@ -656,6 +688,7 @@ sock_addrinfo(host, port, socktype, flag
 
 static VALUE
-ipaddr(sockaddr)
+ipaddr(sockaddr, norevlookup)
     struct sockaddr *sockaddr;
+    int norevlookup;
 {
     VALUE family, port, addr1, addr2;
@@ -690,5 +723,6 @@ ipaddr(sockaddr)
 	break;
     }
-    if (!do_not_reverse_lookup) {
+    
+    if (!norevlookup) {
 	error = getnameinfo(sockaddr, SA_LEN(sockaddr), hbuf, sizeof(hbuf),
 			    NULL, 0, 0);
@@ -704,5 +738,5 @@ ipaddr(sockaddr)
     }
     addr2 = rb_str_new2(hbuf);
-    if (do_not_reverse_lookup) {
+    if (norevlookup) {
 	addr1 = addr2;
     }
@@ -1255,5 +1289,5 @@ ip_addr(sock)
     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, fptr->mode & FMODE_NOREVLOOKUP);
 }
 
@@ -1270,5 +1304,5 @@ ip_peeraddr(sock)
     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, fptr->mode & FMODE_NOREVLOOKUP);
 }
 
@@ -1986,5 +2020,5 @@ make_addrinfo(res0)
     base = rb_ary_new();
     for (res = res0; res; res = res->ai_next) {
-	ary = ipaddr(res->ai_addr);
+	ary = ipaddr(res->ai_addr, do_not_reverse_lookup);
 	if (res->ai_canonname) {
 	    RARRAY(ary)->ptr[2] = rb_str_new2(res->ai_canonname);
@@ -2401,4 +2435,6 @@ Init_socket()
     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);


-- 
Nobu Nakada

In This Thread