# Copyright 2011-2021 Free Software Foundation, Inc.

# This program 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 3 of the License, or
# (at your option) any later version.
#
# This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.

# This file is a dejagnu "board file" and is used to run the testsuite
# with a remotehost and gdbserver using stdio for communicating through
# ssh. Certain firewalls prevent gdbserver from using the usual mechanism of
# listening on a remote port, so use stdio via ssh instead.
#
# To use this file:
# bash$ cd ${build_dir}/gdb
# bash$ make check RUNTESTFLAGS="--target_board=remote-stdio-gdbserver \
#    REMOTE_USERNAME=... REMOTE_HOSTNAME=... REMOTE_PORTNUM=... \
#    [REMOTE_TMPDIR=${remote_dir}] [GDBSERVER=${remote_gdbserver}]"

load_board_description "stdio-gdbserver-base"

# Test machine info. The generic_config gdbserver reads some of these
# values from board_info, so this file must set them there.
if [info exists REMOTE_USERNAME] {
    set_board_info username $REMOTE_USERNAME
} else {
    set_board_info username unspecified_username
}
if [info exists REMOTE_HOSTNAME] {
    set_board_info hostname $REMOTE_HOSTNAME
} else {
    set_board_info hostname unspecified_hostname
}

# The two programs have different syntax to set the remote port, so
# set it as part of the program name rather than in get_remote_login.

if [info exists REMOTE_PORTNUM] {
    set_board_info portnum $REMOTE_PORTNUM
    set_board_info rsh_prog "/usr/bin/ssh -p$REMOTE_PORTNUM"
    set_board_info rcp_prog "/usr/bin/scp -P$REMOTE_PORTNUM"
} else {
    set_board_info rsh_prog /usr/bin/ssh
    set_board_info rcp_prog /usr/bin/scp
}

# Some remote machines don't have writable home directories.
if [info exists REMOTE_TMPDIR] {
    set_board_info remotedir $REMOTE_TMPDIR
}

proc get_remote_login { } {
    set result ""
    if {[board_info [target_info name] exists username]} {
	append result "[board_info [target_info name] username]@"
    }
    if {[board_info [target_info name] exists hostname]} {
	append result "[board_info [target_info name] hostname]"
    }
    return $result
}

proc get_target_remote_pipe_cmd { } {
    set target_exec [gdbserver_download_current_prog]
    set rsh_cmd "[board_info [target_info name] rsh_prog] [get_remote_login]"
    return "$rsh_cmd /usr/bin/gdbserver --once stdio $target_exec"
}

proc ${board}_file { dest op args } {
    if { $op == "delete" } {
	return [remote_exec target "rm -f $args"]
    }
    return [eval [list standard_file $dest $op] $args]
}
