I've had this patch in my DejaGNU tree for over a year and a half now, but never gotten around to posting it. It updates rsh.exp to use local_exec instead of spawn, which enables timeout support. Handy when running tests which actually time out!
Please apply if OK. Oh, one interesting PITA is that the call to call_remote further down in remote.exp uses a local variable named timeout when calling local_exec, but does not have any way to pass it to call_remote. I used a hack to pass the timeout through a global variable, but that's ugly and not too important, so I didn't include it here. call_remote taking a timeout might be a nice improvement for another day. -- Daniel Jacobowitz CodeSourcery 2006-03-30 Daniel Jacobowitz <[EMAIL PROTECTED]> * rsh.exp (rsh_exec): Handle inp and outp arguments. Use local_exec to run rsh. Return failure if rsh times out. * remote.exp (local_exec): Handle "|& cat" we added when deciding whether to return output. Index: lib/remote.exp =================================================================== RCS file: /cvsroot/dejagnu/dejagnu/lib/remote.exp,v retrieving revision 1.22 diff -u -p -r1.22 remote.exp --- lib/remote.exp 1 Jan 2006 07:00:11 -0000 1.22 +++ lib/remote.exp 30 Mar 2006 23:34:42 -0000 @@ -210,8 +210,8 @@ proc local_exec { commandline inp outp t } else { set status 0 } - verbose "output is $output" - if { $outp == "" } { + verbose "output is $output status $status" + if { $outp == "" || $outp == "|& cat" } { return [list $status $output] } else { return [list $status ""] Index: lib/rsh.exp =================================================================== RCS file: /cvsroot/dejagnu/dejagnu/lib/rsh.exp,v retrieving revision 1.11 diff -u -p -r1.11 rsh.exp --- lib/rsh.exp 24 Sep 2005 06:49:55 -0000 1.11 +++ lib/rsh.exp 30 Mar 2006 23:34:42 -0000 @@ -223,20 +223,10 @@ proc rsh_upload {desthost srcfile destfi # Execute CMD on BOARDNAME. # -proc rsh_exec { boardname cmd args } { - if { [llength $args] > 0 } { - set pargs [lindex $args 0] - if { [llength $args] > 1 } { - set inp [lindex $args 1] - } else { - set inp "" - } - } else { - set pargs "" - set inp "" - } +proc rsh_exec { boardname program pargs inp outp } { + global timeout - verbose "Executing $boardname:$cmd $pargs < $inp" + verbose "Executing $boardname:$program $pargs < $inp" if ![board_info $boardname exists rsh_prog] { if { [which remsh] != 0 } { @@ -271,13 +261,20 @@ proc rsh_exec { boardname cmd args } { set inp "/dev/null" } - set status [catch "exec cat $inp | $RSH $rsh_useropts $hostname sh -c '$cmd $pargs \\; echo XYZ\\\${?}ZYX' |& cat" output] - verbose "$RSH output is $output" + set ret [local_exec "$RSH $rsh_useropts $hostname sh -c '$program $pargs \\; echo XYZ\\\${?}ZYX'" $inp $outp $timeout] + set status [lindex $ret 0] + set output [lindex $ret 1] + + verbose "$RSH status is $status, output is $output" + # `status' doesn't mean much here other than rsh worked ok. - # What we want is whether $cmd ran ok. + # What we want is whether $program ran ok. Return $status; + # if the program timed out, status will be 1 indicating that + # rsh ran and failed. If rsh fails, we will get FAIL rather + # than UNRESOLVED - this will help the problem be noticed. if { $status != 0 } { regsub "XYZ(\[0-9\]*)ZYX\n?" $output "" output - return [list -1 "$RSH to $boardname failed for $cmd, $output"] + return [list $status "$RSH to $boardname failed for $program, $output"] } regexp "XYZ(\[0-9\]*)ZYX" $output junk status verbose "rsh_exec: status:$status text:$output" 4 _______________________________________________ DejaGnu mailing list DejaGnu@gnu.org http://lists.gnu.org/mailman/listinfo/dejagnu