#!/bin/sh  
# \
exec oagtclsh "$0" "$@"
	
# $Log: not supported by cvs2svn $
# Revision 1.1  2006/06/27 15:18:18  soliday
# This is a general purpose client/server program that I wrote years ago to
# run executables or source in Tcl code. For security purposes only one specified
# client can connect to the server for security reasons.
#
#

set auto_path [linsert $auto_path 0  /usr/local/oag/apps/lib/$env(HOST_ARCH)]
set auto_path [linsert $auto_path 0 /usr/local/oag/lib_patch/$env(HOST_ARCH)]
set CVSRevisionAuthor "\$Revision: 1.2 $ \$Author: soliday $"

proc putResult {args} {
    set output ""
    APSStrictParseArguments {output}
    if {[llength $output]} {
	puts stdout $output
    }
    exit
}

proc putError {args} {
    set output ""
    APSStrictParseArguments {output}
    puts stderr $output
    exit 1
}

set parser [interp create -safe]

$parser alias putResult putResult
$parser alias putError putError
$parser eval {
    proc ok_result {args} {
	eval putResult $args
    }
    proc error_result {args} {
	eval putError $args
    }
}

proc client_handle {sid} {
    global parser buffer
    if {[gets $sid request] < 0} {
	catch {close $sid}
	puts stderr "Disconnected from server"
	exit 1
    } else {
	append buffer $request "\n"
	if {[info complete $buffer]} {
	    set request $buffer
	    set buffer ""
	    if {[catch {$parser eval $request} result]} {
		puts stderr $result
		exit 1
	    }
	}
    }
}

set args $argv
set host localhost
set command ""
set query 0
set kill 0
set fileName ""

if {[APSStrictParseArguments {host command fileName query kill}]} {
    puts stderr "usage: tclDPClient {\[-command <string>\] || \[-fileName <fileName>\] || \[-query <1>\] || \[-kill <1>\]}\n\t\[-host <computer address>\]\n[join [split $CVSRevisionAuthor $] ""]"
    exit 1
}

if {(![llength $command]) && (![llength $fileName]) && (!$query) && (!$kill)} {
    puts stderr "usage: tclDPClient {\[-command <string>\] || \[-fileName <fileName>\] || \[-query <1>\] || \[-kill <1>\]}\n\t\[-host <computer address>\]\n[join [split $CVSRevisionAuthor $] ""]"
    exit 1
}

if [catch {socket $host 4581} sid] {
    puts stderr $sid
    exit 1
} else {
    fileevent $sid readable "client_handle $sid"
    fconfigure $sid -buffering line
    if {[llength $command]} {
	puts $sid "[list runExec -command $command]"
    } elseif {[llength $fileName]} {
	puts $sid "[list runSource -fileName $fileName]"
    } elseif {$query} {
        puts $sid "[list queryJob]"
    } elseif {$kill} {
        puts $sid "[list killJob]"
    }
    vwait enter-mainloop
}

