[前][次][番号順一覧][スレッド一覧]

ruby-changes:10104

From: akr <ko1@a...>
Date: Sun, 18 Jan 2009 16:48:00 +0900 (JST)
Subject: [ruby-changes:10104] Ruby:r21647 (trunk): * ext/socket/raddrinfo.c (addrinfo_ip_address): new method

akr	2009-01-18 16:47:35 +0900 (Sun, 18 Jan 2009)

  New Revision: 21647

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=21647

  Log:
    * ext/socket/raddrinfo.c (addrinfo_ip_address): new method
      AddrInfo#ip_address.
      (addrinfo_ip_port): new method AddrInfo#ip_port.
      (Init_addrinfo): define the methods above.

  Modified files:
    trunk/ChangeLog
    trunk/ext/socket/raddrinfo.c
    trunk/test/socket/test_addrinfo.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 21646)
+++ ChangeLog	(revision 21647)
@@ -1,3 +1,10 @@
+Sun Jan 18 16:46:37 2009  Tanaka Akira  <akr@f...>
+
+	* ext/socket/raddrinfo.c (addrinfo_ip_address): new method
+	  AddrInfo#ip_address.
+	  (addrinfo_ip_port): new method AddrInfo#ip_port.
+	  (Init_addrinfo): define the methods above.
+
 Sun Jan 18 14:29:52 2009  Tanaka Akira  <akr@f...>
 
 	* ext/socket/unixsocket.c: redandant #ifdef removed.
Index: ext/socket/raddrinfo.c
===================================================================
--- ext/socket/raddrinfo.c	(revision 21646)
+++ ext/socket/raddrinfo.c	(revision 21647)
@@ -1520,6 +1520,70 @@
     return ret;
 }
 
+/*
+ * call-seq:
+ *   addrinfo.ip_address => string
+ *
+ * Returns the IP address as a string.
+ *
+ *   AddrInfo.tcp("127.0.0.1", 80).ip_address    #=> "127.0.0.1"
+ *   AddrInfo.tcp("::1", 80).ip_address          #=> "::1"
+ */
+static VALUE
+addrinfo_ip_address(VALUE self)
+{
+    rb_addrinfo_t *rai = get_addrinfo(self);
+    int family = ai_get_afamily(rai);
+    VALUE vflags;
+    VALUE ret;
+
+    if (!IS_IP_FAMILY(family))
+	rb_raise(rb_eSocket, "need IPv4 or IPv6 address");
+
+    vflags = INT2NUM(NI_NUMERICHOST|NI_NUMERICSERV);
+    ret = addrinfo_getnameinfo(1, &vflags, self);
+    return rb_ary_entry(ret, 0);
+}
+
+/*
+ * call-seq:
+ *   addrinfo.ip_port => port
+ *
+ * Returns the port number as an integer.
+ *
+ *   AddrInfo.tcp("127.0.0.1", 80).ip_port    #=> 80
+ *   AddrInfo.tcp("::1", 80).ip_port          #=> 80
+ */
+static VALUE
+addrinfo_ip_port(VALUE self)
+{
+    rb_addrinfo_t *rai = get_addrinfo(self);
+    int family = ai_get_afamily(rai);
+    int port;
+
+    if (!IS_IP_FAMILY(family))
+	rb_raise(rb_eSocket, "need IPv4 or IPv6 address");
+
+    switch (family) {
+      case AF_INET:
+        if (rai->sockaddr_len != sizeof(struct sockaddr_in))
+            rb_raise(rb_eSocket, "unexpected sockaddr size for IPv4");
+        port = ntohs(((struct sockaddr_in *)&rai->addr)->sin_port);
+        break;
+
+      case AF_INET6:
+        if (rai->sockaddr_len != sizeof(struct sockaddr_in6))
+            rb_raise(rb_eSocket, "unexpected sockaddr size for IPv6");
+        port = ntohs(((struct sockaddr_in6 *)&rai->addr)->sin6_port);
+        break;
+
+      default:
+	rb_raise(rb_eSocket, "need IPv4 or IPv6 address");
+    }
+
+    return INT2NUM(port);
+}
+
 #ifdef HAVE_SYS_UN_H
 /*
  * call-seq:
@@ -1768,6 +1832,8 @@
 
     rb_define_method(rb_cAddrInfo, "ip?", addrinfo_ip_p, 0);
     rb_define_method(rb_cAddrInfo, "ip_unpack", addrinfo_ip_unpack, 0);
+    rb_define_method(rb_cAddrInfo, "ip_address", addrinfo_ip_address, 0);
+    rb_define_method(rb_cAddrInfo, "ip_port", addrinfo_ip_port, 0);
     rb_define_method(rb_cAddrInfo, "ipv4?", addrinfo_ipv4_p, 0);
     rb_define_method(rb_cAddrInfo, "ipv6?", addrinfo_ipv6_p, 0);
     rb_define_method(rb_cAddrInfo, "unix?", addrinfo_unix_p, 0);
Index: test/socket/test_addrinfo.rb
===================================================================
--- test/socket/test_addrinfo.rb	(revision 21646)
+++ test/socket/test_addrinfo.rb	(revision 21647)
@@ -37,6 +37,8 @@
   def test_addrinfo_ip_unpack
     ai = AddrInfo.tcp("127.0.0.1", 80)
     assert_equal(["127.0.0.1", 80], ai.ip_unpack)
+    assert_equal("127.0.0.1", ai.ip_address)
+    assert_equal(80, ai.ip_port)
   end
 
   def test_addrinfo_new_inet
@@ -299,6 +301,8 @@
     def test_addrinfo_ip_unpack_inet6
       ai = AddrInfo.tcp("::1", 80)
       assert_equal(["::1", 80], ai.ip_unpack)
+      assert_equal("::1", ai.ip_address)
+      assert_equal(80, ai.ip_port)
     end
 
     def test_marshal_inet6

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]