xref: /openbsd/regress/sys/kern/sosplice/tcp/echo.pl (revision 3488794c)
1f39f8f30Sbluhm#!/usr/bin/perl
2*3488794cSbluhm#	$OpenBSD: echo.pl,v 1.2 2017/10/27 16:59:14 bluhm Exp $
3f39f8f30Sbluhm
4f39f8f30Sbluhm# Copyright (c) 2010-2013 Alexander Bluhm <bluhm@openbsd.org>
5f39f8f30Sbluhm#
6f39f8f30Sbluhm# Permission to use, copy, modify, and distribute this software for any
7f39f8f30Sbluhm# purpose with or without fee is hereby granted, provided that the above
8f39f8f30Sbluhm# copyright notice and this permission notice appear in all copies.
9f39f8f30Sbluhm#
10f39f8f30Sbluhm# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11f39f8f30Sbluhm# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12f39f8f30Sbluhm# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13f39f8f30Sbluhm# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14f39f8f30Sbluhm# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15f39f8f30Sbluhm# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16f39f8f30Sbluhm# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17f39f8f30Sbluhm
18f39f8f30Sbluhmuse strict;
19f39f8f30Sbluhmuse warnings;
20f39f8f30Sbluhmuse Socket;
21f39f8f30Sbluhmuse Socket6;
22f39f8f30Sbluhm
23f39f8f30Sbluhmuse Child;
24f39f8f30Sbluhmuse Client;
25f39f8f30Sbluhmuse Server;
26f39f8f30Sbluhmrequire 'funcs.pl';
27f39f8f30Sbluhm
28f39f8f30Sbluhmsub usage {
29*3488794cSbluhm	die "usage: echo.pl copy|splice [args-test.pl]\n";
30f39f8f30Sbluhm}
31f39f8f30Sbluhm
32f39f8f30Sbluhmmy $test;
33f39f8f30Sbluhmour %args;
34f39f8f30Sbluhmif (@ARGV and -f $ARGV[-1]) {
35f39f8f30Sbluhm	$test = pop;
36f39f8f30Sbluhm	do $test
37f39f8f30Sbluhm	    or die "Do test file $test failed: ", $@ || $!;
38f39f8f30Sbluhm}
39f39f8f30Sbluhm@ARGV == 1 or usage();
40f39f8f30Sbluhm
41f39f8f30Sbluhmexit 0 if $args{noecho} || $args{client}{alarm} || $args{server}{alarm};
42f39f8f30Sbluhm
43f39f8f30Sbluhmmy $r = Server->new(
44f39f8f30Sbluhm    forward		=> $ARGV[0],
45f39f8f30Sbluhm    func		=> \&relay,
46f39f8f30Sbluhm    logfile		=> "relay.log",
47f39f8f30Sbluhm    listendomain	=> AF_INET,
48f39f8f30Sbluhm    listenaddr		=> "127.0.0.1",
49f39f8f30Sbluhm    %{$args{relay}},
50f39f8f30Sbluhm);
51f39f8f30Sbluhmmy $s = Child->new(
52f39f8f30Sbluhm    logfile		=> "server.log",
53f39f8f30Sbluhm    oobinline		=> 1,
54f39f8f30Sbluhm    %{$args{server}},
55f39f8f30Sbluhm    func		=> sub {
56f39f8f30Sbluhm	($args{server}{func} || \&read_stream)->(@_);
57f39f8f30Sbluhm	eval { shutout(@_) };
58f39f8f30Sbluhm    },
59f39f8f30Sbluhm);
60f39f8f30Sbluhmmy $c = Client->new(
61f39f8f30Sbluhm    connectdomain	=> AF_INET,
62f39f8f30Sbluhm    connectaddr		=> "127.0.0.1",
63f39f8f30Sbluhm    connectport		=> $r->{listenport},
64f39f8f30Sbluhm    oobinline		=> 1,
65f39f8f30Sbluhm    %{$args{client}},
66f39f8f30Sbluhm    func		=> sub {
67f39f8f30Sbluhm	$s->run->up;
68f39f8f30Sbluhm	eval { ($args{client}{func} || \&write_stream)->(@_) };
69f39f8f30Sbluhm	warn $@ if $@;
70f39f8f30Sbluhm	eval { shutout(@_) };
71f39f8f30Sbluhm	$s->down;
72f39f8f30Sbluhm    },
73f39f8f30Sbluhm);
74f39f8f30Sbluhm
75f39f8f30Sbluhm$r->run;
76f39f8f30Sbluhm$c->run->up;
77f39f8f30Sbluhm$r->up;
78f39f8f30Sbluhm
79f39f8f30Sbluhm$c->down;
80f39f8f30Sbluhm$r->down;
81f39f8f30Sbluhm$s->{pid} = -1;  # XXX hack
82f39f8f30Sbluhm$s->down;
83f39f8f30Sbluhm
84f39f8f30Sbluhmexit if $args{nocheck} || $args{client}{nocheck};
85f39f8f30Sbluhm
86f39f8f30Sbluhmcheck_logs($c, $r, $s, %args);
87