/* * Copyright (c) 2022, kleines Filmröllchen * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include namespace Core { class DirIterator; // Deal with real system directories. Any Directory instance always refers to a valid existing directory. class Directory { AK_MAKE_NONCOPYABLE(Directory); public: Directory(Directory&&); ~Directory(); // When this flag is set, both the directory attempted to instantiate as well as all of its parents are created with mode 0755 if necessary. enum class CreateDirectories : bool { No, Yes, }; static ErrorOr create(LexicalPath path, CreateDirectories, mode_t creation_mode = 0755); static ErrorOr create(DeprecatedString path, CreateDirectories, mode_t creation_mode = 0755); static ErrorOr adopt_fd(int fd, Optional path = {}); ErrorOr> open(StringView filename, Stream::OpenMode mode) const; ErrorOr stat() const; ErrorOr create_iterator() const; ErrorOr path() const; ErrorOr chown(uid_t, gid_t); static ErrorOr is_valid_directory(int fd); private: Directory(int directory_fd, Optional path); static ErrorOr ensure_directory(LexicalPath const& path, mode_t creation_mode = 0755); Optional m_path; int m_directory_fd; }; } namespace AK { template<> struct Formatter : Formatter { ErrorOr format(FormatBuilder& builder, Core::Directory const& directory) { auto path = directory.path(); if (path.is_error()) TRY(builder.put_string(""sv)); TRY(builder.put_string(path.release_value().string())); return {}; } }; }