#!/usr/bin/perl ###################################################################### # # # (c) Anthony G. Basile, June 3, 2002 # # # # Server proxy. # # # ###################################################################### # # Get the arguments. # $lhost = $ARGV[0] ; $lport = $ARGV[1] ; $rport = $ARGV[2] ; # # Subroutines # sub logit { my $msg = $_[0] ; my $date = `date` ; chomp($date) ; print LOG $date . ' : ' . $msg . "\n" ; } # # Packages # use Socket ; use POSIX ; # # Signal trapping --- clean up zombies # $SIG{CHLD} = 'IGNORE' ; # # Prepare a socket listening for incoming connections. # $proto = getprotobyname('tcp') ; $raddr = sockaddr_in( $rport, INADDR_ANY ) ; socket ( SOCK, PF_INET, SOCK_STREAM, $proto ) ; setsockopt( SOCK, SOL_SOCKET, SO_REUSEADDR, 1 ) ; bind ( SOCK, $raddr ) ; listen ( SOCK, SOMAXCONN ) ; LOOP: accept ( RSOCK, SOCK ) ; goto LOOP if $pid=fork() ; # # We got a connection so we don't need to listen anymore. # Begin appending to the log. # Report who just connected as a remote host. # close( SOCK ) ; $log = "$lhost." . "$lport." . "$rport." . 'log' ; open( LOG, '>>' . $log ) ; $peer = getpeername( RSOCK ) ; ($pport,$paddr) = unpack_sockaddr_in($peer) ; $pip = inet_ntoa( $paddr ) ; logit("Connected: $pip:$pport") ; # # Prepare a socket and connect to service on $lhost:$lport # $lserver = gethostbyname($lhost) ; $laddr = sockaddr_in( $lport, $lserver ) ; socket ( LSOCK, PF_INET, SOCK_STREAM, $proto ) ; connect( LSOCK, $laddr ) ; # # Check when LSOCK and RSOCK are ready to read/write. # $rin = "" ; vec($rin, fileno(LSOCK), 1) = 1 ; vec($rin, fileno(RSOCK), 1) = 1 ; while (1) { select $ready = $rin, undef, undef, undef ; if (vec($ready, fileno(LSOCK), 1) == 1) { $bytes = sysread (LSOCK, $msg, 256 ) ; goto EXIT unless $bytes ; syswrite (RSOCK, $msg, length($msg) ) ; } if (vec($ready, fileno(RSOCK), 1) == 1) { $bytes = sysread (RSOCK, $msg, 256 ) ; goto EXIT unless $bytes ; syswrite (LSOCK, $msg, length($msg) ) ; } } EXIT: logit('***') ; close(LOG) ; close(RSOCK) ; close(LSOCK) ;