1# test EBUSY for splicing from a spliced socket 2 3use strict; 4use warnings; 5use IO::Socket; 6use BSD::Socket::Splice "SO_SPLICE"; 7 8our %args = ( 9 errno => 'EBUSY', 10 func => sub { 11 my $sl = IO::Socket::INET->new( 12 Proto => "tcp", 13 Listen => 5, 14 LocalAddr => "127.0.0.1", 15 ) or die "socket listen failed: $!"; 16 17 my $s = IO::Socket::INET->new( 18 Proto => "tcp", 19 PeerAddr => $sl->sockhost(), 20 PeerPort => $sl->sockport(), 21 ) or die "socket connect failed: $!"; 22 23 my $ss = IO::Socket::INET->new( 24 Proto => "tcp", 25 PeerAddr => $sl->sockhost(), 26 PeerPort => $sl->sockport(), 27 ) or die "socket splice connect failed: $!"; 28 29 $s->setsockopt(SOL_SOCKET, SO_SPLICE, pack('i', $ss->fileno())) 30 or die "splice failed: $!"; 31 32 my $so = IO::Socket::INET->new( 33 Proto => "tcp", 34 PeerAddr => $sl->sockhost(), 35 PeerPort => $sl->sockport(), 36 ) or die "socket other failed: $!"; 37 38 $s->setsockopt(SOL_SOCKET, SO_SPLICE, pack('i', $so->fileno())) 39 and die "splice from spliced socket succeeded"; 40 }, 41); 42