ruby-changes:24423
From: drbrain <ko1@a...>
Date: Fri, 20 Jul 2012 09:32:51 +0900 (JST)
Subject: [ruby-changes:24423] drbrain:r36474 (trunk): * ext/socket/raddrinfo.c (addrinfo_ipv6_unique_local_p): Added
drbrain 2012-07-20 09:32:35 +0900 (Fri, 20 Jul 2012) New Revision: 36474 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=36474 Log: * ext/socket/raddrinfo.c (addrinfo_ipv6_unique_local_p): Added Addrinfo#ipv6_unique_local? to detect RFC 4193 unique local addresses. Part of #6692 * ext/socket/rubysocket.h: Add IN6_IS_ADDR_UNIQUE_LOCAL macro if missing. * test/socket/test_addrinfo.rb: Test for ipv6_unqiue_local? Modified files: trunk/ChangeLog trunk/ext/socket/raddrinfo.c trunk/ext/socket/rubysocket.h trunk/test/socket/test_addrinfo.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 36473) +++ ChangeLog (revision 36474) @@ -1,3 +1,12 @@ +Fri Jul 20 09:32:14 2012 Eric Hodel <drbrain@s...> + + * ext/socket/raddrinfo.c (addrinfo_ipv6_unique_local_p): Added + Addrinfo#ipv6_unique_local? to detect RFC 4193 unique local + addresses. Part of #6692 + * ext/socket/rubysocket.h: Add IN6_IS_ADDR_UNIQUE_LOCAL macro if + missing. + * test/socket/test_addrinfo.rb: Test for ipv6_unqiue_local? + Fri Jul 20 07:40:32 2012 Eric Hodel <drbrain@s...> * lib/net/http/response.rb: Automatically inflate gzip and Index: ext/socket/rubysocket.h =================================================================== --- ext/socket/rubysocket.h (revision 36473) +++ ext/socket/rubysocket.h (revision 36474) @@ -117,6 +117,10 @@ # define IS_IP_FAMILY(af) ((af) == AF_INET) #endif +#ifndef IN6_IS_ADDR_UNIQUE_LOCAL +# define IN6_IS_ADDR_UNIQUE_LOCAL(a) (((a)->s6_addr[0] == 0xfc) || ((a)->s6_addr[0] == 0xfd)) +#endif + #ifndef HAVE_SOCKADDR_STORAGE /* * RFC 2553: protocol-independent placeholder for socket addresses Index: ext/socket/raddrinfo.c =================================================================== --- ext/socket/raddrinfo.c (revision 36473) +++ ext/socket/raddrinfo.c (revision 36474) @@ -1793,6 +1793,18 @@ } /* + * Returns true for IPv6 unique local address (fc00::/7, RFC4193). + * It returns false otherwise. + */ +static VALUE +addrinfo_ipv6_unique_local_p(VALUE self) +{ + struct in6_addr *addr = extract_in6_addr(self); + if (addr && IN6_IS_ADDR_UNIQUE_LOCAL(addr)) return Qtrue; + return Qfalse; +} + +/* * Returns true for IPv4-mapped IPv6 address (::ffff:0:0/80). * It returns false otherwise. */ @@ -2207,6 +2219,7 @@ rb_define_method(rb_cAddrinfo, "ipv6_multicast?", addrinfo_ipv6_multicast_p, 0); rb_define_method(rb_cAddrinfo, "ipv6_linklocal?", addrinfo_ipv6_linklocal_p, 0); rb_define_method(rb_cAddrinfo, "ipv6_sitelocal?", addrinfo_ipv6_sitelocal_p, 0); + rb_define_method(rb_cAddrinfo, "ipv6_unique_local?", addrinfo_ipv6_unique_local_p, 0); rb_define_method(rb_cAddrinfo, "ipv6_v4mapped?", addrinfo_ipv6_v4mapped_p, 0); rb_define_method(rb_cAddrinfo, "ipv6_v4compat?", addrinfo_ipv6_v4compat_p, 0); rb_define_method(rb_cAddrinfo, "ipv6_mc_nodelocal?", addrinfo_ipv6_mc_nodelocal_p, 0); Index: test/socket/test_addrinfo.rb =================================================================== --- test/socket/test_addrinfo.rb (revision 36473) +++ test/socket/test_addrinfo.rb (revision 36474) @@ -512,7 +512,8 @@ [:ipv6_v4mapped?, "::ffff:0.0.0.0", "::ffff:255.255.255.255"], [:ipv6_linklocal?, "fe80::", "febf::"], [:ipv6_sitelocal?, "fec0::", "feef::"], - [:ipv6_multicast?, "ff00::", "ffff::"] + [:ipv6_multicast?, "ff00::", "ffff::"], + [:ipv6_unique_local?, "fc00::", "fd00::"], ] mlist = [ [:ipv6_mc_nodelocal?, "ff01::", "ff11::"], -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/