diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2012-07-23 21:36:24 +0900 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2012-07-23 21:42:47 +0900 |
| commit | 860f4dd06ace859470e118d4b9a8d10ddf92d076 (patch) | |
| tree | 1effdc3fd73160b57f5d6d109662a66e33050d08 /src/ByteArrayDiskWriter.cc | |
| parent | f56743b0833551aa6845d0a4f1d05da02cb52175 (diff) | |
Use int64_t instead of off_t
Using off_t, at least, in DiskAdaptor layer is problematic because
torrent can contain under 2GiB files but total sum of those files may
exceed 2GiB limit, which makes off_t overflow in 32 bit system without
large file support. So we use int64_t in API. We'll check the file
length before download so that it does not exceed max off_t.
Diffstat (limited to 'src/ByteArrayDiskWriter.cc')
| -rw-r--r-- | src/ByteArrayDiskWriter.cc | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/src/ByteArrayDiskWriter.cc b/src/ByteArrayDiskWriter.cc index e83a573a..8f638dff 100644 --- a/src/ByteArrayDiskWriter.cc +++ b/src/ByteArrayDiskWriter.cc @@ -50,47 +50,49 @@ void ByteArrayDiskWriter::clear() buf_.str(A2STR::NIL); } -void ByteArrayDiskWriter::initAndOpenFile(off_t totalLength) +void ByteArrayDiskWriter::initAndOpenFile(int64_t totalLength) { clear(); } -void ByteArrayDiskWriter::openFile(off_t totalLength) {} +void ByteArrayDiskWriter::openFile(int64_t totalLength) {} void ByteArrayDiskWriter::closeFile() {} -void ByteArrayDiskWriter::openExistingFile(off_t totalLength) +void ByteArrayDiskWriter::openExistingFile(int64_t totalLength) { openFile(); } -void ByteArrayDiskWriter::writeData(const unsigned char* data, size_t dataLength, off_t position) +void ByteArrayDiskWriter::writeData(const unsigned char* data, + size_t dataLength, int64_t offset) { - if(position+dataLength > maxLength_) { + if(offset+dataLength > maxLength_) { throw DL_ABORT_EX(fmt("Maximum length(%lu) exceeded.", static_cast<unsigned long>(maxLength_))); } - off_t length = size(); - if(length < position) { + int64_t length = size(); + if(length < offset) { buf_.seekp(length, std::ios::beg); - for(off_t i = length; i < position; ++i) { + for(int64_t i = length; i < offset; ++i) { buf_.put('\0'); } } else { - buf_.seekp(position, std::ios::beg); + buf_.seekp(offset, std::ios::beg); } buf_.write(reinterpret_cast<const char*>(data), dataLength); } -ssize_t ByteArrayDiskWriter::readData(unsigned char* data, size_t len, off_t position) +ssize_t ByteArrayDiskWriter::readData(unsigned char* data, size_t len, + int64_t offset) { - buf_.seekg(position, std::ios::beg); + buf_.seekg(offset, std::ios::beg); buf_.read(reinterpret_cast<char*>(data), len); buf_.clear(); return buf_.gcount(); } -off_t ByteArrayDiskWriter::size() +int64_t ByteArrayDiskWriter::size() { buf_.seekg(0, std::ios::end); buf_.clear(); |
