123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- /*
- * Copyright (c) 2023, Sam Atkins <atkinssj@serenityos.org>
- *
- * SPDX-License-Identifier: BSD-2-Clause
- */
- #include "DirectoryEntry.h"
- #include <sys/stat.h>
- namespace Core {
- StringView DirectoryEntry::posix_name_from_directory_entry_type(Type type)
- {
- switch (type) {
- case Type::BlockDevice:
- return "DT_BLK"sv;
- case Type::CharacterDevice:
- return "DT_CHR"sv;
- case Type::Directory:
- return "DT_DIR"sv;
- case Type::File:
- return "DT_REG"sv;
- case Type::NamedPipe:
- return "DT_FIFO"sv;
- case Type::Socket:
- return "DT_SOCK"sv;
- case Type::SymbolicLink:
- return "DT_LNK"sv;
- case Type::Unknown:
- return "DT_UNKNOWN"sv;
- case Type::Whiteout:
- return "DT_WHT"sv;
- }
- VERIFY_NOT_REACHED();
- }
- StringView DirectoryEntry::representative_name_from_directory_entry_type(Type type)
- {
- switch (type) {
- case Type::BlockDevice:
- return "BlockDevice"sv;
- case Type::CharacterDevice:
- return "CharacterDevice"sv;
- case Type::Directory:
- return "Directory"sv;
- case Type::File:
- return "File"sv;
- case Type::NamedPipe:
- return "NamedPipe"sv;
- case Type::Socket:
- return "Socket"sv;
- case Type::SymbolicLink:
- return "SymbolicLink"sv;
- case Type::Unknown:
- return "Unknown"sv;
- case Type::Whiteout:
- return "Whiteout"sv;
- }
- VERIFY_NOT_REACHED();
- }
- DirectoryEntry::Type DirectoryEntry::directory_entry_type_from_stat(mode_t st_mode)
- {
- switch (st_mode & S_IFMT) {
- case S_IFIFO:
- return DirectoryEntry::Type::NamedPipe;
- case S_IFCHR:
- return DirectoryEntry::Type::CharacterDevice;
- case S_IFDIR:
- return DirectoryEntry::Type::Directory;
- case S_IFBLK:
- return DirectoryEntry::Type::BlockDevice;
- case S_IFREG:
- return DirectoryEntry::Type::File;
- case S_IFLNK:
- return DirectoryEntry::Type::SymbolicLink;
- case S_IFSOCK:
- return DirectoryEntry::Type::Socket;
- default:
- return DirectoryEntry::Type::Unknown;
- }
- VERIFY_NOT_REACHED();
- }
- #if !defined(AK_OS_SOLARIS) && !defined(AK_OS_HAIKU)
- static DirectoryEntry::Type directory_entry_type_from_posix(unsigned char dt_constant)
- {
- switch (dt_constant) {
- case DT_UNKNOWN:
- return DirectoryEntry::Type::Unknown;
- case DT_FIFO:
- return DirectoryEntry::Type::NamedPipe;
- case DT_CHR:
- return DirectoryEntry::Type::CharacterDevice;
- case DT_DIR:
- return DirectoryEntry::Type::Directory;
- case DT_BLK:
- return DirectoryEntry::Type::BlockDevice;
- case DT_REG:
- return DirectoryEntry::Type::File;
- case DT_LNK:
- return DirectoryEntry::Type::SymbolicLink;
- case DT_SOCK:
- return DirectoryEntry::Type::Socket;
- # ifndef AK_OS_OPENBSD
- case DT_WHT:
- return DirectoryEntry::Type::Whiteout;
- # endif
- }
- VERIFY_NOT_REACHED();
- }
- #endif
- DirectoryEntry DirectoryEntry::from_stat(DIR* d, dirent const& de)
- {
- struct stat statbuf;
- fstat(dirfd(d), &statbuf);
- return DirectoryEntry {
- .type = directory_entry_type_from_stat(statbuf.st_mode),
- .name = de.d_name,
- .inode_number = de.d_ino,
- };
- }
- #if !defined(AK_OS_SOLARIS) && !defined(AK_OS_HAIKU)
- DirectoryEntry DirectoryEntry::from_dirent(dirent const& de)
- {
- return DirectoryEntry {
- .type = directory_entry_type_from_posix(de.d_type),
- .name = de.d_name,
- .inode_number = de.d_ino,
- };
- }
- #endif
- }
|