From 545a638929218a83d194402b3d52f5bffd87d9eb Mon Sep 17 00:00:00 2001 From: Yuqian Yang Date: Tue, 2 Sep 2025 22:29:11 +0800 Subject: UnixFileDescriptor. --- include/cru/base/platform/unix/UnixFile.h | 61 +++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 include/cru/base/platform/unix/UnixFile.h (limited to 'include/cru/base/platform/unix/UnixFile.h') diff --git a/include/cru/base/platform/unix/UnixFile.h b/include/cru/base/platform/unix/UnixFile.h new file mode 100644 index 00000000..63545428 --- /dev/null +++ b/include/cru/base/platform/unix/UnixFile.h @@ -0,0 +1,61 @@ +#pragma once + +#if !defined(__unix) +#error "This file can only be included on unix." +#endif + +#include "../../Bitmask.h" + +#include + +namespace cru::platform::unix { +class UnixFileDescriptor { + public: + UnixFileDescriptor(); + /** + * \param close Default to POSIX close function. + */ + explicit UnixFileDescriptor(int descriptor, bool auto_close = true, + std::function close = {}); + ~UnixFileDescriptor(); + + UnixFileDescriptor(const UnixFileDescriptor& other) = delete; + UnixFileDescriptor& operator=(const UnixFileDescriptor& other) = delete; + + UnixFileDescriptor(UnixFileDescriptor&& other) noexcept; + UnixFileDescriptor& operator=(UnixFileDescriptor&& other) noexcept; + + bool IsValid() const; + int GetValue() const; + void Close(); + + bool IsAutoClose() const { return auto_close_; } + void SetAutoClose(bool auto_close) { this->auto_close_ = auto_close; } + + explicit operator bool() const { return this->IsValid(); } + operator int() const { return this->GetValue(); } + + private: + bool DoClose(); + + private: + int descriptor_; + bool auto_close_; + std::function close_; +}; + +struct UniDirectionalUnixPipeResult { + UnixFileDescriptor read; + UnixFileDescriptor write; +}; + +namespace details { +struct UnixPipeFlagTag; +} +using UnixPipeFlag = Bitmask; +struct UnixPipeFlags { + constexpr static auto NonBlock = UnixPipeFlag::FromOffset(1); +}; + +UniDirectionalUnixPipeResult OpenUniDirectionalPipe(UnixPipeFlag flags = {}); +} // namespace cru::platform::unix -- cgit v1.2.3