mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-05-01 20:20:10 +00:00
TcpServerUtils.pm: wheeze compatibility mode (Forum #126290)
git-svn-id: https://svn.fhem.de/fhem/trunk@25866 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
0cba21bf4e
commit
25451eb095
@ -7,6 +7,26 @@ use warnings;
|
|||||||
use IO::Socket;
|
use IO::Socket;
|
||||||
use vars qw($SSL_ERROR);
|
use vars qw($SSL_ERROR);
|
||||||
|
|
||||||
|
my ($joinGroup, $leaveGroup, $multiCastLoop, $addMembership, $dropMembership);
|
||||||
|
|
||||||
|
# Perl 5.16 / wheezy compatibility mode / #126290
|
||||||
|
eval "Socket::IPV6_JOIN_GROUP";
|
||||||
|
if($@) {
|
||||||
|
$joinGroup = 20;
|
||||||
|
$leaveGroup = 21;
|
||||||
|
$multiCastLoop = 34;
|
||||||
|
$addMembership = 35;
|
||||||
|
$dropMembership = 36;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$joinGroup = eval "Socket::IPV6_JOIN_GROUP";
|
||||||
|
$leaveGroup = eval "Socket::IPV6_LEAVE_GROUP";
|
||||||
|
$multiCastLoop = eval "Socket::IP_MULTICAST_LOOP";
|
||||||
|
$addMembership = eval "Socket::IP_ADD_MEMBERSHIP";
|
||||||
|
$dropMembership = eval "Socket::IP_DROP_MEMBERSHIP";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
sub
|
sub
|
||||||
TcpServer_Open($$$;$)
|
TcpServer_Open($$$;$)
|
||||||
{
|
{
|
||||||
@ -71,8 +91,7 @@ TcpServer_SetLoopbackMode($$)
|
|||||||
|
|
||||||
my $old;
|
my $old;
|
||||||
if( !$hash->{IPV6} && $sock->sockdomain() == AF_INET ) {
|
if( !$hash->{IPV6} && $sock->sockdomain() == AF_INET ) {
|
||||||
my $packed = getsockopt($sock, Socket::IPPROTO_IP,
|
my $packed = getsockopt($sock, Socket::IPPROTO_IP, $multiCastLoop);
|
||||||
Socket::IP_MULTICAST_LOOP);
|
|
||||||
if( !$packed ) {
|
if( !$packed ) {
|
||||||
Log3 $name, 1, "$name: failed to get loopback mode: $!";
|
Log3 $name, 1, "$name: failed to get loopback mode: $!";
|
||||||
return undef;
|
return undef;
|
||||||
@ -80,7 +99,7 @@ TcpServer_SetLoopbackMode($$)
|
|||||||
$old = unpack("I", $packed);
|
$old = unpack("I", $packed);
|
||||||
|
|
||||||
if( !setsockopt($sock, Socket::IPPROTO_IP,
|
if( !setsockopt($sock, Socket::IPPROTO_IP,
|
||||||
Socket::IP_MULTICAST_LOOP, pack("I", $loopback ) ) ) {
|
$multiCastLoop, pack("I", $loopback ) ) ) {
|
||||||
Log3 $name, 1, "$name: could not set loopback mode: $!";
|
Log3 $name, 1, "$name: could not set loopback mode: $!";
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
@ -123,17 +142,13 @@ TcpServer_MCastAdd($$)
|
|||||||
|
|
||||||
# add multicast address
|
# add multicast address
|
||||||
if(!$hash->{IPV6} && $sock->sockdomain() == AF_INET) {
|
if(!$hash->{IPV6} && $sock->sockdomain() == AF_INET) {
|
||||||
# should we allow to specify the interfache instead of using any?
|
|
||||||
my $ip_mreq = Socket::pack_ip_mreq( inet_aton( $addr ), INADDR_ANY );
|
my $ip_mreq = Socket::pack_ip_mreq( inet_aton( $addr ), INADDR_ANY );
|
||||||
|
setsockopt($sock, Socket::IPPROTO_IP, $addMembership, $ip_mreq )
|
||||||
setsockopt($sock, Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, $ip_mreq )
|
|
||||||
or return "$name: could not set IP_ADD_MEMBERSHIP socket option: $!";
|
or return "$name: could not set IP_ADD_MEMBERSHIP socket option: $!";
|
||||||
|
|
||||||
} elsif($hash->{IPV6} && $sock->sockdomain() == AF_INET6) {
|
} elsif($hash->{IPV6} && $sock->sockdomain() == AF_INET6) {
|
||||||
# should we allow to specify the interfache instead of using any?
|
|
||||||
my $ipv6_mreq = Socket::pack_ipv6_mreq( inet_pton( AF_INET6, $addr ), 0 );
|
my $ipv6_mreq = Socket::pack_ipv6_mreq( inet_pton( AF_INET6, $addr ), 0 );
|
||||||
|
setsockopt($sock, Socket::IPPROTO_IPV6, $joinGroup, $ipv6_mreq )
|
||||||
setsockopt($sock, Socket::IPPROTO_IPV6, Socket::IPV6_JOIN_GROUP, $ipv6_mreq )
|
|
||||||
or return "$name: could not set IPV6_JOIN_GROUP socket option: $!";
|
or return "$name: could not set IPV6_JOIN_GROUP socket option: $!";
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -165,7 +180,7 @@ TcpServer_MCastRecv($$$;$)
|
|||||||
return $peer_host, $peer_port;
|
return $peer_host, $peer_port;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
Log3 $name, 1, "$name: TcpServer_MCastRecv failed: unsupported socket family";
|
Log3 $name, 1,"$name: TcpServer_MCastRecv failed: unsupported socket family";
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -214,17 +229,13 @@ TcpServer_MCastRemove($$)
|
|||||||
delete $hash->{ADDR};
|
delete $hash->{ADDR};
|
||||||
|
|
||||||
if(!$hash->{IPV6} && $sock->sockdomain() == AF_INET) {
|
if(!$hash->{IPV6} && $sock->sockdomain() == AF_INET) {
|
||||||
# should we allow to specify the interfache instead of using any?
|
|
||||||
my $ip_mreq = Socket::pack_ip_mreq( inet_aton( $addr ), INADDR_ANY );
|
my $ip_mreq = Socket::pack_ip_mreq( inet_aton( $addr ), INADDR_ANY );
|
||||||
|
setsockopt($sock, Socket::IPPROTO_IP, $dropMembership, $ip_mreq )
|
||||||
setsockopt($sock, Socket::IPPROTO_IP, Socket::IP_DROP_MEMBERSHIP, $ip_mreq )
|
|
||||||
or return "$name: could not set IP_DROP_MEMBERSHIP socket option: $!";
|
or return "$name: could not set IP_DROP_MEMBERSHIP socket option: $!";
|
||||||
|
|
||||||
} elsif($hash->{IPV6} && $sock->sockdomain() == AF_INET6) {
|
} elsif($hash->{IPV6} && $sock->sockdomain() == AF_INET6) {
|
||||||
# should we allow to specify the interfache instead of using any?
|
|
||||||
my $ipv6_mreq = Socket::pack_ipv6_mreq( inet_pton( AF_INET6, $addr ), 0 );
|
my $ipv6_mreq = Socket::pack_ipv6_mreq( inet_pton( AF_INET6, $addr ), 0 );
|
||||||
|
setsockopt($sock, Socket::IPPROTO_IPV6, $leaveGroup, $ipv6_mreq)
|
||||||
setsockopt($sock, Socket::IPPROTO_IPV6, Socket::IPV6_LEAVE_GROUP, $ipv6_mreq)
|
|
||||||
or return "$name: could not set IPV6_LEAVE_GROUP socket option: $!";
|
or return "$name: could not set IPV6_LEAVE_GROUP socket option: $!";
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -233,7 +244,6 @@ TcpServer_MCastRemove($$)
|
|||||||
}
|
}
|
||||||
|
|
||||||
readingsSingleUpdate($hash, "state", "Multicast listen stopped", 0);
|
readingsSingleUpdate($hash, "state", "Multicast listen stopped", 0);
|
||||||
|
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user