====== scp ====== ==== 1) scp run on client (copy remote to local case) ==== * 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 ''' 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 -l --- ''" 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 ==== 2) client runs ssh to spawn server side of scp ==== ==== 3) server accepts ssh connection from client ==== * for ''-t'' or ''-f'' private flags: ''remin = stdin''; ''remout = stdout''