diff options
author | 2011-03-13 01:27:23 +0000 | |
---|---|---|
committer | 2011-03-13 01:27:23 +0000 | |
commit | 111c676c88aaa52a33742f40d04df650aacea937 (patch) | |
tree | 3b2560b3795e5beabcc04561bcf91668fe18be88 | |
parent | Change daddr_t to daddr32_t. The bootblocks on our architectures only (diff) | |
download | wireguard-openbsd-111c676c88aaa52a33742f40d04df650aacea937.tar.xz wireguard-openbsd-111c676c88aaa52a33742f40d04df650aacea937.zip |
Test that reading from a spliced socket does not return eof if there
is still data in the receive socket buffer.
-rw-r--r-- | regress/sys/kern/splice/args-relay-read-eof.pl | 27 | ||||
-rw-r--r-- | regress/sys/kern/splice/funcs.pl | 10 |
2 files changed, 35 insertions, 2 deletions
diff --git a/regress/sys/kern/splice/args-relay-read-eof.pl b/regress/sys/kern/splice/args-relay-read-eof.pl new file mode 100644 index 00000000000..3287c099572 --- /dev/null +++ b/regress/sys/kern/splice/args-relay-read-eof.pl @@ -0,0 +1,27 @@ +# test waiting for splice finish with read and eof has happend + +use strict; +use warnings; + +our %args = ( + client => { + # fill server buffer, relay send buffer, half relay recv buffer + # then send eof + len => 2**13 + 2**10, + }, + relay => { + nonblocking => 1, + readblocking => 1, + sndbuf => 2**12, + rcvbuf => 2**12, + }, + server => { + # wait until all buffers are filled and client sends eof + func => sub { sleep 4; read_char(@_); }, + rcvbuf => 2**12, + }, + len => 9216, + md5 => "6d263239be35ccf30cb04c5f58a35dbe", +); + +1; diff --git a/regress/sys/kern/splice/funcs.pl b/regress/sys/kern/splice/funcs.pl index 973b5db8e6e..e294e403c69 100644 --- a/regress/sys/kern/splice/funcs.pl +++ b/regress/sys/kern/splice/funcs.pl @@ -1,4 +1,4 @@ -# $OpenBSD: funcs.pl,v 1.3 2011/03/12 18:58:54 bluhm Exp $ +# $OpenBSD: funcs.pl,v 1.4 2011/03/13 01:27:23 bluhm Exp $ # Copyright (c) 2010,2011 Alexander Bluhm <bluhm@openbsd.org> # @@ -195,8 +195,14 @@ sub relay_splice { or die ref($self), " splice stdin to stdout failed: $!"; if ($self->{readblocking}) { + my $read; # block by reading from the source socket - defined(my $read = sysread(STDIN, my $buf, 2**16)) + do { + # busy loop to test soreceive + $read = sysread(STDIN, my $buf, 2**16); + } while ($self->{nonblocking} && !defined($read) && + $!{EAGAIN}); + defined($read) or die ref($self), " read blocking failed: $!"; $read > 0 and die ref($self), " read blocking has data: $read"; |