1# test EBUSY for splicing to a spliced socket
2
3use strict;
4use warnings;
5use IO::Socket::IP;
6use BSD::Socket::Splice "SO_SPLICE";
7
8our %args = (
9    errno => 'EBUSY',
10    func => sub {
11	my $sl = IO::Socket::IP->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::IP->new(
18	    Proto => "tcp",
19	    PeerAddr => $sl->sockhost(),
20	    PeerPort => $sl->sockport(),
21	) or die "socket connect failed: $!";
22
23	my $ss = IO::Socket::IP->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::IP->new(
33	    Proto => "tcp",
34	    PeerAddr => $sl->sockhost(),
35	    PeerPort => $sl->sockport(),
36	) or die "socket other failed: $!";
37
38	$so->setsockopt(SOL_SOCKET, SO_SPLICE, pack('i', $ss->fileno()))
39	    and die "splice to spliced socket succeeded";
40    },
41);
42