diff options
Diffstat (limited to 'src/fs/io')
-rw-r--r-- | src/fs/io/FileReader.cxx | 26 | ||||
-rw-r--r-- | src/fs/io/FileReader.hxx | 2 |
2 files changed, 28 insertions, 0 deletions
diff --git a/src/fs/io/FileReader.cxx b/src/fs/io/FileReader.cxx index a19f472e8..e4198b71a 100644 --- a/src/fs/io/FileReader.cxx +++ b/src/fs/io/FileReader.cxx @@ -52,6 +52,19 @@ FileReader::Read(void *data, size_t size, Error &error) return nbytes; } +bool +FileReader::Seek(off_t offset, Error &error) +{ + assert(IsDefined()); + + auto result = SetFilePointer(handle, offset, nullptr, FILE_BEGIN); + const bool success = result != INVALID_SET_FILE_POINTER; + if (!success) + error.SetLastError("Failed to seek"); + + return success; +} + void FileReader::Close() { @@ -90,6 +103,19 @@ FileReader::Read(void *data, size_t size, Error &error) return nbytes; } +bool +FileReader::Seek(off_t offset, Error &error) +{ + assert(IsDefined()); + + auto result = lseek(fd, offset, SEEK_SET); + const bool success = result >= 0; + if (!success) + error.SetErrno("Failed to seek"); + + return success; +} + void FileReader::Close() { diff --git a/src/fs/io/FileReader.hxx b/src/fs/io/FileReader.hxx index 96054d936..9a1c17c6b 100644 --- a/src/fs/io/FileReader.hxx +++ b/src/fs/io/FileReader.hxx @@ -61,6 +61,8 @@ public: void Close(); + bool Seek(off_t offset, Error &error); + /* virtual methods from class Reader */ size_t Read(void *data, size_t size, Error &error) override; }; |