construct scp
command to be executed on the server via ssh. append -v -r -p -d
flags as appropriate. Resulting command stored in cmd
variable
call toremote()
if destination is remote; tolocal()
if destination is local (handles 'remote to local' and 'local to local' cases)
for 'remote to local' case, append '-f <src>
' to scp
command to be run on the server
call do_cmd()
to run assembled scp
command on the server
do_cmd()
forks a child which executes (via execvp()
) “ssh -p <port> -l <remuser> — <host> <cmd>
” scp command on the server. Connect parent and child via pipes. Parent accesses child's pipes via remin
& remout
. do_cmd_pid
contains child's PID.
tolocal()→sink()
receives file from child via remin
& remout
and stores it to the local destination
finaly wait for child to finish, check for errors, close remin
& remout
and exit