From e0cccaa583becf49d3eb2c2b245d48b870544c7c Mon Sep 17 00:00:00 2001 From: davidot Date: Wed, 12 Oct 2022 11:31:34 +0200 Subject: [PATCH] LibCore: Add option to Stream::File to not close the file on destruction --- Userland/Libraries/LibCore/Stream.cpp | 4 ++-- Userland/Libraries/LibCore/Stream.h | 17 ++++++++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/Userland/Libraries/LibCore/Stream.cpp b/Userland/Libraries/LibCore/Stream.cpp index 4b18310248..b73f9e1640 100644 --- a/Userland/Libraries/LibCore/Stream.cpp +++ b/Userland/Libraries/LibCore/Stream.cpp @@ -127,7 +127,7 @@ ErrorOr> File::open(StringView filename, OpenMode mode, mode return file; } -ErrorOr> File::adopt_fd(int fd, OpenMode mode) +ErrorOr> File::adopt_fd(int fd, OpenMode mode, ShouldCloseFileDescriptor should_close_file_descriptor) { if (fd < 0) { return Error::from_errno(EBADF); @@ -138,7 +138,7 @@ ErrorOr> File::adopt_fd(int fd, OpenMode mode) return Error::from_errno(EINVAL); } - auto file = TRY(adopt_nonnull_own_or_enomem(new (nothrow) File(mode))); + auto file = TRY(adopt_nonnull_own_or_enomem(new (nothrow) File(mode, should_close_file_descriptor))); file->m_fd = fd; return file; } diff --git a/Userland/Libraries/LibCore/Stream.h b/Userland/Libraries/LibCore/Stream.h index 586264de36..ecb68615a0 100644 --- a/Userland/Libraries/LibCore/Stream.h +++ b/Userland/Libraries/LibCore/Stream.h @@ -183,6 +183,11 @@ enum class OpenMode : unsigned { Nonblocking = 64, }; +enum class ShouldCloseFileDescriptor { + Yes, + No, +}; + AK_ENUM_BITWISE_OPERATORS(OpenMode) class File final : public SeekableStream { @@ -190,7 +195,7 @@ class File final : public SeekableStream { public: static ErrorOr> open(StringView filename, OpenMode, mode_t = 0644); - static ErrorOr> adopt_fd(int fd, OpenMode); + static ErrorOr> adopt_fd(int fd, OpenMode, ShouldCloseFileDescriptor = ShouldCloseFileDescriptor::Yes); static bool exists(StringView filename); static ErrorOr> open_file_or_standard_stream(StringView filename, OpenMode mode); @@ -219,13 +224,18 @@ public: virtual ErrorOr seek(i64 offset, SeekMode) override; virtual ErrorOr truncate(off_t length) override; - virtual ~File() override { close(); } + virtual ~File() override + { + if (m_should_close_file_descriptor == ShouldCloseFileDescriptor::Yes) + close(); + } static int open_mode_to_options(OpenMode mode); private: - File(OpenMode mode) + File(OpenMode mode, ShouldCloseFileDescriptor should_close = ShouldCloseFileDescriptor::Yes) : m_mode(mode) + , m_should_close_file_descriptor(should_close) { } @@ -234,6 +244,7 @@ private: OpenMode m_mode { OpenMode::NotOpen }; int m_fd { -1 }; bool m_last_read_was_eof { false }; + ShouldCloseFileDescriptor m_should_close_file_descriptor { ShouldCloseFileDescriptor::Yes }; }; class PosixSocketHelper {