diff --git a/Userland/DevTools/HackStudio/Dialogs/NewProjectDialog.cpp b/Userland/DevTools/HackStudio/Dialogs/NewProjectDialog.cpp index e33d7ba9fe..2f4a4358b6 100644 --- a/Userland/DevTools/HackStudio/Dialogs/NewProjectDialog.cpp +++ b/Userland/DevTools/HackStudio/Dialogs/NewProjectDialog.cpp @@ -12,6 +12,7 @@ #include #include +#include #include #include #include @@ -200,8 +201,8 @@ void NewProjectDialog::do_create_project() if (result != GUI::MessageBox::ExecResult::ExecYes) return; - auto created = Core::File::ensure_parent_directories(maybe_project_full_path.value()); - if (!created) { + auto created = Core::Directory::create(maybe_project_full_path.value(), Core::Directory::CreateDirectories::Yes); + if (!created.is_error()) { GUI::MessageBox::show_error(this, String::formatted("Could not create directory {}", create_in)); return; } diff --git a/Userland/Libraries/LibCore/File.cpp b/Userland/Libraries/LibCore/File.cpp index 8fcef0e41c..6e19918534 100644 --- a/Userland/Libraries/LibCore/File.cpp +++ b/Userland/Libraries/LibCore/File.cpp @@ -181,42 +181,6 @@ String File::real_path_for(String const& filename) return real_path; } -bool File::ensure_parent_directories(String const& path) -{ - char* parent_buffer = strdup(path.characters()); - ScopeGuard free_buffer = [parent_buffer] { free(parent_buffer); }; - - char const* parent = dirname(parent_buffer); - - return ensure_directories(parent); -} - -bool File::ensure_directories(String const& path) -{ - VERIFY(path.starts_with("/")); - - int saved_errno = 0; - ScopeGuard restore_errno = [&saved_errno] { errno = saved_errno; }; - - int rc = mkdir(path.characters(), 0755); - saved_errno = errno; - - if (rc == 0 || errno == EEXIST) - return true; - - if (errno != ENOENT) - return false; - - bool ok = ensure_parent_directories(path); - saved_errno = errno; - if (!ok) - return false; - - rc = mkdir(path.characters(), 0755); - saved_errno = errno; - return rc == 0; -} - String File::current_working_directory() { char* cwd = getcwd(nullptr, 0); diff --git a/Userland/Libraries/LibCore/File.h b/Userland/Libraries/LibCore/File.h index 43fe19ebfc..2c21396ae2 100644 --- a/Userland/Libraries/LibCore/File.h +++ b/Userland/Libraries/LibCore/File.h @@ -37,8 +37,6 @@ public: static bool exists(String const& filename); static ErrorOr size(String const& filename); - static bool ensure_parent_directories(String const& path); - static bool ensure_directories(String const& path); static String current_working_directory(); static String absolute_path(String const& path); diff --git a/Userland/Libraries/LibCore/LockFile.cpp b/Userland/Libraries/LibCore/LockFile.cpp index 8fde143442..3d91913b05 100644 --- a/Userland/Libraries/LibCore/LockFile.cpp +++ b/Userland/Libraries/LibCore/LockFile.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: BSD-2-Clause */ -#include +#include #include #include #include @@ -16,7 +16,7 @@ namespace Core { LockFile::LockFile(char const* filename, Type type) : m_filename(filename) { - if (!Core::File::ensure_parent_directories(m_filename)) + if (Core::Directory::create(LexicalPath(m_filename).parent(), Core::Directory::CreateDirectories::Yes).is_error()) return; m_fd = open(filename, O_RDONLY | O_CREAT | O_CLOEXEC, 0666); diff --git a/Userland/Services/SystemServer/Service.cpp b/Userland/Services/SystemServer/Service.cpp index 4147595966..54a12cd52b 100644 --- a/Userland/Services/SystemServer/Service.cpp +++ b/Userland/Services/SystemServer/Service.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -34,8 +35,7 @@ void Service::setup_socket(SocketDescriptor& socket) { VERIFY(socket.fd == -1); - auto ok = Core::File::ensure_parent_directories(socket.path); - VERIFY(ok); + MUST(Core::Directory::create(LexicalPath(socket.path).parent(), Core::Directory::CreateDirectories::Yes)); // Note: we use SOCK_CLOEXEC here to make sure we don't leak every socket to // all the clients. We'll make the one we do need to pass down !CLOEXEC later diff --git a/Userland/Utilities/install.cpp b/Userland/Utilities/install.cpp index 8c3fde02f4..ab15049853 100644 --- a/Userland/Utilities/install.cpp +++ b/Userland/Utilities/install.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -35,7 +36,7 @@ ErrorOr serenity_main(Main::Arguments arguments) if (create_leading_dest_components) { String destination_dir_absolute = Core::File::absolute_path(destination_dir); - Core::File::ensure_directories(destination_dir_absolute); + MUST(Core::Directory::create(destination_dir_absolute, Core::Directory::CreateDirectories::Yes)); } for (auto const& source : sources) { diff --git a/Userland/Utilities/tar.cpp b/Userland/Utilities/tar.cpp index bb23a3a1a5..13bb34d9a9 100644 --- a/Userland/Utilities/tar.cpp +++ b/Userland/Utilities/tar.cpp @@ -4,6 +4,7 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include "LibCore/Directory.h" #include #include #include @@ -136,11 +137,12 @@ ErrorOr serenity_main(Main::Arguments arguments) Archive::TarFileStream file_stream = tar_stream.file_contents(); String absolute_path = Core::File::absolute_path(filename); + auto parent_path = LexicalPath(absolute_path).parent(); switch (header.type_flag()) { case Archive::TarFileType::NormalFile: case Archive::TarFileType::AlternateNormalFile: { - Core::File::ensure_parent_directories(absolute_path); + MUST(Core::Directory::create(parent_path, Core::Directory::CreateDirectories::Yes)); int fd = TRY(Core::System::open(absolute_path, O_CREAT | O_WRONLY, header.mode())); @@ -153,13 +155,13 @@ ErrorOr serenity_main(Main::Arguments arguments) break; } case Archive::TarFileType::SymLink: { - Core::File::ensure_parent_directories(absolute_path); + MUST(Core::Directory::create(parent_path, Core::Directory::CreateDirectories::Yes)); TRY(Core::System::symlink(header.link_name(), absolute_path)); break; } case Archive::TarFileType::Directory: { - Core::File::ensure_parent_directories(absolute_path); + MUST(Core::Directory::create(parent_path, Core::Directory::CreateDirectories::Yes)); auto result_or_error = Core::System::mkdir(absolute_path, header.mode()); if (result_or_error.is_error() && result_or_error.error().code() != EEXIST)