In perl.git, the branch blead has been updated

<http://perl5.git.perl.org/perl.git/commitdiff/d4ada64ad845b1ffe124cf230a345b847e43d755?hp=1473b834ebd652a4760a26fad191500e74ac05e5>

- Log -----------------------------------------------------------------
commit d4ada64ad845b1ffe124cf230a345b847e43d755
Author: Steve Hay <[email protected]>
Date:   Wed Aug 15 17:56:13 2012 +0100

    Upgrade Socket from 2.002 to 2.003

M       Porting/Maintainers.pl
M       cpan/Socket/Makefile.PL
M       cpan/Socket/Socket.pm
M       cpan/Socket/Socket.xs
M       cpan/Socket/t/ip_mreq.t
M       pod/perldelta.pod

commit e146574a8047f7322db7990ad354d7a606843288
Author: Steve Hay <[email protected]>
Date:   Wed Aug 15 17:54:23 2012 +0100

    perldelta - Wrap to 79 columns

M       pod/perldelta.pod

commit 521f5ac77bcf83026e2efb1a52734f9eec2be75b
Author: Steve Hay <[email protected]>
Date:   Wed Aug 15 17:52:43 2012 +0100

    perldelta - Document Module::Pluggable changes

M       pod/perldelta.pod
-----------------------------------------------------------------------

Summary of changes:
 Porting/Maintainers.pl  |    2 +-
 cpan/Socket/Makefile.PL |   22 ++++++++-------
 cpan/Socket/Socket.pm   |   36 +++++++++++++++++-------
 cpan/Socket/Socket.xs   |   67 +++++++++++++++++++++++++++++++++++++++++++++++
 cpan/Socket/t/ip_mreq.t |   14 +++++++++-
 pod/perldelta.pod       |   25 +++++++++++------
 6 files changed, 134 insertions(+), 32 deletions(-)

diff --git a/Porting/Maintainers.pl b/Porting/Maintainers.pl
index 687edf7..54ed2e6 100755
--- a/Porting/Maintainers.pl
+++ b/Porting/Maintainers.pl
@@ -1640,7 +1640,7 @@ use File::Glob qw(:case);
 
     'Socket' => {
         'MAINTAINER'   => 'pevans',
-        'DISTRIBUTION' => 'PEVANS/Socket-2.002.tar.gz',
+        'DISTRIBUTION' => 'PEVANS/Socket-2.003.tar.gz',
         'FILES'        => q[cpan/Socket],
         'UPSTREAM'     => 'cpan',
     },
diff --git a/cpan/Socket/Makefile.PL b/cpan/Socket/Makefile.PL
index 3be198e..9e76dce 100644
--- a/cpan/Socket/Makefile.PL
+++ b/cpan/Socket/Makefile.PL
@@ -161,13 +161,14 @@ my @names = (
 
        IOV_MAX
 
-       IP_ADD_MEMBERSHIP IP_DROP_MEMBERSHIP IP_HDRINCL IP_MULTICAST_IF
-       IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_RECVOPTS
-       IP_RECVRETOPTS IP_RETOPTS IP_TOS IP_TTL 
+       IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_DROP_MEMBERSHIP
+       IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MULTICAST_IF IP_MULTICAST_LOOP
+       IP_MULTICAST_TTL IP_OPTIONS IP_RECVOPTS IP_RECVRETOPTS IP_RETOPTS IP_TOS
+       IP_TTL 
 
-       IPV6_ADD_MEMBERSHIP IPV6_DROP_MEMBERSHIP IPV6_MTU IPV6_MTU_DISCOVER
-       IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP
-       IPV6_UNICAST_HOPS IPV6_V6ONLY
+       IPV6_ADD_MEMBERSHIP IPV6_DROP_MEMBERSHIP IPV6_JOIN_GROUP
+       IPV6_LEAVE_GROUP IPV6_MTU IPV6_MTU_DISCOVER IPV6_MULTICAST_HOPS
+       IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_UNICAST_HOPS IPV6_V6ONLY
 
        MSG_BCAST MSG_BTAG MSG_CTLFLAGS MSG_CTLIGNORE MSG_DONTWAIT MSG_EOF
        MSG_EOR MSG_ERRQUEUE MSG_ETAG MSG_FIN MSG_MAXIOVLEN MSG_MCAST
@@ -200,10 +201,11 @@ my @names = (
        SO_SECURITY_ENCRYPTION_TRANSPORT SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO
        SO_STATE SO_TYPE SO_USELOOPBACK SO_XOPEN SO_XSE
 
-       TCP_KEEPALIVE TCP_MAXRT TCP_MAXSEG TCP_NODELAY TCP_STDURG TCP_CORK
-       TCP_KEEPIDLE TCP_KEEPINTVL TCP_KEEPCNT TCP_SYNCNT TCP_LINGER2
-       TCP_DEFER_ACCEPT TCP_WINDOW_CLAMP TCP_INFO TCP_QUICKACK TCP_CONGESTION
-       TCP_MD5SIG
+       TCP_CONGESTION TCP_CONNECTIONTIMEOUT TCP_CORK TCP_DEFER_ACCEPT TCP_INFO
+       TCP_INIT_CWND TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL
+       TCP_LINGER2 TCP_MAXRT TCP_MAXSEG TCP_MD5SIG TCP_NODELAY TCP_NOOPT
+       TCP_NOPUSH TCP_QUICKACK TCP_SACK_ENABLE TCP_STDURG TCP_SYNCNT
+       TCP_WINDOW_CLAMP
 
        UIO_MAXIOV
     ),
diff --git a/cpan/Socket/Socket.pm b/cpan/Socket/Socket.pm
index 41f214d..d9bbfae 100644
--- a/cpan/Socket/Socket.pm
+++ b/cpan/Socket/Socket.pm
@@ -3,7 +3,7 @@ package Socket;
 use strict;
 { use 5.006001; }
 
-our $VERSION = '2.002';
+our $VERSION = '2.003';
 
 =head1 NAME
 
@@ -260,6 +260,18 @@ sockopts.
 Takes an C<ip_mreq> structure. Returns a list of two elements; the IPv4
 multicast address and interface address.
 
+=head2 $ip_mreq_source = pack_ip_mreq_source $multiaddr, $source, $interface
+
+Takes an IPv4 multicast address, source address, and optionally an interface
+address (or C<INADDR_ANY>). Returns the C<ip_mreq_source> structure with those
+arguments packed in. Suitable for use with the C<IP_ADD_SOURCE_MEMBERSHIP>
+and C<IP_DROP_SOURCE_MEMBERSHIP> sockopts.
+
+=head2 ($multiaddr, $source, $interface) = unpack_ip_mreq_source $ip_mreq
+
+Takes an C<ip_mreq_source> structure. Returns a list of three elements; the
+IPv4 multicast address, source address and interface address.
+
 =head2 $ipv6_mreq = pack_ipv6_mreq $multiaddr6, $ifindex
 
 Takes an IPv6 multicast address and an interface number. Returns the
@@ -736,24 +748,26 @@ our @EXPORT_OK = qw(
 
        SOCK_NONBLOCK SOCK_CLOEXEC
 
-       IP_ADD_MEMBERSHIP IP_DROP_MEMBERSHIP IP_MULTICAST_IF
-       IP_MULTICAST_LOOP IP_MULTICAST_TTL
+       IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_DROP_MEMBERSHIP
+       IP_DROP_SOURCE_MEMBERSHIP IP_MULTICAST_IF IP_MULTICAST_LOOP
+       IP_MULTICAST_TTL
 
        IPPROTO_IP IPPROTO_IPV6 IPPROTO_RAW IPPROTO_ICMP IPPROTO_TCP
        IPPROTO_UDP
 
-       TCP_CONGESTION TCP_CORK TCP_DEFER_ACCEPT TCP_INFO TCP_KEEPALIVE
-       TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXRT TCP_MAXSEG
-       TCP_MD5SIG TCP_NODELAY TCP_QUICKACK TCP_STDURG TCP_SYNCNT
-       TCP_WINDOW_CLAMP 
+       TCP_CONGESTION TCP_CONNECTIONTIMEOUT TCP_CORK TCP_DEFER_ACCEPT TCP_INFO
+       TCP_INIT_CWND TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL
+       TCP_LINGER2 TCP_MAXRT TCP_MAXSEG TCP_MD5SIG TCP_NODELAY TCP_NOOPT
+       TCP_NOPUSH TCP_QUICKACK TCP_SACK_ENABLE TCP_STDURG TCP_SYNCNT
+       TCP_WINDOW_CLAMP
 
        IN6ADDR_ANY IN6ADDR_LOOPBACK
 
-       IPV6_ADD_MEMBERSHIP IPV6_DROP_MEMBERSHIP IPV6_MTU IPV6_MTU_DISCOVER
-       IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP
-       IPV6_UNICAST_HOPS IPV6_V6ONLY
+       IPV6_ADD_MEMBERSHIP IPV6_DROP_MEMBERSHIP IPV6_JOIN_GROUP
+       IPV6_LEAVE_GROUP IPV6_MTU IPV6_MTU_DISCOVER IPV6_MULTICAST_HOPS
+       IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_UNICAST_HOPS IPV6_V6ONLY
 
-       pack_ip_mreq unpack_ip_mreq
+       pack_ip_mreq unpack_ip_mreq pack_ip_mreq_source unpack_ip_mreq_source
 
        pack_ipv6_mreq unpack_ipv6_mreq
 
diff --git a/cpan/Socket/Socket.xs b/cpan/Socket/Socket.xs
index f22c1f3..0bdebf5 100644
--- a/cpan/Socket/Socket.xs
+++ b/cpan/Socket/Socket.xs
@@ -1020,6 +1020,73 @@ unpack_ip_mreq(mreq_sv)
        }
 
 void
+pack_ip_mreq_source(multiaddr, source, interface=&PL_sv_undef)
+       SV *    multiaddr
+       SV *    source
+       SV *    interface
+       CODE:
+       {
+#if defined(HAS_IP_MREQ) && defined (IP_ADD_SOURCE_MEMBERSHIP)
+       struct ip_mreq_source mreq;
+       char * multiaddrbytes;
+       char * sourcebytes;
+       char * interfacebytes;
+       STRLEN len;
+       if (DO_UTF8(multiaddr) && !sv_utf8_downgrade(multiaddr, 1))
+               croak("Wide character in %s", "Socket::pack_ip_mreq_source");
+       multiaddrbytes = SvPVbyte(multiaddr, len);
+       if (len != sizeof(mreq.imr_multiaddr))
+               croak("Bad arg length %s, length is %"UVuf", should be %"UVuf,
+                     "Socket::pack_ip_mreq", (UV)len, 
(UV)sizeof(mreq.imr_multiaddr));
+       if (DO_UTF8(source) && !sv_utf8_downgrade(source, 1))
+               croak("Wide character in %s", "Socket::pack_ip_mreq_source");
+       if (len != sizeof(mreq.imr_sourceaddr))
+               croak("Bad arg length %s, length is %"UVuf", should be %"UVuf,
+                     "Socket::pack_ip_mreq", (UV)len, 
(UV)sizeof(mreq.imr_sourceaddr));
+       sourcebytes = SvPVbyte(source, len);
+       Zero(&mreq, sizeof(mreq), char);
+       Copy(multiaddrbytes, &mreq.imr_multiaddr, sizeof(mreq.imr_multiaddr), 
char);
+       Copy(sourcebytes, &mreq.imr_sourceaddr, sizeof(mreq.imr_sourceaddr), 
char);
+       if(SvOK(interface)) {
+               if (DO_UTF8(interface) && !sv_utf8_downgrade(interface, 1))
+                       croak("Wide character in %s", "Socket::pack_ip_mreq");
+               interfacebytes = SvPVbyte(interface, len);
+               if (len != sizeof(mreq.imr_interface))
+                       croak("Bad arg length %s, length is %"UVuf", should be 
%"UVuf,
+                             "Socket::pack_ip_mreq", (UV)len, 
(UV)sizeof(mreq.imr_interface));
+               Copy(interfacebytes, &mreq.imr_interface, 
sizeof(mreq.imr_interface), char);
+       }
+       else
+               mreq.imr_interface.s_addr = INADDR_ANY;
+       ST(0) = sv_2mortal(newSVpvn((char *)&mreq, sizeof(mreq)));
+#else
+       not_here("pack_ip_mreq_source");
+#endif
+       }
+
+void
+unpack_ip_mreq_source(mreq_sv)
+       SV * mreq_sv
+       PPCODE:
+       {
+#if defined(HAS_IP_MREQ) && defined (IP_ADD_SOURCE_MEMBERSHIP)
+       struct ip_mreq_source mreq;
+       STRLEN mreqlen;
+       char * mreqbytes = SvPVbyte(mreq_sv, mreqlen);
+       if (mreqlen != sizeof(mreq))
+               croak("Bad arg length for %s, length is %"UVuf", should be 
%"UVuf,
+                     "Socket::unpack_ip_mreq_source", (UV)mreqlen, 
(UV)sizeof(mreq));
+       Copy(mreqbytes, &mreq, sizeof(mreq), char);
+       EXTEND(SP, 3);
+       mPUSHp((char *)&mreq.imr_multiaddr, sizeof(mreq.imr_multiaddr));
+       mPUSHp((char *)&mreq.imr_sourceaddr, sizeof(mreq.imr_sourceaddr));
+       mPUSHp((char *)&mreq.imr_interface, sizeof(mreq.imr_interface));
+#else
+       not_here("unpack_ip_mreq_source");
+#endif
+       }
+
+void
 pack_ipv6_mreq(multiaddr, interface)
        SV *    multiaddr
        unsigned int    interface
diff --git a/cpan/Socket/t/ip_mreq.t b/cpan/Socket/t/ip_mreq.t
index f08920c..2a99509 100644
--- a/cpan/Socket/t/ip_mreq.t
+++ b/cpan/Socket/t/ip_mreq.t
@@ -5,6 +5,7 @@ use Test::More;
 use Socket qw(
     INADDR_ANY
     pack_ip_mreq unpack_ip_mreq
+    pack_ip_mreq_source unpack_ip_mreq_source
 );
 
 # Check that pack/unpack_ip_mreq either croak with "Not implemented", or
@@ -19,7 +20,7 @@ if( !defined $packed ) {
     die $@;
 }
 
-plan tests => 3;
+plan tests => 6;
 
 my @unpacked = unpack_ip_mreq $packed;
 
@@ -27,3 +28,14 @@ is( $unpacked[0], "\xe0\0\0\1", 'unpack_ip_mreq multiaddr' );
 is( $unpacked[1], INADDR_ANY,   'unpack_ip_mreq interface' );
 
 is( (unpack_ip_mreq pack_ip_mreq "\xe0\0\0\1")[1], INADDR_ANY, 'pack_ip_mreq 
interface defaults to INADDR_ANY' );
+
+SKIP: {
+    my $mreq;
+    skip 3, "No pack_ip_mreq_source" unless defined eval { $mreq = 
pack_ip_mreq_source "\xe0\0\0\2", "\x0a\0\0\1", INADDR_ANY };
+
+    @unpacked = unpack_ip_mreq_source $mreq;
+
+    is( $unpacked[0], "\xe0\0\0\2", 'unpack_ip_mreq_source multiaddr' );
+    is( $unpacked[1], "\x0a\0\0\1", 'unpack_ip_mreq_source source' );
+    is( $unpacked[2], INADDR_ANY,   'unpack_ip_mreq_source interface' );
+}
diff --git a/pod/perldelta.pod b/pod/perldelta.pod
index ec6f10c..59f4e4a 100644
--- a/pod/perldelta.pod
+++ b/pod/perldelta.pod
@@ -46,7 +46,7 @@ L</Selected Bug Fixes> section.
 
 [ List each incompatible change as a =head2 entry ]
 
-=head2 C<$ENV{foo} = undef> deletes value from environ, like C<delete 
$ENV{foo}>
+=head2 C<$ENV{foo}=undef> deletes value from environ, like C<delete $ENV{foo}>
 
 This facilitates use of C<local()> with C<%ENV> entries.  In previous
 versions of Perl, C<undef> was converted to the empty string.
@@ -159,8 +159,8 @@ up serialization drastically.
 
 =item *
 
-L<Devel::Peek> has been upgraded from version 1.08 to 1.09.  The only change 
has
-been to the test script, to account for changes to some flags in perl's
+L<Devel::Peek> has been upgraded from version 1.08 to 1.09.  The only change
+has been to the test script, to account for changes to some flags in perl's
 internals.
 
 =item *
@@ -171,9 +171,9 @@ Encode::UTF7 and Encode::GSM0338.
 
 =item *
 
-L<Module::Build> has been upgraded from version 0.40 to 0.4002.  A minor bug 
fix
-allows markup to be used around the leading "Name" in a POD "abstract" line, 
and
-some documentation improvements have been made.
+L<Module::Build> has been upgraded from version 0.40 to 0.4002.  A minor bug
+fix allows markup to be used around the leading "Name" in a POD "abstract"
+line, and some documentation improvements have been made.
 
 =item *
 
@@ -189,12 +189,14 @@ Various enhancements include the new use of 
Module::Metadata.
 =item *
 
 L<Module::Metadata> has been upgraded from version 1.000009 to 1.000010.  The
-creation of a Module::Metadata object for a typical module file has been sped 
up
-by about 40%.
+creation of a Module::Metadata object for a typical module file has been sped
+up by about 40%.
 
 =item *
 
-L<Module::Pluggable> has been upgraded from version 4.0 to 4.2.  XXX TODO
+L<Module::Pluggable> has been upgraded from version 4.0 to 4.2.  Amongst other
+changes, triggers are now allowed on events, which gives a powerful way to
+modify behaviour.
 
 =item *
 
@@ -211,6 +213,11 @@ brackets, i.e. C</s/> or C</s/i>.
 
 =item *
 
+L<Socket> has been upgraded from version 2.002 to 2.003.  Constants and
+functions required for IP multicast source group membership have been added.
+
+=item *
+
 L<Storable> has been upgraded from version 2.37 to 2.38.  It can now freeze
 and thaw vstrings correctly.  This causes a slight incompatible change in
 the storage format, so the format version has increased to 2.9.

--
Perl5 Master Repository

Reply via email to