summaryrefslogtreecommitdiff
path: root/src/FtpNegotiationCommand.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-07-09 11:48:59 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-07-09 11:48:59 +0000
commitf285f66ac8a95f175aaedf16783bb62f9821a8fc (patch)
tree89e4a07ba7107bcc453c4e0bdbd1de1b50b6b102 /src/FtpNegotiationCommand.cc
parentbe423e2c77bba5a88013e285925034a08d31bfc7 (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.cc32
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: