diff options
author | Dominick Allen <djallen@librehumanitas.org> | 2024-10-02 08:30:08 -0500 |
---|---|---|
committer | Dominick Allen <djallen@librehumanitas.org> | 2024-10-02 08:30:08 -0500 |
commit | 2cdb2cac44a07fa5db72408f62427a64f32c1d90 (patch) | |
tree | 0795220193a293a0297fe16fc257507c41e78760 /include/fud_c_file.hpp | |
parent | 3a18a6dcab45467e779e91c7b346aa3b148e8b9c (diff) |
Add permissions model for files.
Diffstat (limited to 'include/fud_c_file.hpp')
-rw-r--r-- | include/fud_c_file.hpp | 44 |
1 files changed, 43 insertions, 1 deletions
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 <cstdint> #include <cstdio> +#include <fcntl.h> +#include <sys/stat.h> +#include <unistd.h> 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<Derived&>(*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<Derived&>(*this); @@ -130,6 +155,22 @@ class CFile { return self.m_file; } + FudStatus setPermissions(Permissions permissions) { + auto& self = static_cast<Derived&>(*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_t, FudStatus> size() const { const auto& self = static_cast<const Derived&>(*this); @@ -311,7 +352,8 @@ class CFile { auto& self = static_cast<Derived&>(*this); return self.write(static_cast<const void*>(&source), sourceSize, length, offset); } -private: + + private: FudStatus reset() const { const auto& self = static_cast<const Derived&>(*this); |