# Copyright (C) 1992-2019, 2020 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 3 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, see . # Open an FTP connection to HOST. # proc ftp_open {host} { set prompt "ftp>" global board_info if {[board_info $host exists name]} { set host [board_info $host name] } if {[board_info $host exists ftp_fileid]} { return [board_info $host ftp_fileid] } if {[board_info $host exists hostname]} { set remotehost [board_info $host hostname] } else { set remotehost $host } # LoseQVT tends to get stuck sometimes; we'll loop around a few million # times when it gets a "connection refused". set spawn_id -1 set count 3 while {$spawn_id < 0 && $count >= 0} { spawn ftp -n $remotehost expect { -i $spawn_id -re ".*220.*$prompt" { } -i $spawn_id -re ".*Connection refused.*$prompt" { sleep 2 send "open $remotehost\n" exp_continue } -i $spawn_id default { close -i $spawn_id wait -i $spawn_id set spawn_id -1 } } incr count -1 } if {$spawn_id < 0} { return -1 } set board_info($host,ftp_fileid) $spawn_id if {[board_info $host exists ftp_username]} { if {[board_info $host exists ftp_password]} { set command "user [board_info $host ftp_username] [board_info $host ftp_password]\n" } else { set command "user [board_info $host ftp_username]\n" } send $command expect { -i $spawn_id -re ".*230.*$prompt" { } -i $spawn_id default { close -i $spawn_id wait -i $spawn_id return -1 } } } set timeout 15 send -i $spawn_id "binary\n" expect { -i $spawn_id -re "200.*$prompt" { } -i $spawn_id timeout { close -i $spawn_id wait -i $spawn_id return -1 } } if {[board_info $host exists ftp_directory]} { send "cd [board_info $host ftp_directory]\n" expect { -i $spawn_id -re "250.*$prompt" { } -i $spawn_id default { close -i $spawn_id wait -i $spawn_id return -1 } } } if {[board_info $host exists ftp_no_passive]} { send "passive\n" expect { -i $spawn_id -re "Passive mode off.*$prompt" { } -i $spawn_id -re "Passive mode on.*$prompt" { send "passive\n" exp_continue } -i $spawn_id -re ".*$prompt" { } } } set board_info($host,ftp_fileid) $spawn_id return $spawn_id } # Fetch REMOTEFILE from HOST and store it as LOCALFILE. # proc ftp_upload {host remotefile localfile} { set prompt "ftp>" verbose "ftping $remotefile from $host to $localfile" set timeout 15 set spawn_id [ftp_open $host] if {$spawn_id < 0} { return "" } set loop 1 while {$loop} { send -i $spawn_id "get $remotefile $localfile\n" expect { -i $spawn_id -re ".*Too many open files.*$prompt" { ftp_close $host } -i $spawn_id -re ".*No such file or directory.*$prompt" { set loop 0 set remotefile "" } -i $spawn_id -re "(^|\[\r\n\])226.*$prompt" {set loop 0} -i $spawn_id -re "(^|\[\r\n\])\[0-9\]\[0-9\]\[0-9\].*$prompt" { set loop 0 set remotefile "" } -i $spawn_id default { ftp_close $host } } if {$loop} { set spawn_id [ftp_open $host] if {$spawn_id < 0} { return "" } } } return $localfile } # Download LOCALFILE to HOST as REMOTEFILE. # proc ftp_download {host localfile remotefile} { set prompt "ftp>" verbose "putting $localfile $remotefile" if {[board_info $host exists hostname]} { set remotehost [board_info $host hostname] } else { set remotehost $host } set spawn_id [ftp_open $host] if {$spawn_id < 0} { return "" } set loop 1 while {$loop} { send -i $spawn_id "put $localfile $remotefile\n" expect { -i $spawn_id -re ".*Too many open files.*$prompt" { ftp_close $host } -i $spawn_id -re ".*No such file or directory.*$prompt" { set loop 0 set remotefile "" } -re {(^|[\r\n])150.*connection for (.*) [(][0-9.,]+\)[\r\n]} { set remotefile $expect_out(2,string) exp_continue } -i $spawn_id -re "(^|\[\r\n\])226.*$prompt" { set loop 0 } -i $spawn_id -re "Timeout.*$prompt" { ftp_close $host } -i $spawn_id -re "(^|\[\r\n\])\[0-9\]\[0-9\]\[0-9\].*$prompt" { set loop 0 set remotefile "" } -i $spawn_id default { ftp_close $host } } if {$loop} { set spawn_id [ftp_open $host] if {$spawn_id < 0} { return "" } } } return $remotefile } # Close the FTP connection to HOST. # proc ftp_close {host} { global board_info if {[board_info $host exists name]} { set host [board_info $host name] } if {![board_info $host exists ftp_fileid]} { return "" } set spawn_id [board_info $host ftp_fileid] unset board_info($host,ftp_fileid) send -i $spawn_id "quit\n" close -i $spawn_id wait -i $spawn_id return "" }