summaryrefslogtreecommitdiff
path: root/include/fud_c_file.hpp
diff options
context:
space:
mode:
authorDominick Allen <djallen@librehumanitas.org>2024-10-02 08:30:08 -0500
committerDominick Allen <djallen@librehumanitas.org>2024-10-02 08:30:08 -0500
commit2cdb2cac44a07fa5db72408f62427a64f32c1d90 (patch)
tree0795220193a293a0297fe16fc257507c41e78760 /include/fud_c_file.hpp
parent3a18a6dcab45467e779e91c7b346aa3b148e8b9c (diff)
Add permissions model for files.
Diffstat (limited to 'include/fud_c_file.hpp')
-rw-r--r--include/fud_c_file.hpp44
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);