From f74b7875579a97c21daa5b0f3abde8f8bee7a2ff Mon Sep 17 00:00:00 2001 From: zimoch Date: Thu, 26 Jun 2003 12:55:49 +0000 Subject: [PATCH] added -echo and changed to non-buffering mode --- shellbox.tcl | 49 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/shellbox.tcl b/shellbox.tcl index dd83cf6..9847205 100755 --- a/shellbox.tcl +++ b/shellbox.tcl @@ -25,10 +25,11 @@ regsub -all {\$} {shellbox.tcl by Dirk Zimoch $Source: /cvs/G/EPICS/App/scripts/shellbox.tcl,v $ -$Revision: 1.5 $ -$Date: 2003/04/10 14:16:41 $} {} version +$Revision: 1.6 $ +$Date: 2003/06/26 12:55:49 $} {} version -proc createServer {port {paranoid 0}} { +proc createServer {port} { + global paranoid if [catch { if $paranoid { socket -server connectionHandler -myaddr localhost $port @@ -54,9 +55,9 @@ proc connectionHandler {channel addr port} { global channels command clientinfo set peer [fconfigure $channel -peername] set clientinfo($channel) [lindex $peer 1]:[lindex $peer 2] - fconfigure $channel -blocking no -buffering line + fconfigure $channel -blocking no -buffering none fileevent $channel readable "inputHandler $channel" - forwardOutput "**** new client $clientinfo($channel) ****" + forwardOutput "**** new client $clientinfo($channel) ****\n" catch {puts $channel "**** '$command' running ****"} lappend channels $channel catch {puts $channel "clients:\n[getClientlist]"} @@ -74,11 +75,13 @@ proc closeChannel {channel} { } proc inputHandler {channel} { + global echo set data [read $channel] if [eof $channel] { closeChannel $channel return } + if $echo {forwardOutput $data $channel} binary scan $data H* hex switch $data { "clients\n" {forwardOutput "clients:\n[getClientlist]"} @@ -116,11 +119,13 @@ proc outputHandler {channel} { forwardOutput $data } -proc forwardOutput {data} { +proc forwardOutput {data {exclude ""}} { global channels catch {puts -nonewline $data} foreach channel $channels { - catch {puts -nonewline $channel $data} + if {$channel != $exclude} { + catch {puts -nonewline $channel $data} + } } } @@ -144,7 +149,7 @@ proc startProgram {} { catch {puts stderr $msg} exit 3 } - fconfigure $pipe -blocking no -buffering line + fconfigure $pipe -blocking no -buffering none gets $pipe if [eof $pipe] { forwardOutput "**** '$command' died immediately. I will quit ****\n" @@ -161,16 +166,25 @@ proc killProgram {} { startProgram } -if [regexp {^-(v(er(sion)?)?)$} [lindex $argv 0]] { - puts $version - exit 0 -} +set paranoid 0 +set echo 0 -if {[lindex $argv 0] == "-paranoid"} { - set paranoid 1 +while {[string match -* $argv]} { + switch -exact -- [lindex $argv 0] { + "-?" - "-help" { + puts "usage: shellbox.tcl \[options\] port command ..." + puts "options: -help : show this text" + puts " -version : show cvs release" + puts " -paranoid : allow connections from localhost only" + puts " -echo : echo input of one client to all others" + exit 0 + } + "-v" - "-version" {puts $version; exit 0} + "-paranoid" {set paranoid 1} + "-echo" {set echo 1} + default {puts stderr "unknown option [lindex $argv 0]"; exit 1} + } set argv [lrange $argv 1 end] -} else { - set paranoid 0 } set port [lindex $argv 0] @@ -180,7 +194,8 @@ if {![regexp {^[0-9]+$} $port] || [llength $command] == 0} { exit 1 } +fconfigure stdout -buffering none startProgram -createServer $port $paranoid +createServer $port vwait forever