aboutsummaryrefslogtreecommitdiffstats
path: root/src/fs/io
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2015-03-03 14:29:36 +0100
committerMax Kellermann <max@duempel.org>2015-03-03 14:29:36 +0100
commitdd5daa0767c806b4027482f589ff1e9676b413e4 (patch)
tree70e873297cd2963e20887d81ec96f5730faf267a /src/fs/io
parentef5090c3976ca14784c7b98f3d110e1213c158ba (diff)
downloadmpd-dd5daa0767c806b4027482f589ff1e9676b413e4.tar.gz
mpd-dd5daa0767c806b4027482f589ff1e9676b413e4.tar.xz
mpd-dd5daa0767c806b4027482f589ff1e9676b413e4.zip
fs/io/FileReader: add method Seek()
Diffstat (limited to 'src/fs/io')
-rw-r--r--src/fs/io/FileReader.cxx26
-rw-r--r--src/fs/io/FileReader.hxx2
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;
};