#!/usr/bin/tcl -n
set port [lindex $argv 0]
if {$port==""} { puts "Usage:\n\t$argv0 <port>"; exit 1 }

proc bgerror {error} { puts "$error" }

proc ProccessConnect {s a p} {
  global DefaultSock
  puts "Connection from $a/$p ($s \[Default\])"
  fileevent $s readable "ProcCommand $s"
  set DefaultSock $s
}
proc SendCommand {} {
  global DefaultSock
  gets stdin data
  if {[string index $data 0]=="-"} {
    set cmd [lindex [string range $data 1 end] 0]
    switch $cmd {
      exit { exit }
    }
  }
  if {[string index $data 0]!="="} { set outsock $DefaultSock } else { set outsock [string range [lindex $data 0] 1 end]; set data [lrange $data 1 end] }
  catch { 
    puts $outsock "$data"
    flush $outsock
  }
}

proc ProcCommand {sock} {
  global DefaultSock
  if {$sock!=$DefaultSock} { set hdr "($sock) " } else { set hdr "" }
  gets $sock data
  foreach ln [split $data \n] {
    puts "$hdr$ln"
    flush stdout
  }
  if {[eof $sock]} {
    puts "$hdr\Connection closed."
    catch { close $sock }
  }
}

proc sendbreak {cmd} {
  global DefaultSock
  catch { 
    puts -nonewline $DefaultSock "$cmd"
    flush $DefaultSock
  }
  return 0
}

proc prompt {} {
  global DefaultSock
puts "!"
  return 0
}

puts "REVERSE TELNET Client.  Listening for host on port $port"
fileevent stdin readable SendCommand
socket -server ProccessConnect $port
signal -restart trap INT "sendbreak \003"
signal -restart trap TSTP "sendbreak \032"
vwait forever

