summaryrefslogtreecommitdiff
path: root/regress/sys/kern/sosplice/error/args-splice-EBUSY.pl
diff options
context:
space:
mode:
Diffstat (limited to 'regress/sys/kern/sosplice/error/args-splice-EBUSY.pl')
-rw-r--r--regress/sys/kern/sosplice/error/args-splice-EBUSY.pl41
1 files changed, 41 insertions, 0 deletions
diff --git a/regress/sys/kern/sosplice/error/args-splice-EBUSY.pl b/regress/sys/kern/sosplice/error/args-splice-EBUSY.pl
new file mode 100644
index 00000000000..a5ad9f40116
--- /dev/null
+++ b/regress/sys/kern/sosplice/error/args-splice-EBUSY.pl
@@ -0,0 +1,41 @@
+# test EBUSY for splicing to a spliced socket
+
+use strict;
+use warnings;
+use IO::Socket;
+use BSD::Socket::Splice "SO_SPLICE";
+
+our %args = (
+ errno => 'EBUSY',
+ func => sub {
+ my $sl = IO::Socket::INET->new(
+ Proto => "tcp",
+ Listen => 5,
+ LocalAddr => "127.0.0.1",
+ ) or die "socket listen failed: $!";
+
+ my $s = IO::Socket::INET->new(
+ Proto => "tcp",
+ PeerAddr => $sl->sockhost(),
+ PeerPort => $sl->sockport(),
+ ) or die "socket connect failed: $!";
+
+ my $ss = IO::Socket::INET->new(
+ Proto => "tcp",
+ PeerAddr => $sl->sockhost(),
+ PeerPort => $sl->sockport(),
+ ) or die "socket splice connect failed: $!";
+
+ $s->setsockopt(SOL_SOCKET, SO_SPLICE, pack('i', $ss->fileno()))
+ or die "splice failed: $!";
+
+ my $so = IO::Socket::INET->new(
+ Proto => "tcp",
+ PeerAddr => $sl->sockhost(),
+ PeerPort => $sl->sockport(),
+ ) or die "socket other failed: $!";
+
+ $so->setsockopt(SOL_SOCKET, SO_SPLICE, pack('i', $ss->fileno()))
+ and die "splice to spliced socket succeeded";
+ },
+);