From 72893b4f9e34a4a1cf0a316c7468915862420167 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Wed, 13 Apr 2022 11:53:46 +0100 Subject: [PATCH] LibCore: Add an optional permissions mask to Directory::create() Being able to pass a mask is the one feature `mkdir()` had that this didn't. Adding it here means everyone can use the nicer Directory API. --- Userland/Libraries/LibCore/Directory.cpp | 14 +++++++------- Userland/Libraries/LibCore/Directory.h | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Userland/Libraries/LibCore/Directory.cpp b/Userland/Libraries/LibCore/Directory.cpp index a51531819d..e2e53d4944 100644 --- a/Userland/Libraries/LibCore/Directory.cpp +++ b/Userland/Libraries/LibCore/Directory.cpp @@ -45,28 +45,28 @@ ErrorOr Directory::adopt_fd(int fd, Optional path) return Directory { fd, move(path) }; } -ErrorOr Directory::create(String path, CreateDirectories create_directories) +ErrorOr Directory::create(String path, CreateDirectories create_directories, mode_t creation_mode) { - return create(LexicalPath { move(path) }, create_directories); + return create(LexicalPath { move(path) }, create_directories, creation_mode); } -ErrorOr Directory::create(LexicalPath path, CreateDirectories create_directories) +ErrorOr Directory::create(LexicalPath path, CreateDirectories create_directories, mode_t creation_mode) { if (create_directories == CreateDirectories::Yes) - TRY(ensure_directory(path)); + TRY(ensure_directory(path, creation_mode)); // FIXME: doesn't work on Linux probably auto fd = TRY(System::open(path.string(), O_CLOEXEC)); return adopt_fd(fd, move(path)); } -ErrorOr Directory::ensure_directory(LexicalPath const& path) +ErrorOr Directory::ensure_directory(LexicalPath const& path, mode_t creation_mode) { if (path.basename() == "/" || path.basename() == ".") return {}; - TRY(ensure_directory(path.parent())); + TRY(ensure_directory(path.parent(), creation_mode)); - auto return_value = System::mkdir(path.string(), 0755); + auto return_value = System::mkdir(path.string(), creation_mode); // We don't care if the directory already exists. if (return_value.is_error() && return_value.error().code() != EEXIST) return return_value; diff --git a/Userland/Libraries/LibCore/Directory.h b/Userland/Libraries/LibCore/Directory.h index 950a93bb9c..5eebe5f32c 100644 --- a/Userland/Libraries/LibCore/Directory.h +++ b/Userland/Libraries/LibCore/Directory.h @@ -33,8 +33,8 @@ public: Yes, }; - static ErrorOr create(LexicalPath path, CreateDirectories); - static ErrorOr create(String path, CreateDirectories); + static ErrorOr create(LexicalPath path, CreateDirectories, mode_t creation_mode = 0755); + static ErrorOr create(String path, CreateDirectories, mode_t creation_mode = 0755); static ErrorOr adopt_fd(int fd, Optional path = {}); ErrorOr> open(StringView filename, Stream::OpenMode mode) const; @@ -47,7 +47,7 @@ public: private: Directory(int directory_fd, Optional path); - static ErrorOr ensure_directory(LexicalPath const& path); + static ErrorOr ensure_directory(LexicalPath const& path, mode_t creation_mode = 0755); Optional m_path; int m_directory_fd;