xref: /openbsd-src/regress/sys/kern/sosplice/tcp/args-relay-read-forked.pl (revision ac2ce1ebbd554cc7635a3f2942adcb49bd98d6dc)
1f39f8f30Sbluhm# test concurrent read and splice
2f39f8f30Sbluhm
3f39f8f30Sbluhmuse strict;
4f39f8f30Sbluhmuse warnings;
5f39f8f30Sbluhmuse POSIX;
6f39f8f30Sbluhmuse Time::HiRes;
7f39f8f30Sbluhm
8f39f8f30Sbluhmour %args = (
9f39f8f30Sbluhm    client => {
10*ac2ce1ebSbluhm	func => sub { errignore(@_); write_stream(@_); },
11f39f8f30Sbluhm	len => 2**20,
12*ac2ce1ebSbluhm	nocheck => 1,
13f39f8f30Sbluhm    },
14f39f8f30Sbluhm    relay => {
15*ac2ce1ebSbluhm	# terminate in time on slow machines
16*ac2ce1ebSbluhm	alarm => 25,
17*ac2ce1ebSbluhm	down => "Alarm|Shutdown",
18f39f8f30Sbluhm	nonblocking => 1,
19f39f8f30Sbluhm	func => sub {
20f39f8f30Sbluhm	    defined(my $pid = fork())
21f39f8f30Sbluhm		or die "relay func: fork failed: $!";
22f39f8f30Sbluhm	    if ($pid == 0) {
23*ac2ce1ebSbluhm		alarm(25);
24f39f8f30Sbluhm		my $n;
25f39f8f30Sbluhm		do {
26f39f8f30Sbluhm		    $n = sysread(STDIN, my $buf, 10);
27f39f8f30Sbluhm		} while (!defined($n) || $n);
28f39f8f30Sbluhm		POSIX::_exit(0);
29f39f8f30Sbluhm	    }
30f39f8f30Sbluhm	    # give the userland a moment to read, even if splicing
31f39f8f30Sbluhm	    sleep .1;
32f39f8f30Sbluhm	    relay(@_);
33f39f8f30Sbluhm	    kill 9, $pid;
34*ac2ce1ebSbluhm	    waitpid($pid, 0);
35f39f8f30Sbluhm	},
36f39f8f30Sbluhm	# As sysread() may extract data from the socket before splicing starts,
37f39f8f30Sbluhm	# the spliced content length is not reliable.  Disable the checks.
38f39f8f30Sbluhm	nocheck => 1,
39f39f8f30Sbluhm    },
40f39f8f30Sbluhm    server => {
41f39f8f30Sbluhm	func => sub { sleep 2; read_stream(@_); },
42f39f8f30Sbluhm	nocheck => 1,
43f39f8f30Sbluhm    },
44f39f8f30Sbluhm    len => 1048576,
45f39f8f30Sbluhm    md5 => '6649bbec13f3d7efaedf01c0cfa54f88',
46f39f8f30Sbluhm);
47