From 2cdb2cac44a07fa5db72408f62427a64f32c1d90 Mon Sep 17 00:00:00 2001 From: Dominick Allen Date: Wed, 2 Oct 2024 08:30:08 -0500 Subject: Add permissions model for files. --- include/fud_c_file.hpp | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) (limited to 'include/fud_c_file.hpp') diff --git a/include/fud_c_file.hpp b/include/fud_c_file.hpp index 45a8b54..f451292 100644 --- a/include/fud_c_file.hpp +++ b/include/fud_c_file.hpp @@ -21,9 +21,13 @@ #include "fud_result.hpp" #include "fud_status.hpp" #include "fud_string.hpp" +#include "fud_permissions.hpp" #include #include +#include +#include +#include namespace fud { @@ -109,6 +113,27 @@ class CFile { return self.m_file != nullptr ? FudStatus::Success : FudStatus::Failure; } + FudStatus create(Permissions permissions) + { + auto& self = static_cast(*this); + if (self.m_modeFlags == CFileMode::ReadOnly || self.m_modeFlags == CFileMode::ReadWrite) { + return FudStatus::OperationInvalid; + } + + if (!self.m_filename.valid()) { + return FudStatus::ObjectInvalid; + } + + auto fdResult = ::open(self.m_filename.c_str(), O_CREAT, permissions.mode()); + if (fdResult == -1) { + return FudStatus::Failure; + } + ::close(fdResult); + + self.m_file = fopen(self.m_filename.c_str(), self.m_mode.c_str()); + return self.m_file != nullptr ? FudStatus::Success : FudStatus::Failure; + } + void close() { auto& self = static_cast(*this); @@ -130,6 +155,22 @@ class CFile { return self.m_file; } + FudStatus setPermissions(Permissions permissions) { + auto& self = static_cast(*this); + if (!self.isOpen()) { + return FudStatus::OperationInvalid; + } + auto descriptor = fileno(self.file()); + if (descriptor == -1) { + return FudStatus::ObjectInvalid; + } + auto result = fchmod(descriptor, permissions()); + if (result != 0) { + return FudStatus::Failure; + } + return FudStatus::Success; + } + [[nodiscard]] Result size() const { const auto& self = static_cast(*this); @@ -311,7 +352,8 @@ class CFile { auto& self = static_cast(*this); return self.write(static_cast(&source), sourceSize, length, offset); } -private: + + private: FudStatus reset() const { const auto& self = static_cast(*this); -- cgit v1.2.3