# Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software
# Foundation, Inc.
#
# This file is part of DejaGnu.
#
# DejaGnu is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# DejaGnu is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with DejaGnu; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

# This file was written by J.T. Conklin. (jtc@cygnus.com)

#
# load support libraries
#
load_lib remote.exp

# set target variables only if needed

proc ${board}_init { args } {
    global NLMCONV
    if ![info exists NLMCONV] then {
	set NLMCONV [findfile "$rootme/../binutils/nlmconv"]
    }
    global LD
    if ![info exists LD] then {
	set LD [findfile "$rootme/../ld/ld-new" "$rootme/../ld/ld-new" [transform "ld"]]
    }

    set shell_prompt "Password:"
    set shell_id [remote_open target]
    if [target_info exists passwd] {
	set passwd [target_info passwd]
    } else {
	set passwd ""
    }
    if $shell_id<0 then {
	warning "Couldn't connect to target"
	return -1
    }

    if [string match "" $passwd] then {
	stty -echo
	send_user "Password: "
	expect_user -re "(.*)\n"
	send_user "\n"
	set passwd "$expect_out(1,string)"
	stty echo
    }

    send -i $shell_id "$passwd\n"
    expect {
	-i $shell_id ":" {
	    verbose "Got termtype prompt" 0
	}

	-i $shell_id timeout {
	    warning "Connection timed out"
	    return -1
	}
    }

    # FIXME
    set shell_prompt "[string toupper [target_info name]]:"
    send -i $shell_id "1\n"

    expect {
	-i $shell_id -re "$shell_prompt" {}
	-i $shell_id timeout {
	    warning "Connection timed out"
	    return -1
	}
    }
}


#
# ${board}_load -- load the program and execute it
#
# See default.exp for explanation of arguments and results.
#

proc ${board}_load { dest prog args } {
    global LD NLMCONV
    global tmpdir
    global errorCode

    if [board_info $dest exists fileid] {
	set shell_id [board_info $dest fileid]
    } else {
	set shell_id -1
    }

    set output ""

    if $shell_id<0 then {
	verbose -log "$prog not executed because there is no target" 3
	return "untested"
    }

    #
    set exe [file tail $prog]

    # We can't blindly append a suffix to the object name, because the
    # result may not be valid on netware's 8.3 filesystem.
    set nlm "$tmpdir/x.nlm"
    set lnk "$tmpdir/x.lnk"

    # build *.lnk file
    set fd [open $lnk w]
    puts $fd "description \"$exe\""
    puts $fd "screenname \"System Console\""
    puts $fd "module clib.nlm"
    puts $fd "module mathlib.nlm"
    puts $fd "stack 65536"
    puts $fd "debug"
    # FIXME: don't hardcode location of prelude.o
    puts $fd "input /s1/cygnus/dejagnu/i386-netware/lib/prelude.o"
    puts $fd "input $prog"
    puts $fd "output $nlm"
    close $fd

    # run nlmconv
    verbose "Executing: $NLMCONV -l$LD -T$lnk" 1
    catch "exec $NLMCONV -l$LD -T$lnk" output
    if ![string match "" $output] then {
	verbose $output 1
    }
    if ![string match "NONE" $errorCode] {
	verbose -log "Can't link $prog" 3
	return "fail"
    }

    # download
    verbose "Downloading $nlm" 1
    catch "exec cp $nlm /.NetWare/[board_info $dest name].nws/sys.nwv/tmp/x.nlm" output
    if ![string match "" $output] then {
	verbose $output 1
	verbose -log "cp failed for $nlm" 3
	return "unresolved"
    }

    # Wait a second for the file to "settle" on the NetWare server.
    # I've encountered unexplained failures without this delay.
    #    sleep 1


    # The NetWare remote console expects to be connected to a vt100
    # compatible terminal.  It isn't very efficent, and it seems to
    # send screen repaints for no reason.  So we have to clear the
    # screen as we run each test, otherwise a shell prompt or abort
    # message from a previous test could cause incorrect results.
    send -i $shell_id "CLS\r\n"
    set timeout 1
    expect {
	-i $shell_id -re "$shell_prompt" {
	    exp_continue
	}
    }
    set timeout 10


    # Netware does not support exit status.  The best we can do to
    # detect failures is to look for the "ABNORMAL NLM TERMINATION"
    # message printed by abort().
    set ret 0
    send -i $shell_id "LOAD X.NLM\r\n"
    expect {
	-i $shell_id "ABNORMAL NLM TERMINATION" {
	    set ret 1
	    exp_continue
	}
	-i $shell_id "Unable to find load file" {
	    perror "Couldn't execute program"
	    verbose -log "Couldn't execute program" 3
	    return "unresolved"
	}
	-i $shell_id timeout {
	    perror "Couldn't execute program (timed out)"
	    verbose -log "Couldn't execute program (timed out)" 3
	    return "unresolved"
	}
	-i $shell_id -re "[format "%sLOAD" $shell_prompt]" {
	    exp_continue
	}
	-i $shell_id -re "$shell_prompt" {}
    }

    catch [exec rm -f $lnk]
    catch [exec rm -f $nlm]

    if { $ret == 0 } {
	return "pass"
    } else {
	return "fail"
    }
}

#
# ${tool}_exit -- shutdown the connection
#

proc ${board}_exit {} {
    remote_close target
}
