|
Packit |
8bbd3c |
#!/usr/bin/perl
|
|
Packit |
8bbd3c |
|
|
Packit |
8bbd3c |
use strict;
|
|
Packit |
8bbd3c |
use warnings;
|
|
Packit |
8bbd3c |
|
|
Packit |
8bbd3c |
use Test::More;
|
|
Packit |
8bbd3c |
|
|
Packit |
8bbd3c |
use IO::Socket::IP;
|
|
Packit |
8bbd3c |
|
|
Packit |
8bbd3c |
use Errno qw( EACCES );
|
|
Packit |
8bbd3c |
use Socket qw( SOL_SOCKET SO_REUSEADDR SO_REUSEPORT SO_BROADCAST );
|
|
Packit |
8bbd3c |
|
|
Packit |
8bbd3c |
TODO: {
|
|
Packit |
8bbd3c |
local $TODO = "SO_REUSEADDR doesn't appear to work on cygwin smokers" if $^O eq "cygwin";
|
|
Packit |
8bbd3c |
# I honestly have no idea why this fails, and people don't seem to be able
|
|
Packit |
8bbd3c |
# to reproduce it on a development box. I'll mark it TODO for now until we
|
|
Packit |
8bbd3c |
# can gain any more insight into it.
|
|
Packit |
8bbd3c |
|
|
Packit |
8bbd3c |
my $sock = IO::Socket::IP->new(
|
|
Packit |
8bbd3c |
LocalHost => "127.0.0.1",
|
|
Packit |
8bbd3c |
Type => SOCK_STREAM,
|
|
Packit |
8bbd3c |
Listen => 1,
|
|
Packit |
8bbd3c |
ReuseAddr => 1,
|
|
Packit |
8bbd3c |
) or die "Cannot socket() - $@";
|
|
Packit |
8bbd3c |
|
|
Packit |
8bbd3c |
ok( $sock->getsockopt( SOL_SOCKET, SO_REUSEADDR ), 'SO_REUSEADDR set' );
|
|
Packit |
8bbd3c |
|
|
Packit |
8bbd3c |
$sock = IO::Socket::IP->new(
|
|
Packit |
8bbd3c |
LocalHost => "127.0.0.1",
|
|
Packit |
8bbd3c |
Type => SOCK_STREAM,
|
|
Packit |
8bbd3c |
Listen => 1,
|
|
Packit |
8bbd3c |
Sockopts => [
|
|
Packit |
8bbd3c |
[ SOL_SOCKET, SO_REUSEADDR ],
|
|
Packit |
8bbd3c |
],
|
|
Packit |
8bbd3c |
) or die "Cannot socket() - $@";
|
|
Packit |
8bbd3c |
|
|
Packit |
8bbd3c |
ok( $sock->getsockopt( SOL_SOCKET, SO_REUSEADDR ), 'SO_REUSEADDR set via Sockopts' );
|
|
Packit |
8bbd3c |
}
|
|
Packit |
8bbd3c |
|
|
Packit |
8bbd3c |
SKIP: {
|
|
Packit |
8bbd3c |
# Some OSes don't implement SO_REUSEPORT
|
|
Packit |
8bbd3c |
skip "No SO_REUSEPORT constant", 1 unless defined eval { SO_REUSEPORT };
|
|
Packit |
8bbd3c |
skip "No support for SO_REUSEPORT", 1 unless defined eval {
|
|
Packit |
8bbd3c |
my $s;
|
|
Packit |
8bbd3c |
socket( $s, Socket::PF_INET, Socket::SOCK_STREAM, 0 ) and
|
|
Packit |
8bbd3c |
setsockopt( $s, SOL_SOCKET, SO_REUSEPORT, 1 ) };
|
|
Packit |
8bbd3c |
|
|
Packit |
8bbd3c |
my $sock = IO::Socket::IP->new(
|
|
Packit |
8bbd3c |
LocalHost => "127.0.0.1",
|
|
Packit |
8bbd3c |
Type => SOCK_STREAM,
|
|
Packit |
8bbd3c |
Listen => 1,
|
|
Packit |
8bbd3c |
ReusePort => 1,
|
|
Packit |
8bbd3c |
) or die "Cannot socket() - $@";
|
|
Packit |
8bbd3c |
|
|
Packit |
8bbd3c |
ok( $sock->getsockopt( SOL_SOCKET, SO_REUSEPORT ), 'SO_REUSEPORT set' );
|
|
Packit |
8bbd3c |
}
|
|
Packit |
8bbd3c |
|
|
Packit |
8bbd3c |
SKIP: {
|
|
Packit |
8bbd3c |
# Some OSes need special privileges to set SO_BROADCAST
|
|
Packit |
8bbd3c |
$! = 0;
|
|
Packit |
8bbd3c |
my $sock = IO::Socket::IP->new(
|
|
Packit |
8bbd3c |
LocalHost => "127.0.0.1",
|
|
Packit |
8bbd3c |
Type => SOCK_DGRAM,
|
|
Packit |
8bbd3c |
Broadcast => 1,
|
|
Packit |
8bbd3c |
);
|
|
Packit |
8bbd3c |
skip "Privileges required to set broadcast on datagram socket", 1 if !$sock and $! == EACCES;
|
|
Packit |
8bbd3c |
die "Cannot socket() - $@" unless $sock;
|
|
Packit |
8bbd3c |
|
|
Packit |
8bbd3c |
ok( $sock->getsockopt( SOL_SOCKET, SO_BROADCAST ), 'SO_BROADCAST set' );
|
|
Packit |
8bbd3c |
}
|
|
Packit |
8bbd3c |
|
|
Packit |
8bbd3c |
done_testing;
|