summaryrefslogtreecommitdiff
path: root/src/FtpNegotiationCommand.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-09-24 17:01:57 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-09-24 17:01:57 +0000
commit6bc233f414b74bf3acf4abf5d5655c236e78ae41 (patch)
tree3458e27259263587e4219c0c0da2f7c270f96d83 /src/FtpNegotiationCommand.cc
parentd717ffb1d00511958234d1eb4df1d60382297374 (diff)
2008-09-25 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Issue PWD command first and get working directory and use it as a prefix for CWD command. * src/DownloadEngine.cc * src/DownloadEngine.h * src/FtpConnection.cc * src/FtpConnection.h * src/FtpFinishDownloadCommand.cc * src/FtpInitiateConnectionCommand.cc * src/FtpNegotiationCommand.cc * src/FtpNegotiationCommand.h * test/FtpConnectionTest.cc
Diffstat (limited to 'src/FtpNegotiationCommand.cc')
-rw-r--r--src/FtpNegotiationCommand.cc40
1 files changed, 38 insertions, 2 deletions
diff --git a/src/FtpNegotiationCommand.cc b/src/FtpNegotiationCommand.cc
index 0450250e..8882173b 100644
--- a/src/FtpNegotiationCommand.cc
+++ b/src/FtpNegotiationCommand.cc
@@ -59,6 +59,7 @@
#include <stdint.h>
#include <cassert>
#include <utility>
+#include <map>
namespace aria2 {
@@ -67,10 +68,12 @@ FtpNegotiationCommand::FtpNegotiationCommand(int32_t cuid,
RequestGroup* requestGroup,
DownloadEngine* e,
const SocketHandle& s,
- Seq seq):
+ Seq seq,
+ const std::string& baseWorkingDir):
AbstractCommand(cuid, req, requestGroup, e, s), sequence(seq),
ftp(new FtpConnection(cuid, socket, req, e->option))
{
+ ftp->setBaseWorkingDir(baseWorkingDir);
if(seq == SEQ_RECV_GREETING) {
setTimeout(e->option->getAsInt(PREF_CONNECT_TIMEOUT));
}
@@ -200,6 +203,33 @@ bool FtpNegotiationCommand::recvType() {
if(status != 200) {
throw DlAbortEx(StringFormat(EX_BAD_STATUS, status).str());
}
+ sequence = SEQ_SEND_PWD;
+ return true;
+}
+
+bool FtpNegotiationCommand::sendPwd()
+{
+ if(ftp->sendPwd()) {
+ disableWriteCheckSocket();
+ sequence = SEQ_RECV_PWD;
+ } else {
+ setWriteCheckSocket(socket);
+ }
+ return false;
+}
+
+bool FtpNegotiationCommand::recvPwd()
+{
+ std::string pwd;
+ unsigned int status = ftp->receivePwdResponse(pwd);
+ if(status == 0) {
+ return false;
+ }
+ if(status != 257) {
+ throw DlAbortEx(StringFormat(EX_BAD_STATUS, status).str());
+ }
+ ftp->setBaseWorkingDir(pwd);
+ logger->info("CUID#%d - base working directory is '%s'", cuid, pwd.c_str());
sequence = SEQ_SEND_CWD;
return true;
}
@@ -536,6 +566,10 @@ bool FtpNegotiationCommand::processSequence(const SegmentHandle& segment) {
return sendType();
case SEQ_RECV_TYPE:
return recvType();
+ case SEQ_SEND_PWD:
+ return sendPwd();
+ case SEQ_RECV_PWD:
+ return recvPwd();
case SEQ_SEND_CWD:
return sendCwd();
case SEQ_RECV_CWD:
@@ -582,7 +616,9 @@ void FtpNegotiationCommand::poolConnection() const
e->option->getAsBool(PREF_FTP_REUSE_CONNECTION)) {
std::pair<std::string, uint16_t> peerInfo;
socket->getPeerInfo(peerInfo);
- e->poolSocket(peerInfo.first, peerInfo.second, socket);
+ std::map<std::string, std::string> options;
+ options["baseWorkingDir"] = ftp->getBaseWorkingDir();
+ e->poolSocket(peerInfo.first, peerInfo.second, socket, options);
}
}