summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibCore
diff options
context:
space:
mode:
Diffstat (limited to 'Userland/Libraries/LibCore')
-rw-r--r--Userland/Libraries/LibCore/MemoryStream.h2
-rw-r--r--Userland/Libraries/LibCore/Stream.cpp5
-rw-r--r--Userland/Libraries/LibCore/Stream.h8
3 files changed, 15 insertions, 0 deletions
diff --git a/Userland/Libraries/LibCore/MemoryStream.h b/Userland/Libraries/LibCore/MemoryStream.h
index aee618313a..5eeb066acf 100644
--- a/Userland/Libraries/LibCore/MemoryStream.h
+++ b/Userland/Libraries/LibCore/MemoryStream.h
@@ -26,6 +26,8 @@ public:
virtual bool is_open() const override { return true; }
// FIXME: It doesn't make sense to close an memory stream. Therefore, we don't do anything here. Is that fine?
virtual void close() override { }
+ // FIXME: It doesn't make sense to truncate a memory stream. Therefore, we don't do anything here. Is that fine?
+ virtual ErrorOr<void> truncate(off_t) override { return Error::from_errno(ENOTSUP); }
virtual ErrorOr<size_t> read(Bytes bytes) override
{
diff --git a/Userland/Libraries/LibCore/Stream.cpp b/Userland/Libraries/LibCore/Stream.cpp
index 0498ab3f46..0fce083488 100644
--- a/Userland/Libraries/LibCore/Stream.cpp
+++ b/Userland/Libraries/LibCore/Stream.cpp
@@ -215,6 +215,11 @@ ErrorOr<off_t> File::seek(i64 offset, SeekMode mode)
return seek_result;
}
+ErrorOr<void> File::truncate(off_t length)
+{
+ return System::ftruncate(m_fd, length);
+}
+
ErrorOr<int> Socket::create_fd(SocketDomain domain, SocketType type)
{
int socket_domain;
diff --git a/Userland/Libraries/LibCore/Stream.h b/Userland/Libraries/LibCore/Stream.h
index 3757115425..8aba029f45 100644
--- a/Userland/Libraries/LibCore/Stream.h
+++ b/Userland/Libraries/LibCore/Stream.h
@@ -81,6 +81,9 @@ public:
/// Returns the total size of the stream, or an errno in the case of an
/// error. May not preserve the original position on the stream on failure.
virtual ErrorOr<off_t> size();
+ /// Shrinks or extends the stream to the given size. Returns an errno in
+ /// the case of an error.
+ virtual ErrorOr<void> truncate(off_t length) = 0;
};
/// The Socket class is the base class for all concrete BSD-style socket
@@ -197,6 +200,7 @@ public:
virtual bool is_open() const override;
virtual void close() override;
virtual ErrorOr<off_t> seek(i64 offset, SeekMode) override;
+ virtual ErrorOr<void> truncate(off_t length) override;
virtual ~File() override { close(); }
@@ -757,6 +761,10 @@ public:
m_helper.clear_buffer();
return result;
}
+ virtual ErrorOr<void> truncate(off_t length) override
+ {
+ return m_helper.stream().truncate(length);
+ }
ErrorOr<size_t> read_line(Bytes buffer) { return m_helper.read_line(move(buffer)); }
ErrorOr<size_t> read_until(Bytes buffer, StringView candidate) { return m_helper.read_until(move(buffer), move(candidate)); }