aboutsummaryrefslogtreecommitdiff
path: root/include/cru/base/platform/unix/UnixFile.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/cru/base/platform/unix/UnixFile.h')
-rw-r--r--include/cru/base/platform/unix/UnixFile.h61
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