diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2008-09-24 17:01:57 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2008-09-24 17:01:57 +0000 |
| commit | 6bc233f414b74bf3acf4abf5d5655c236e78ae41 (patch) | |
| tree | 3458e27259263587e4219c0c0da2f7c270f96d83 /src/FtpNegotiationCommand.cc | |
| parent | d717ffb1d00511958234d1eb4df1d60382297374 (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.cc | 40 |
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); } } |
