1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
#include "scanner.ih"
// Command forms:
// PUT local-file remote-file
// PUT NOTEST local-file remote-file
void Scanner::put(string const &cmd)
{
Util::debug() << "Scanner::put(): " << cmd << endl;
removeFirstWord("PUT"); // strip off `PUT'
d_testExitValue = !removeFirstWord("NOTEST"); // [NOTEST] ...
// at this point we have the remote-file and the local-file in the
// command. d_firstword[1] contains the remote filename,
// d_firstword[3] contains the rest
string source = s_firstWord[1]; // get the (remote) source
if (!source.length())
d_reporter.exit() << "PUT command requires source and destination" <<
endl;
s_firstWord.match(s_firstWord[3]); // strip off source
string destination = s_firstWord[1]; // get the local dest.
if (!destination.length())
d_reporter.exit() << "At `PUT " << source <<
" <destination>': destination missing" << endl;
if (Util::isDirectory(destination)) // is the dest. a dir. ?
destination += "/" + Util::fileName(source);// then append sourcename
Util::debug() << "Scanner::put(): scp <client>:" << source << " " <<
destination << endl;
string command = putCommand(source, destination);
if (Arg::instance().option('n')) // no run if -n
return;
d_sshFork << command << endl;
write(source); // write the file using dd
d_sshFork << "/bin/echo \"" << d_sentinel << " $?\"" << endl;
waitForSentinel(d_sshFork);
Util::debug() << "Scanner::put(): " << cmd << " DONE" << endl;
}
|