DirectoryEntry.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. /*
  2. * Copyright (c) 2023, Sam Atkins <atkinssj@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "DirectoryEntry.h"
  7. #include <sys/stat.h>
  8. namespace Core {
  9. StringView DirectoryEntry::posix_name_from_directory_entry_type(Type type)
  10. {
  11. switch (type) {
  12. case Type::BlockDevice:
  13. return "DT_BLK"sv;
  14. case Type::CharacterDevice:
  15. return "DT_CHR"sv;
  16. case Type::Directory:
  17. return "DT_DIR"sv;
  18. case Type::File:
  19. return "DT_REG"sv;
  20. case Type::NamedPipe:
  21. return "DT_FIFO"sv;
  22. case Type::Socket:
  23. return "DT_SOCK"sv;
  24. case Type::SymbolicLink:
  25. return "DT_LNK"sv;
  26. case Type::Unknown:
  27. return "DT_UNKNOWN"sv;
  28. case Type::Whiteout:
  29. return "DT_WHT"sv;
  30. }
  31. VERIFY_NOT_REACHED();
  32. }
  33. StringView DirectoryEntry::representative_name_from_directory_entry_type(Type type)
  34. {
  35. switch (type) {
  36. case Type::BlockDevice:
  37. return "BlockDevice"sv;
  38. case Type::CharacterDevice:
  39. return "CharacterDevice"sv;
  40. case Type::Directory:
  41. return "Directory"sv;
  42. case Type::File:
  43. return "File"sv;
  44. case Type::NamedPipe:
  45. return "NamedPipe"sv;
  46. case Type::Socket:
  47. return "Socket"sv;
  48. case Type::SymbolicLink:
  49. return "SymbolicLink"sv;
  50. case Type::Unknown:
  51. return "Unknown"sv;
  52. case Type::Whiteout:
  53. return "Whiteout"sv;
  54. }
  55. VERIFY_NOT_REACHED();
  56. }
  57. DirectoryEntry::Type DirectoryEntry::directory_entry_type_from_stat(mode_t st_mode)
  58. {
  59. switch (st_mode & S_IFMT) {
  60. case S_IFIFO:
  61. return DirectoryEntry::Type::NamedPipe;
  62. case S_IFCHR:
  63. return DirectoryEntry::Type::CharacterDevice;
  64. case S_IFDIR:
  65. return DirectoryEntry::Type::Directory;
  66. case S_IFBLK:
  67. return DirectoryEntry::Type::BlockDevice;
  68. case S_IFREG:
  69. return DirectoryEntry::Type::File;
  70. case S_IFLNK:
  71. return DirectoryEntry::Type::SymbolicLink;
  72. case S_IFSOCK:
  73. return DirectoryEntry::Type::Socket;
  74. default:
  75. return DirectoryEntry::Type::Unknown;
  76. }
  77. VERIFY_NOT_REACHED();
  78. }
  79. #if !defined(AK_OS_SOLARIS) && !defined(AK_OS_HAIKU)
  80. static DirectoryEntry::Type directory_entry_type_from_posix(unsigned char dt_constant)
  81. {
  82. switch (dt_constant) {
  83. case DT_UNKNOWN:
  84. return DirectoryEntry::Type::Unknown;
  85. case DT_FIFO:
  86. return DirectoryEntry::Type::NamedPipe;
  87. case DT_CHR:
  88. return DirectoryEntry::Type::CharacterDevice;
  89. case DT_DIR:
  90. return DirectoryEntry::Type::Directory;
  91. case DT_BLK:
  92. return DirectoryEntry::Type::BlockDevice;
  93. case DT_REG:
  94. return DirectoryEntry::Type::File;
  95. case DT_LNK:
  96. return DirectoryEntry::Type::SymbolicLink;
  97. case DT_SOCK:
  98. return DirectoryEntry::Type::Socket;
  99. # ifndef AK_OS_OPENBSD
  100. case DT_WHT:
  101. return DirectoryEntry::Type::Whiteout;
  102. # endif
  103. }
  104. VERIFY_NOT_REACHED();
  105. }
  106. #endif
  107. DirectoryEntry DirectoryEntry::from_stat(DIR* d, dirent const& de)
  108. {
  109. struct stat statbuf;
  110. fstat(dirfd(d), &statbuf);
  111. return DirectoryEntry {
  112. .type = directory_entry_type_from_stat(statbuf.st_mode),
  113. .name = de.d_name,
  114. .inode_number = de.d_ino,
  115. };
  116. }
  117. #if !defined(AK_OS_SOLARIS) && !defined(AK_OS_HAIKU)
  118. DirectoryEntry DirectoryEntry::from_dirent(dirent const& de)
  119. {
  120. return DirectoryEntry {
  121. .type = directory_entry_type_from_posix(de.d_type),
  122. .name = de.d_name,
  123. .inode_number = de.d_ino,
  124. };
  125. }
  126. #endif
  127. }