Socket-Multicast6-0.04/0000755000076500000240000000000011304334366013363 5ustar njhstaffSocket-Multicast6-0.04/Build.PL0000444000076500000240000000441711304334366014663 0ustar njhstaffuse Module::Build; my $class = Module::Build->subclass( code => q{ use Devel::PPPort; use ExtUtils::Constant; sub ACTION_build { my $self = shift; $self->depends_on('ppport_h','constants'); $self->SUPER::ACTION_build; } sub ACTION_ppport_h { my $self = shift; my $filepath = 'lib/Socket/ppport.h'; unless (-e $filepath) { print "Writing $filepath\n"; Devel::PPPort::WriteFile($filepath); } $self->add_to_cleanup($filepath); } sub ACTION_constants { my $self = shift; my $c_file_path = 'lib/Socket/const-c.inc'; my $xs_file_path = 'lib/Socket/const-xs.inc'; unless (-e $c_file_path && -e $xs_file_path) { print "Writing $c_file_path and $xs_file_path\n"; ExtUtils::Constant::WriteConstants( NAME => 'Socket::Multicast6', NAMES => [qw( IP_MULTICAST_IF IP_MULTICAST_TTL IP_MULTICAST_LOOP IP_ADD_MEMBERSHIP IP_DROP_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IPV6_MULTICAST_IF IPV6_MULTICAST_HOPS IPV6_MULTICAST_LOOP IPV6_JOIN_GROUP IPV6_LEAVE_GROUP MCAST_JOIN_GROUP MCAST_BLOCK_SOURCE MCAST_UNBLOCK_SOURCE MCAST_LEAVE_GROUP MCAST_JOIN_SOURCE_GROUP MCAST_LEAVE_SOURCE_GROUP )], C_FILE => $c_file_path, XS_FILE => $xs_file_path ); } $self->add_to_cleanup($c_file_path); $self->add_to_cleanup($xs_file_path); } }, ); my $build = $class->new ( module_name => 'Socket::Multicast6', license => 'perl', build_requires => { 'Module::Build' => '0.20', 'ExtUtils::Constant' => 0, 'ExtUtils::CBuilder' => 0, 'Devel::PPPort' => 0, }, requires => { 'perl' => '5.6.1', 'Socket' => 0, 'Test::More' => 0, 'Socket' => 0, 'Socket6' => 0.19, } ); $build->create_build_script; Socket-Multicast6-0.04/Changes0000444000076500000240000000103211304334366014650 0ustar njhstaffRevision history for Perl extension Socket::Multicast6. 0.04 Sat Nov 28 23:54:08 GMT 2009 - Added missing test to the manifest 0.03 Mon Nov 23 21:02:39 GMT 2009 - Minor changes to documentation - Changed build system to use Module::Build 0.02 Mon Sep 25 16:52:17 BST 2006 - Now imports SSM/Protocol-Independent Multicast symbols - Rewrote part of pack_ip_mreq() - Added pack_ip_mreq_source() and test for it 0.01 Wed Sep 13 14:51:53 BST 2006 - original version based on Socket::Multicast version 0.01 Socket-Multicast6-0.04/lib/0000755000076500000240000000000011304334366014131 5ustar njhstaffSocket-Multicast6-0.04/lib/Socket/0000755000076500000240000000000011304334366015361 5ustar njhstaffSocket-Multicast6-0.04/lib/Socket/Multicast6.pm0000444000076500000240000001014711304334366017753 0ustar njhstaffpackage Socket::Multicast6; use strict; use warnings; use vars qw(@ISA $VERSION); use Carp; our $VERSION = '0.04'; require XSLoader; XSLoader::load('Socket::Multicast6', $VERSION); require Exporter; our @ISA = qw(Exporter); my @export_ipv4 = qw( IP_MULTICAST_IF IP_MULTICAST_TTL IP_MULTICAST_LOOP IP_ADD_MEMBERSHIP IP_DROP_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP pack_ip_mreq pack_ip_mreq_source ); my @export_ipv6 = qw( IPV6_MULTICAST_IF IPV6_MULTICAST_HOPS IPV6_MULTICAST_LOOP IPV6_JOIN_GROUP IPV6_LEAVE_GROUP pack_ipv6_mreq ); my @export_independent = qw( MCAST_JOIN_GROUP MCAST_BLOCK_SOURCE MCAST_UNBLOCK_SOURCE MCAST_LEAVE_GROUP MCAST_JOIN_SOURCE_GROUP MCAST_LEAVE_SOURCE_GROUP ); our %EXPORT_TAGS = ( 'ipv4' => [ @export_ipv4 ], 'ipv6' => [ @export_ipv6 ], 'independent' => [ @export_independent ], 'all' => [ @export_ipv4, @export_ipv6, @export_independent ], ); our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); our @EXPORT = ( ); sub AUTOLOAD { # This AUTOLOAD is used to 'autoload' constants from the constant() # XS function. If a constant is not found then control is passed # to the AUTOLOAD in AutoLoader. my $constname; our $AUTOLOAD; ($constname = $AUTOLOAD) =~ s/.*:://; croak "&Socket::Multicast6::constant not defined" if $constname eq 'constant'; my ($error, $val) = constant($constname); if ($error) { if ($error =~ /is not a valid/) { $AutoLoader::AUTOLOAD = $AUTOLOAD; goto &AutoLoader::AUTOLOAD; } else { croak $error; } } no strict 'refs'; *$AUTOLOAD = sub { $val }; goto &$AUTOLOAD; } 1; __END__ =head1 NAME Socket::Multicast6 - Constructors and constants for IPv4 and IPv6 multicast socket operations. =head1 SYNOPSIS use Socket::Multicast6 qw(:all); my $ip = getprotobyname( 'ip' ); my $ip_mreq = pack_ip_mreq( inet_aton( $mcast_addr ), inet_aton( $if_addr ) ); my $ipv6_mreq = pack_ipv6_mreq( inet_pton( AF_INET6, $mcast6_addr ), $if_index ); setsockopt( $sock, $ip, IP_ADD_MEMBERSHIP, $ip_mreq ) or die( "setsockopt IP_ADD_MEMBERSHIP failed: $!" ); setsockopt( $sock, $ip, IP_DROP_MEMBERSHIP, $ip_mreq ) or die( "setsockopt IP_DROP_MEMBERSHIP failed: $!" ); setsockopt( $sock, $ip, IP_MULTICAST_LOOP, pack( 'C', $loop ) ) or die( "setsockopt IP_MULTICAST_LOOP failed: $!" ); setsockopt( $sock, $ip, IP_MULTICAST_TTL, pack( 'C', $ttl ) ) or die( "setsockopt IP_MULTICAST_TTL failed: $!" ); =head1 DESCRIPTION This module is used to gain access to constants and utility functions used when manipulating multicast socket attributes. For simple, object-oriented way of doing the same thing, take a look at L or L. =head1 EXPORTS By default nothing is exported, you can use the 'ipv4', 'ipv6' and 'independent' to export a specific protocol family, or 'all' to export all symbols. =head1 FUNCTIONS =item $ip_mreq = pack_ip_mreq(MCAST_ADDR, IF_ADDR) =item $ip_mreq_source = pack_ip_mreq_source(MCAST_ADDR, SOURCE_ADDR, IF_ADDR) =item $ipv6_mreq = pack_ipv6_mreq(MCAST6_ADDR, IF_INDEX) =head1 CONSTANTS =over =item IP_MULTICAST_IF =item IP_MULTICAST_TTL =item IP_MULTICAST_LOOP =item IP_ADD_MEMBERSHIP =item IP_DROP_MEMBERSHIP =item IP_ADD_SOURCE_MEMBERSHIP =item IP_DROP_SOURCE_MEMBERSHIP =item IPV6_MULTICAST_IF =item IPV6_MULTICAST_HOPS =item IPV6_MULTICAST_LOOP =item IPV6_JOIN_GROUP =item IPV6_LEAVE_GROUP =item MCAST_JOIN_GROUP =item MCAST_BLOCK_SOURCE =item MCAST_UNBLOCK_SOURCE =item MCAST_LEAVE_GROUP =item MCAST_JOIN_SOURCE_GROUP =item MCAST_LEAVE_SOURCE_GROUP =back =head1 SEE ALSO L (The easier, object-oriented way) =head1 AUTHOR Based on L by Jonathan Steinert, Ehachi@cpan.orgE Socket::Multicast6 by Nicholas J Humfrey, Enjh@cpan.orgE =head1 COPYRIGHT AND LICENSE Copyright (C) 2006 Nicholas J Humfrey Copyright (C) 2006 Jonathan Steinert This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.6.1 or, at your option, any later version of Perl 5 you may have available. =cut Socket-Multicast6-0.04/lib/Socket/Multicast6.xs0000444000076500000240000001027011304334366017766 0ustar njhstaff/* Copyright (C) 2006 Nicholas J Humfrey Copyright (C) 2006 Jonathan Steinert This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.6.1 or, at your option, any later version of Perl 5 you may have available. */ #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "ppport.h" #include #include #ifdef WIN32 // winsock.h is for winsock <= 1.1 // #include // ws2tcpip.h is for winsock >= 2.0 #include #endif #include "const-c.inc" MODULE = Socket::Multicast6 PACKAGE = Socket::Multicast6 INCLUDE: const-xs.inc PROTOTYPES: ENABLE void pack_ip_mreq(imr_multiaddr_sv, imr_interface_sv) SV* imr_multiaddr_sv SV* imr_interface_sv CODE: { struct ip_mreq mreq; STRLEN addrlen; char * addr; // Clear out final struct Zero( &mreq, 1, struct ip_mreq ); // Byte load multicast address addr = SvPVbyte(imr_multiaddr_sv, addrlen); if (addrlen == sizeof(mreq.imr_multiaddr) || addrlen == 4) // Copy across the multicast address Copy( addr, &mreq.imr_multiaddr, 1, struct in_addr ); else croak("Bad arg length for %s, length is %d, should be %d", "Socket::Multicast6::pack_ip_mreq", addrlen, sizeof(mreq.imr_multiaddr)); // Byte load interface address addr = SvPVbyte(imr_interface_sv, addrlen); if (addrlen == sizeof(mreq.imr_interface) || addrlen == 4) // Copy across the interface address Copy( addr, &mreq.imr_interface, 1, struct in_addr ); else croak("Bad arg length for %s, length is %d, should be %d", "Socket::Multicast6::pack_ip_mreq", addrlen, sizeof(mreq.imr_interface)); // new mortal string, return it. ST(0) = sv_2mortal(newSVpvn((char *)&mreq, sizeof(mreq))); } void pack_ip_mreq_source(imr_multiaddr_sv, imr_source_sv, imr_interface_sv) SV* imr_multiaddr_sv SV* imr_source_sv SV* imr_interface_sv CODE: { #ifdef IP_ADD_SOURCE_MEMBERSHIP struct ip_mreq_source mreq; STRLEN addrlen; char * addr; // Clear out final struct Zero( &mreq, 1, struct ip_mreq_source ); // Byte load multicast address addr = SvPVbyte(imr_multiaddr_sv, addrlen); if (addrlen == sizeof(mreq.imr_multiaddr) || addrlen == 4) // Copy across the multicast address Copy( addr, &mreq.imr_multiaddr, 1, struct in_addr ); else croak("Bad arg length for %s, length is %d, should be %d", "Socket::Multicast6::ip_mreq_source", addrlen, sizeof(mreq.imr_multiaddr)); // Byte load source address addr = SvPVbyte(imr_source_sv, addrlen); if (addrlen == sizeof(mreq.imr_sourceaddr) || addrlen == 4) // Copy across the source address Copy( addr, &mreq.imr_sourceaddr, 1, struct in_addr ); else croak("Bad arg length for %s, length is %d, should be %d", "Socket::Multicast6::ip_mreq_source", addrlen, sizeof(mreq.imr_sourceaddr)); // Byte load interface address addr = SvPVbyte(imr_interface_sv, addrlen); if (addrlen == sizeof(mreq.imr_interface) || addrlen == 4) // Copy across the interface address Copy( addr, &mreq.imr_interface, 1, struct in_addr ); else croak("Bad arg length for %s, length is %d, should be %d", "Socket::Multicast6::ip_mreq_source", addrlen, sizeof(mreq.imr_interface)); // new mortal string, return it. ST(0) = sv_2mortal(newSVpvn((char *)&mreq, sizeof(mreq))); #else XSRETURN_UNDEF; #endif } void pack_ipv6_mreq(imr_multiaddr_sv, imr_interface_idx) SV* imr_multiaddr_sv unsigned int imr_interface_idx CODE: { struct ipv6_mreq mreq; STRLEN addrlen; char * addr; // Clear out final struct Zero( &mreq, sizeof mreq, char ); // Copy across the interface number mreq.ipv6mr_interface = imr_interface_idx; // Byte load multicast address addr = SvPVbyte(imr_multiaddr_sv, addrlen); if (addrlen == sizeof(mreq.ipv6mr_multiaddr) || addrlen == 16) // Copy accross the multicast address Copy( addr, &mreq.ipv6mr_multiaddr, 1, struct in6_addr ); else croak("Bad arg length for %s, length is %d, should be %d", "Socket::Multicast6::pack_ipv6_mreq", addrlen, sizeof(mreq.ipv6mr_multiaddr)); // new mortal string, return it. ST(0) = sv_2mortal(newSVpvn((char *)&mreq, sizeof(mreq))); } Socket-Multicast6-0.04/MANIFEST0000444000076500000240000000031711304334366014513 0ustar njhstaffBuild.PL Changes lib/Socket/Multicast6.pm lib/Socket/Multicast6.xs MANIFEST README t/00-Socket-Multicast.t t/10-socket-options.t t/20-pack-ip-mreq.t t/20-pack-ipv6-mreq.t t/30-pack-ip-mreq-source.t META.yml Socket-Multicast6-0.04/META.yml0000444000076500000240000000135511304334366014636 0ustar njhstaff--- name: Socket-Multicast6 version: 0.04 author: - |- Based on L by Jonathan Steinert, Ehachi@cpan.orgE Socket::Multicast6 by Nicholas J Humfrey, Enjh@cpan.orgE abstract: Constructors and constants for IPv4 and IPv6 multicast socket operations. license: perl resources: license: http://dev.perl.org/licenses/ requires: Socket: 0 Socket6: 0.19 Test::More: 0 perl: 5.6.1 build_requires: Devel::PPPort: 0 ExtUtils::CBuilder: 0 ExtUtils::Constant: 0 Module::Build: 0.20 provides: Socket::Multicast6: file: lib/Socket/Multicast6.pm version: 0.04 generated_by: Module::Build version 0.280801 meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.2.html version: 1.2 Socket-Multicast6-0.04/README0000444000076500000240000000105011304334366014235 0ustar njhstaffSocket::Multicast6 version 0.01 =============================== Constructors and constants for IPv4 and IPv6 multicast socket operations. INSTALLATION To install this module type the following: perl Makefile.PL make make test make install COPYRIGHT AND LICENCE Copyright (C) 2006 by Jonathan Steinert, Nicholas J Humfrey This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.8 or, at your option, any later version of Perl 5 you may have available. Socket-Multicast6-0.04/t/0000755000076500000240000000000011304334366013626 5ustar njhstaffSocket-Multicast6-0.04/t/00-Socket-Multicast.t0000444000076500000240000000010411304334366017414 0ustar njhstaffuse Test::More tests => 1; BEGIN { use_ok('Socket::Multicast6') }; Socket-Multicast6-0.04/t/10-socket-options.t0000444000076500000240000000111111304334366017202 0ustar njhstaffuse Test::More tests => 14; use Socket; use Socket6; use Socket::Multicast6 qw/ :all /; my @socket_options = ( 'AF_INET', 'AF_INET6', 'IPPROTO_IP', 'IPPROTO_IPV6', 'IP_MULTICAST_IF', 'IP_MULTICAST_TTL', 'IP_MULTICAST_LOOP', 'IP_ADD_MEMBERSHIP', 'IP_DROP_MEMBERSHIP', 'IPV6_MULTICAST_IF', 'IPV6_MULTICAST_HOPS', 'IPV6_MULTICAST_LOOP', 'IPV6_JOIN_GROUP', 'IPV6_LEAVE_GROUP' ); # # We don't currently check for SSM/Protocol-Independent Multicast # foreach my $opt ( @socket_options ) { my $value = eval "$opt"; ok( defined $value, "Value of $opt is defined" ); } Socket-Multicast6-0.04/t/20-pack-ip-mreq.t0000444000076500000240000000063611304334366016523 0ustar njhstaffuse Test::More tests => 100; use Socket; use Socket::Multicast6; foreach (1..100) { my $multiaddr = inet_aton( rand_ip() ); my $interface = inet_aton( rand_ip() ); my $pack_ip_mreq = Socket::Multicast6::pack_ip_mreq( $multiaddr, $interface ); my $manual = $multiaddr . $interface; is( $pack_ip_mreq, $manual, "Packed structures match" ); } sub rand_ip { return join '.', map { int rand 255 } (1..4); } Socket-Multicast6-0.04/t/20-pack-ipv6-mreq.t0000444000076500000240000000101311304334366016765 0ustar njhstaffuse Test::More tests => 5; use Socket; use Socket6; use Socket::Multicast6; my @IPV6_MCAST_ADDRS = ( 'ff01::0', 'ff02::1', 'ff05::1:3', 'ff1e:4838:dead::beef', 'ff78:140:2001:630:d0:f000:feed:80', ); foreach my $addr (@IPV6_MCAST_ADDRS) { my $multiaddr = inet_pton( AF_INET6, $addr ); my $interface = int rand(255); my $pack_ip_mreq = Socket::Multicast6::pack_ipv6_mreq( $multiaddr, $interface ); my $manual = $multiaddr . pack('I',$interface); is( $pack_ip_mreq, $manual, "Packed structures match" ); } Socket-Multicast6-0.04/t/30-pack-ip-mreq-source.t0000444000076500000240000000117011304334366020014 0ustar njhstaff use Socket; use Test::More; use Socket::Multicast6 qw/:ipv4/; unless (defined eval("IP_ADD_SOURCE_MEMBERSHIP")) { plan skip_all => "Source Specific Multicast isn't available on this system."; } else { plan tests => 100; } foreach (1..100) { my $multiaddr = inet_aton( rand_ip() ); my $sourceaddr = inet_aton( rand_ip() ); my $interface = inet_aton( rand_ip() ); my $pack_ip_mreq = pack_ip_mreq_source( $multiaddr, $sourceaddr, $interface ); my $manual = $multiaddr . $interface . $sourceaddr; is( $pack_ip_mreq, $manual, "Packed structures match" ); } sub rand_ip { return join '.', map { int rand 255 } (1..4); }