#!/usr/bin/perl -w
use strict;
use IO::Socket;

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

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

if (@ARGV == 2) {
    my ($host, $port) = @ARGV;    
    # 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";
} elsif (@ARGV == 1) {
    my $socket = shift;
    # create a tcp connection to the specified host and port
    $handle = IO::Socket::UNIX->new(Peer => $socket)
	or die "can't connect to socket $socket: $!";
    print STDERR "[Connected to $socket]\n";
} else {
    print "usage: $0 [-lf] (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;
    }
    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";
    }
}
