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