DirectoryEntry.cpp 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. static DirectoryEntry::Type directory_entry_type_from_stat(mode_t st_mode)
  10. {
  11. switch (st_mode) {
  12. case S_IFIFO:
  13. return DirectoryEntry::Type::NamedPipe;
  14. case S_IFCHR:
  15. return DirectoryEntry::Type::CharacterDevice;
  16. case S_IFDIR:
  17. return DirectoryEntry::Type::Directory;
  18. case S_IFBLK:
  19. return DirectoryEntry::Type::BlockDevice;
  20. case S_IFREG:
  21. return DirectoryEntry::Type::File;
  22. case S_IFLNK:
  23. return DirectoryEntry::Type::SymbolicLink;
  24. case S_IFSOCK:
  25. return DirectoryEntry::Type::Socket;
  26. default:
  27. return DirectoryEntry::Type::Unknown;
  28. }
  29. VERIFY_NOT_REACHED();
  30. }
  31. #if !defined(AK_OS_SOLARIS) && !defined(AK_OS_HAIKU)
  32. static DirectoryEntry::Type directory_entry_type_from_posix(unsigned char dt_constant)
  33. {
  34. switch (dt_constant) {
  35. case DT_UNKNOWN:
  36. return DirectoryEntry::Type::Unknown;
  37. case DT_FIFO:
  38. return DirectoryEntry::Type::NamedPipe;
  39. case DT_CHR:
  40. return DirectoryEntry::Type::CharacterDevice;
  41. case DT_DIR:
  42. return DirectoryEntry::Type::Directory;
  43. case DT_BLK:
  44. return DirectoryEntry::Type::BlockDevice;
  45. case DT_REG:
  46. return DirectoryEntry::Type::File;
  47. case DT_LNK:
  48. return DirectoryEntry::Type::SymbolicLink;
  49. case DT_SOCK:
  50. return DirectoryEntry::Type::Socket;
  51. # ifndef AK_OS_OPENBSD
  52. case DT_WHT:
  53. return DirectoryEntry::Type::Whiteout;
  54. # endif
  55. }
  56. VERIFY_NOT_REACHED();
  57. }
  58. #endif
  59. DirectoryEntry DirectoryEntry::from_stat(DIR* d, dirent const& de)
  60. {
  61. struct stat statbuf;
  62. fstat(dirfd(d), &statbuf);
  63. return DirectoryEntry {
  64. .type = directory_entry_type_from_stat(statbuf.st_mode),
  65. .name = de.d_name,
  66. .inode_number = de.d_ino,
  67. };
  68. }
  69. #if !defined(AK_OS_SOLARIS) && !defined(AK_OS_HAIKU)
  70. DirectoryEntry DirectoryEntry::from_dirent(dirent const& de)
  71. {
  72. return DirectoryEntry {
  73. .type = directory_entry_type_from_posix(de.d_type),
  74. .name = de.d_name,
  75. .inode_number = de.d_ino,
  76. };
  77. }
  78. #endif
  79. }