diff options
author | Yuqian Yang <crupest@crupest.life> | 2025-09-02 22:29:11 +0800 |
---|---|---|
committer | Yuqian Yang <crupest@crupest.life> | 2025-09-03 01:52:38 +0800 |
commit | 545a638929218a83d194402b3d52f5bffd87d9eb (patch) | |
tree | f659f671fec17f3ef7dced31f3a1f59673d18690 /include/cru/base/platform/unix/UnixFile.h | |
parent | 5035f18f44f675af2faa4019b6de14b3f3aab270 (diff) | |
download | cru-545a638929218a83d194402b3d52f5bffd87d9eb.tar.gz cru-545a638929218a83d194402b3d52f5bffd87d9eb.tar.bz2 cru-545a638929218a83d194402b3d52f5bffd87d9eb.zip |
UnixFileDescriptor.
Diffstat (limited to 'include/cru/base/platform/unix/UnixFile.h')
-rw-r--r-- | include/cru/base/platform/unix/UnixFile.h | 61 |
1 files changed, 61 insertions, 0 deletions
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 <functional> + +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<int(int)> 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<int(int)> close_; +}; + +struct UniDirectionalUnixPipeResult { + UnixFileDescriptor read; + UnixFileDescriptor write; +}; + +namespace details { +struct UnixPipeFlagTag; +} +using UnixPipeFlag = Bitmask<details::UnixPipeFlagTag>; +struct UnixPipeFlags { + constexpr static auto NonBlock = UnixPipeFlag::FromOffset(1); +}; + +UniDirectionalUnixPipeResult OpenUniDirectionalPipe(UnixPipeFlag flags = {}); +} // namespace cru::platform::unix |