From dd5daa0767c806b4027482f589ff1e9676b413e4 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 3 Mar 2015 14:29:36 +0100 Subject: fs/io/FileReader: add method Seek() --- src/fs/io/FileReader.cxx | 26 ++++++++++++++++++++++++++ src/fs/io/FileReader.hxx | 2 ++ 2 files changed, 28 insertions(+) (limited to 'src') 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; }; -- cgit v1.2.3