diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-07-09 11:48:59 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-07-09 11:48:59 +0000 |
| commit | f285f66ac8a95f175aaedf16783bb62f9821a8fc (patch) | |
| tree | 89e4a07ba7107bcc453c4e0bdbd1de1b50b6b102 /src/FtpNegotiationCommand.cc | |
| parent | be423e2c77bba5a88013e285925034a08d31bfc7 (diff) | |
2010-07-09 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Send each CWD component of FTP URI in separate CWD command as
described in RFC1738.
* src/FtpConnection.cc
* src/FtpConnection.h
* src/FtpInitiateConnectionCommand.cc
* src/FtpNegotiationCommand.cc
* src/FtpNegotiationCommand.h
* test/FtpConnectionTest.cc
Diffstat (limited to 'src/FtpNegotiationCommand.cc')
| -rw-r--r-- | src/FtpNegotiationCommand.cc | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/src/FtpNegotiationCommand.cc b/src/FtpNegotiationCommand.cc index 1617ef36..558d4944 100644 --- a/src/FtpNegotiationCommand.cc +++ b/src/FtpNegotiationCommand.cc @@ -259,14 +259,24 @@ bool FtpNegotiationCommand::recvPwd() getLogger()->info("CUID#%s - base working directory is '%s'", util::itos(getCuid()).c_str(), pwd.c_str()); } - sequence_ = SEQ_SEND_CWD; + sequence_ = SEQ_SEND_CWD_PREP; return true; } -bool FtpNegotiationCommand::sendCwd() { +bool FtpNegotiationCommand::sendCwdPrep() +{ // Calling setReadCheckSocket() is needed when the socket is reused, setReadCheckSocket(getSocket()); - if(ftp_->sendCwd()) { + util::split(getRequest()->getDir(), std::back_inserter(cwdDirs_), + A2STR::SLASH_C); + cwdDirs_.push_front(ftp_->getBaseWorkingDir()); + sequence_ = SEQ_SEND_CWD; + return true; +} + +bool FtpNegotiationCommand::sendCwd() +{ + if(ftp_->sendCwd(cwdDirs_.front())) { disableWriteCheckSocket(); sequence_ = SEQ_RECV_CWD; } else { @@ -275,7 +285,8 @@ bool FtpNegotiationCommand::sendCwd() { return false; } -bool FtpNegotiationCommand::recvCwd() { +bool FtpNegotiationCommand::recvCwd() +{ unsigned int status = ftp_->receiveResponse(); if(status == 0) { return false; @@ -289,10 +300,15 @@ bool FtpNegotiationCommand::recvCwd() { else throw DL_ABORT_EX(StringFormat(EX_BAD_STATUS, status).str()); } - if(getOption()->getAsBool(PREF_REMOTE_TIME)) { - sequence_ = SEQ_SEND_MDTM; + cwdDirs_.pop_front(); + if(cwdDirs_.empty()) { + if(getOption()->getAsBool(PREF_REMOTE_TIME)) { + sequence_ = SEQ_SEND_MDTM; + } else { + sequence_ = SEQ_SEND_SIZE; + } } else { - sequence_ = SEQ_SEND_SIZE; + sequence_ = SEQ_SEND_CWD; } return true; } @@ -773,6 +789,8 @@ bool FtpNegotiationCommand::processSequence return sendPwd(); case SEQ_RECV_PWD: return recvPwd(); + case SEQ_SEND_CWD_PREP: + return sendCwdPrep(); case SEQ_SEND_CWD: return sendCwd(); case SEQ_RECV_CWD: |
