summaryrefslogtreecommitdiff
path: root/src/ByteArrayDiskWriter.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2012-07-23 21:36:24 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2012-07-23 21:42:47 +0900
commit860f4dd06ace859470e118d4b9a8d10ddf92d076 (patch)
tree1effdc3fd73160b57f5d6d109662a66e33050d08 /src/ByteArrayDiskWriter.cc
parentf56743b0833551aa6845d0a4f1d05da02cb52175 (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.cc26
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();