diff options
author | Dominick Allen <djallen@librehumanitas.org> | 2024-09-28 00:23:22 -0500 |
---|---|---|
committer | Dominick Allen <djallen@librehumanitas.org> | 2024-09-28 00:23:22 -0500 |
commit | 07d30629d78474ed810cad73ead71db96079aff0 (patch) | |
tree | 5f43fd8f6a818a590818e0c474f03a1f05076dba /include/fud_directory.hpp | |
parent | 63711877057f1f89b4d1774e24fe20907a3af656 (diff) |
Add directory interface.
Diffstat (limited to 'include/fud_directory.hpp')
-rw-r--r-- | include/fud_directory.hpp | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/include/fud_directory.hpp b/include/fud_directory.hpp new file mode 100644 index 0000000..ac48b7b --- /dev/null +++ b/include/fud_directory.hpp @@ -0,0 +1,87 @@ +/* + * libfud + * Copyright 2024 Dominick Allen + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FUD_DIRECTORY_HPP +#define FUD_DIRECTORY_HPP + +#include "fud_result.hpp" +#include "fud_status.hpp" +#include "fud_string.hpp" + +#include <cstdint> +#include <cstdio> +#include <dirent.h> +#include <optional> +#include <ctime> + +namespace fud { + +enum class DirectoryEntryType : uint8_t +{ + Block, + Character, + Directory, + NamedPipe, + SymbolicLink, + RegularFile, + UnixSocket, + Unknown +}; + +/** \brief Simplified Directory Entry */ +struct DirectoryEntry { + String name; + size_t size; + size_t links; + time_t modificationTime; + DirectoryEntryType entryType; +}; + +class Directory { + public: + explicit Directory(String name); + Directory(const Directory& rhs) = delete; + Directory(Directory&& rhs); + ~Directory(); + Directory& operator=(const Directory& rhs) = delete; + Directory& operator=(Directory&& rhs); + + constexpr FudStatus status() const + { + return m_status; + } + + constexpr int errorCode() const + { + return m_errorCode; + } + + Result<std::optional<DirectoryEntry>, FudStatus> getNextEntry(); + + FudStatus reset(); + + private: + String m_name{}; + DIR* m_directory{nullptr}; + FudStatus m_status{FudStatus::ObjectInvalid}; + int m_errorCode{-1}; + int m_dirFd{-1}; +}; + +} // namespace fud + +#endif |