[#28015] RCR: RUBY_VERSION_INT — Roger Pack <rogerdpack2@...>

Situation:

14 messages 2010/02/02

[#28113] [Bug #2723] $: length affects re-require time of already loaded files — Greg Hazel <redmine@...>

Bug #2723: $: length affects re-require time of already loaded files

16 messages 2010/02/08

[#28151] [Bug #2739] ruby 1.8.7 built with pthreads hangs under some circumstances — Joel Ebel <redmine@...>

Bug #2739: ruby 1.8.7 built with pthreads hangs under some circumstances

31 messages 2010/02/11

[#28188] [Bug #2750] build fails on win32/MinGW: "executable host ruby is required." even when --with-baseruby is used — Christian Bodt <redmine@...>

Bug #2750: build fails on win32/MinGW: "executable host ruby is required." even when --with-baseruby is used

9 messages 2010/02/16

[#28206] Is Math module a wrapper of libm? — Yusuke ENDOH <mame@...>

Hi matz --

23 messages 2010/02/18
[#28212] Re: Is Math module a wrapper of libm? — Yukihiro Matsumoto <matz@...> 2010/02/18

Hi,

[#28219] Re: Is Math module a wrapper of libm? — Yusuke ENDOH <mame@...> 2010/02/18

Hi,

[#28225] Re: Is Math module a wrapper of libm? — Marc-Andre Lafortune <ruby-core-mailing-list@...> 2010/02/18

Hi,

[#28233] Re: Is Math module a wrapper of libm? — Kenta Murata <muraken@...> 2010/02/18

Hi,

[#28265] Re: Is Math module a wrapper of libm? — Marc-Andre Lafortune <ruby-core-mailing-list@...> 2010/02/20

Hi,

[#28286] Re: Is Math module a wrapper of libm? — Kenta Murata <muraken@...> 2010/02/21

Hi

[#28291] Re: Is Math module a wrapper of libm? — Marc-Andre Lafortune <ruby-core-mailing-list@...> 2010/02/22

Hi!

[#28235] [Feature #2759] Regexp /g and /G options — Michael Fellinger <redmine@...>

Feature #2759: Regexp /g and /G options

35 messages 2010/02/18

[#28329] [ANN] Ruby 1.9.2dev has passed RubySpec! — Yusuke ENDOH <mame@...>

Hi,

12 messages 2010/02/24

[#28355] [ANN] Toward rich diversity of Ruby development. — Urabe Shyouhei <shyouhei@...>

A short announcement: thanks to some helps of GitHub people, I now have

12 messages 2010/02/27

[#28365] Indentifying key MRI-on-Windows issues — Jon <jon.forums@...>

In an effort to begin summarizing key MRI-on-Windows open issues I'm starting this thread in hopes that those interested will respond with details on the key MRI issues they feel need resolution for Windows users.

11 messages 2010/02/27
[#28690] Re: Indentifying key MRI-on-Windows issues — Roger Pack <rogerdpack2@...> 2010/03/16

> My key concern is http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-=

[ruby-core:28027] Re: [Feature:trunk] optional reverse_lookup argument for IPSocket#{addr,peeraddr} and Socket.getaddrinfo

From: Nobuyoshi Nakada <nobu@...>
Date: 2010-02-03 09:04:13 UTC
List: ruby-core #28027
Hi,

At Wed, 3 Feb 2010 10:57:23 +0900,
Yukihiro Matsumoto wrote in [ruby-core:28023]:
> |I propose adding an optional argument to enable/disable reverse
> |lookup.
> 
> +1, but the document should mention the default value more clearly.
> Currently, the behavior is not clear when reverse_lookup argument is
> omitted.

Any other suggestions?


Index: ext/socket/ipsocket.c
===================================================================
--- ext/socket/ipsocket.c	(revision 26546)
+++ ext/socket/ipsocket.c	(working copy)
@@ -130,37 +130,70 @@ rsock_init_inetsock(VALUE sock, VALUE re
 }
 
+static ID id_numeric, id_hostname;
+
+int
+rsock_revlookup_flag(VALUE revlookup, int *norevlookup)
+{
+#define return_norevlookup(x) {*norevlookup = x; return 1;}
+    ID id;
+
+    switch (revlookup) {
+      case Qtrue:  return_norevlookup(0);
+      case Qfalse: return_norevlookup(1);
+      case Qnil: break;
+      default:
+	Check_Type(revlookup, T_SYMBOL);
+	id = SYM2ID(revlookup);
+	if (id == id_numeric) return_norevlookup(1);
+	if (id == id_hostname) return_norevlookup(0);
+	rb_raise(rb_eArgError, "invalid reverse_lookup flag: :%s", rb_id2name(id));
+    }
+    return 0;
+#undef return_norevlookup
+}
+
 /*
  * call-seq:
- *   ipsocket.addr => [address_family, port, hostname, numeric_address] 
+ *   ipsocket.addr([reverse_lookup]) => [address_family, port, hostname, numeric_address] 
  *
  * Returns the local address as an array which contains
  * address_family, port, hostname and numeric_address. 
  *
+ * If +reverse_lookup+ is +true+ or +:hostname+,
  * hostname is obtained from numeric_address using reverse lookup.
- * If ipsocket.do_not_reverse_lookup is true,
+ * Or if it is +false+, or +:numeric+,
  * hostname is same as numeric_address.
+ * Or if it is +nil+ or ommitted, obeys to +ipsocket.do_not_reverse_lookup+.
+ * See +Socket.getaddrinfo+ also.
  *
  *   TCPSocket.open("www.ruby-lang.org", 80) {|sock|
  *     p sock.addr #=> ["AF_INET", 49429, "hal", "192.168.0.128"]
+ *     p sock.addr(true)  #=> ["AF_INET", 49429, "hal", "192.168.0.128"]
+ *     p sock.addr(false) #=> ["AF_INET", 49429, "192.168.0.128", "192.168.0.128"]
+ *     p sock.addr(:hostname)  #=> ["AF_INET", 49429, "hal", "192.168.0.128"]
+ *     p sock.addr(:numeric)   #=> ["AF_INET", 49429, "192.168.0.128", "192.168.0.128"]
  *   }
  *
  */
 static VALUE
-ip_addr(VALUE sock)
+ip_addr(int argc, VALUE *argv, VALUE sock)
 {
     rb_io_t *fptr;
     struct sockaddr_storage addr;
     socklen_t len = sizeof addr;
+    int norevlookup;
 
     GetOpenFile(sock, fptr);
 
+    if (argc < 1 || !rsock_revlookup_flag(argv[0], &norevlookup))
+	norevlookup = fptr->mode & FMODE_NOREVLOOKUP;
     if (getsockname(fptr->fd, (struct sockaddr*)&addr, &len) < 0)
 	rb_sys_fail("getsockname(2)");
-    return rsock_ipaddr((struct sockaddr*)&addr, fptr->mode & FMODE_NOREVLOOKUP);
+    return rsock_ipaddr((struct sockaddr*)&addr, norevlookup);
 }
 
 /*
  * call-seq:
- *   ipsocket.peeraddr => [address_family, port, hostname, numeric_address] 
+ *   ipsocket.peeraddr([reverse_lookup]) => [address_family, port, hostname, numeric_address] 
  *
  * Returns the remote address as an array which contains
@@ -168,21 +201,35 @@ ip_addr(VALUE sock)
  * It is defined for connection oriented socket such as TCPSocket.
  *
+ * If +reverse_lookup+ is +true+ or +:hostname+,
+ * hostname is obtained from numeric_address using reverse lookup.
+ * Or if it is +false+, or +:numeric+,
+ * hostname is same as numeric_address.
+ * Or if it is +nil+ or ommitted, obeys to +ipsocket.do_not_reverse_lookup+.
+ * See +Socket.getaddrinfo+ also.
+ *
  *   TCPSocket.open("www.ruby-lang.org", 80) {|sock|
  *     p sock.peeraddr #=> ["AF_INET", 80, "carbon.ruby-lang.org", "221.186.184.68"]
+ *     p sock.peeraddr(true)  #=> ["AF_INET", 80, "221.186.184.68", "221.186.184.68"]
+ *     p sock.peeraddr(false) #=> ["AF_INET", 80, "221.186.184.68", "221.186.184.68"]
+ *     p sock.peeraddr(:hostname) #=> ["AF_INET", 80, "carbon.ruby-lang.org", "221.186.184.68"]
+ *     p sock.peeraddr(:numeric)  #=> ["AF_INET", 80, "221.186.184.68", "221.186.184.68"]
  *   }
  *
  */
 static VALUE
-ip_peeraddr(VALUE sock)
+ip_peeraddr(int argc, VALUE *argv, VALUE sock)
 {
     rb_io_t *fptr;
     struct sockaddr_storage addr;
     socklen_t len = sizeof addr;
+    int norevlookup;
 
     GetOpenFile(sock, fptr);
 
+    if (argc < 1 || !rsock_revlookup_flag(argv[0], &norevlookup))
+	norevlookup = fptr->mode & FMODE_NOREVLOOKUP;
     if (getpeername(fptr->fd, (struct sockaddr*)&addr, &len) < 0)
 	rb_sys_fail("getpeername(2)");
-    return rsock_ipaddr((struct sockaddr*)&addr, fptr->mode & FMODE_NOREVLOOKUP);
+    return rsock_ipaddr((struct sockaddr*)&addr, norevlookup);
 }
 
@@ -244,9 +291,11 @@ Init_ipsocket(void)
 {
     rb_cIPSocket = rb_define_class("IPSocket", rb_cBasicSocket);
-    rb_define_method(rb_cIPSocket, "addr", ip_addr, 0);
-    rb_define_method(rb_cIPSocket, "peeraddr", ip_peeraddr, 0);
+    rb_define_method(rb_cIPSocket, "addr", ip_addr, -1);
+    rb_define_method(rb_cIPSocket, "peeraddr", ip_peeraddr, -1);
     rb_define_method(rb_cIPSocket, "recvfrom", ip_recvfrom, -1);
     rb_define_singleton_method(rb_cIPSocket, "getaddress", ip_s_getaddress, 1);
     rb_undef_method(rb_cIPSocket, "getpeereid");
 
+    id_numeric = rb_intern_const("numeric");
+    id_hostname = rb_intern_const("hostname");
 }
Index: ext/socket/socket.c
===================================================================
--- ext/socket/socket.c	(revision 26546)
+++ ext/socket/socket.c	(working copy)
@@ -871,5 +871,5 @@ sock_gethostname(VALUE obj)
 
 static VALUE
-make_addrinfo(struct addrinfo *res0)
+make_addrinfo(struct addrinfo *res0, int norevlookup)
 {
     VALUE base, ary;
@@ -881,5 +881,5 @@ make_addrinfo(struct addrinfo *res0)
     base = rb_ary_new();
     for (res = res0; res; res = res->ai_next) {
-	ary = rsock_ipaddr(res->ai_addr, rsock_do_not_reverse_lookup);
+	ary = rsock_ipaddr(res->ai_addr, norevlookup);
 	if (res->ai_canonname) {
 	    RARRAY_PTR(ary)[2] = rb_str_new2(res->ai_canonname);
@@ -956,5 +956,5 @@ sock_s_gethostbyaddr(int argc, VALUE *ar
 	t = rsock_family_arg(family);
     }
-#ifdef INET6
+#ifdef AF_INET6
     else if (RSTRING_LEN(addr) == 16) {
 	t = AF_INET6;
@@ -1070,5 +1070,5 @@ sock_s_getservbyport(int argc, VALUE *ar
 /*
  * call-seq:
- *   Socket.getaddrinfo(nodename, servname[, family[, socktype[, protocol[, flags]]]]) => array
+ *   Socket.getaddrinfo(nodename, servname[, family[, socktype[, protocol[, flags[, reverse_lookup]]]]]) => array
  *
  * Obtains address information for _nodename_:_servname_.
@@ -1091,12 +1091,20 @@ sock_s_getservbyport(int argc, VALUE *ar
  *   #    ["AF_INET", 0, "localhost", "127.0.0.1", 2, 3, 0]]  # PF_INET/SOCK_RAW/IPPROTO_IP
  *
+ * _reverse_lookup_ directs the form of the third element, and has to
+ * be one of below.
+ * If it is ommitted, the default value is +nil+.
+ *
+ *   +true+, +:hostname+:  hostname is obtained from numeric address using reverse lookup, which may take a time.
+ *   +false+, +:numeric+:  hostname is same as numeric address.
+ *   +nil+:              obey to the current +do_not_reverse_lookup+ flag.
  */
 static VALUE
 sock_s_getaddrinfo(int argc, VALUE *argv)
 {
-    VALUE host, port, family, socktype, protocol, flags, ret;
+    VALUE host, port, family, socktype, protocol, flags, ret, revlookup;
     struct addrinfo hints, *res;
+    int norevlookup;
 
-    rb_scan_args(argc, argv, "24", &host, &port, &family, &socktype, &protocol, &flags);
+    rb_scan_args(argc, argv, "25", &host, &port, &family, &socktype, &protocol, &flags, &revlookup);
 
     MEMZERO(&hints, struct addrinfo, 1);
@@ -1112,7 +1120,10 @@ sock_s_getaddrinfo(int argc, VALUE *argv
 	hints.ai_flags = NUM2INT(flags);
     }
+    if (NIL_P(revlookup) || !rsock_revlookup_flag(revlookup, &norevlookup)) {
+	norevlookup = rsock_do_not_reverse_lookup;
+    }
     res = rsock_getaddrinfo(host, port, &hints, 0);
 
-    ret = make_addrinfo(res);
+    ret = make_addrinfo(res, norevlookup);
     freeaddrinfo(res);
     return ret;


-- 
Nobu Nakada

In This Thread