#!/usr/bin/perl -w
# test_client

use strict;
use IO::Socket;

$| = 1;

my ($MSG_EOL, $kidpid, $handle, $line);

if (($ARGV[0]||'') eq '-crlf') {
    shift;
    $MSG_EOL = "\015\012";
} else {
    $MSG_EOL = "\012";
}

sub connect_to {
	my $sockname = shift;
	my $handle;
	$sockname = "localhost:$sockname" if $sockname =~ /^\d{1,5}$/;
	if ($sockname =~ /:/) {
		my ($host, $port) = split /:/, $sockname;
		# create a tcp connection to the specified host and port
		$handle = IO::Socket::INET->new( Proto     => "tcp",
						 PeerAddr  => $host,
						 PeerPort  => $port )
			or die "can't connect to port $port on $host: $!";
		print STDERR "[Connected to $host:$port]\n";
	} else {
		# create a UNIX sockets connection to the specified named socket
		$handle = IO::Socket::UNIX->new(Peer => $sockname)
			or die "can't connect to socket $sockname: $!";
		print STDERR "[Connected to $sockname]\n";
	}
	return $handle;
}

if (@ARGV == 1) {
    $handle = connect_to($ARGV[0]);
} else {
    print "usage: $0 [-crlf] (UNIX-socket-name|(IP-address|DNS-name):TCP-port)\n";
    exit 1;
}

$handle->autoflush(1);              # so output gets there right away

# split the program into two processes, identical twins
die "can't fork: $!" unless defined($kidpid = fork());

# the if{} block runs only in the parent process
if ($kidpid) {
    # copy the socket to standard output
    while (defined ($line = <$handle>)) {
	print $line;
    }
#	    print "KILLING CHILD!\n";
#	    kill("TERM", $kidpid);                  # send SIGTERM to child
}
# the else{} block runs only in the child process
else {
    # copy standard input to the socket
    while (defined ($line = <STDIN>)) {
	chomp $line;
	print $handle "$line$MSG_EOL";
    }
#	    print "CHILD FINISHED!\n";
    shutdown $handle, 1; # SHUT_WR  # was SHUT_RDWR, but this is no good for web-requests
}

