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

ruby-changes:10669

From: akr <ko1@a...>
Date: Wed, 11 Feb 2009 16:45:07 +0900 (JST)
Subject: [ruby-changes:10669] Ruby:r22232 (trunk): * ext/socket/ancdata.c (ancillary_s_ip_pktinfo): make 3rd argument

akr	2009-02-11 16:44:53 +0900 (Wed, 11 Feb 2009)

  New Revision: 22232

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

  Log:
    * ext/socket/ancdata.c (ancillary_s_ip_pktinfo): make 3rd argument
      optional.

  Modified files:
    trunk/ChangeLog
    trunk/ext/socket/ancdata.c
    trunk/test/socket/test_ancdata.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 22231)
+++ ChangeLog	(revision 22232)
@@ -1,3 +1,8 @@
+Wed Feb 11 16:44:20 2009  Tanaka Akira  <akr@f...>
+
+	* ext/socket/ancdata.c (ancillary_s_ip_pktinfo): make 3rd argument
+	  optional.
+
 Wed Feb 11 15:47:10 2009  Nobuyoshi Nakada  <nobu@r...>
 
 	* array.c (ary_make_shared): returns shared root array itself, and
Index: ext/socket/ancdata.c
===================================================================
--- ext/socket/ancdata.c	(revision 22231)
+++ ext/socket/ancdata.c	(revision 22232)
@@ -221,10 +221,13 @@
 
 /*
  * call-seq:
+ *   Socket::AncillaryData.ip_pktinfo(addr, ifindex) => ancdata
  *   Socket::AncillaryData.ip_pktinfo(addr, ifindex, spec_dst) => ancdata
  *
  * Returns new ancillary data for IP_PKTINFO.
  *
+ * If spec_dst is not given, addr is used.
+ *
  * IP_PKTINFO is not standard.
  *
  * Supported platform: GNU/Linux
@@ -237,16 +240,22 @@
  *
  */
 static VALUE
-ancillary_s_ip_pktinfo(VALUE self, VALUE v_addr, VALUE v_ifindex, VALUE v_spec_dst)
+ancillary_s_ip_pktinfo(int argc, VALUE *argv, VALUE self)
 {
 #if defined(IPPROTO_IP) && defined(IP_PKTINFO) && defined(HAVE_TYPE_STRUCT_IN_PKTINFO) /* GNU/Linux */
+    VALUE v_addr, v_ifindex, v_spec_dst;
     unsigned int ifindex;
     struct sockaddr_in sa;
     struct in_pktinfo pktinfo;
 
+    rb_scan_args(argc, argv, "21", &v_addr, &v_ifindex, &v_spec_dst);
+
     SockAddrStringValue(v_addr);
     ifindex = NUM2UINT(v_ifindex);
-    SockAddrStringValue(v_spec_dst);
+    if (NIL_P(v_spec_dst))
+        v_spec_dst = v_addr;
+    else
+        SockAddrStringValue(v_spec_dst);
 
     memset(&pktinfo, 0, sizeof(pktinfo));
 
@@ -1322,7 +1331,7 @@
     rb_define_method(rb_cAncillaryData, "cmsg_is?", ancillary_cmsg_is_p, 2);
     rb_define_singleton_method(rb_cAncillaryData, "int", ancillary_s_int, 4);
     rb_define_method(rb_cAncillaryData, "int", ancillary_int, 0);
-    rb_define_singleton_method(rb_cAncillaryData, "ip_pktinfo", ancillary_s_ip_pktinfo, 3);
+    rb_define_singleton_method(rb_cAncillaryData, "ip_pktinfo", ancillary_s_ip_pktinfo, -1);
     rb_define_method(rb_cAncillaryData, "ip_pktinfo", ancillary_ip_pktinfo, 0);
     rb_define_singleton_method(rb_cAncillaryData, "ipv6_pktinfo", ancillary_s_ipv6_pktinfo, 2);
     rb_define_method(rb_cAncillaryData, "ipv6_pktinfo", ancillary_ipv6_pktinfo, 0);
Index: test/socket/test_ancdata.rb
===================================================================
--- test/socket/test_ancdata.rb	(revision 22231)
+++ test/socket/test_ancdata.rb	(revision 22232)
@@ -29,6 +29,8 @@
     if defined? Socket::IPV6_PKTINFO
       assert(!ancdata.cmsg_is?(:IPV6, :PKTINFO))
     end
+    ancdata2 = Socket::AncillaryData.ip_pktinfo(addr, ifindex)
+    assert_equal(addr.ip_address, ancdata2.ip_pktinfo[2].ip_address)
   end
 
   def test_ipv6_pktinfo

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

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