FileSystem.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #pragma once
  2. #include "DiskDevice.h"
  3. #include "InodeIdentifier.h"
  4. #include "InodeMetadata.h"
  5. #include "Limits.h"
  6. #include "UnixTypes.h"
  7. #include <AK/ByteBuffer.h>
  8. #include <AK/HashMap.h>
  9. #include <AK/OwnPtr.h>
  10. #include <AK/Retainable.h>
  11. #include <AK/RetainPtr.h>
  12. #include <AK/String.h>
  13. #include <AK/Function.h>
  14. #include <AK/kstdio.h>
  15. static const dword mepoch = 476763780;
  16. class FileDescriptor;
  17. class FileSystem;
  18. class CoreInode : public Retainable<CoreInode> {
  19. public:
  20. virtual ~CoreInode();
  21. FileSystem& fs() const { return m_fs; }
  22. unsigned fsid() const;
  23. unsigned index() const { return m_index; }
  24. InodeIdentifier identifier() const { return { fsid(), index() }; }
  25. virtual Unix::ssize_t read_bytes(Unix::off_t, Unix::size_t, byte* buffer, FileDescriptor*) = 0;
  26. protected:
  27. CoreInode(FileSystem& fs, unsigned index)
  28. : m_fs(fs)
  29. , m_index(index)
  30. {
  31. }
  32. private:
  33. FileSystem& m_fs;
  34. unsigned m_index { 0 };
  35. };
  36. class FileSystem : public Retainable<FileSystem> {
  37. public:
  38. static void initializeGlobals();
  39. virtual ~FileSystem();
  40. dword id() const { return m_id; }
  41. static FileSystem* fromID(dword);
  42. virtual bool initialize() = 0;
  43. virtual const char* className() const = 0;
  44. virtual InodeIdentifier rootInode() const = 0;
  45. virtual bool writeInode(InodeIdentifier, const ByteBuffer&) = 0;
  46. virtual InodeMetadata inodeMetadata(InodeIdentifier) const = 0;
  47. virtual Unix::ssize_t readInodeBytes(InodeIdentifier, Unix::off_t offset, Unix::size_t count, byte* buffer, FileDescriptor*) const = 0;
  48. struct DirectoryEntry {
  49. DirectoryEntry(const char* name, InodeIdentifier, byte fileType);
  50. DirectoryEntry(const char* name, Unix::size_t name_length, InodeIdentifier, byte fileType);
  51. char name[256];
  52. Unix::size_t name_length { 0 };
  53. InodeIdentifier inode;
  54. byte fileType { 0 };
  55. };
  56. virtual bool enumerateDirectoryInode(InodeIdentifier, Function<bool(const DirectoryEntry&)>) const = 0;
  57. virtual bool setModificationTime(InodeIdentifier, dword timestamp) = 0;
  58. virtual InodeIdentifier createInode(InodeIdentifier parentInode, const String& name, Unix::mode_t, unsigned size) = 0;
  59. virtual InodeIdentifier makeDirectory(InodeIdentifier parentInode, const String& name, Unix::mode_t) = 0;
  60. virtual InodeIdentifier findParentOfInode(InodeIdentifier) const = 0;
  61. virtual RetainPtr<CoreInode> get_inode(InodeIdentifier) = 0;
  62. InodeIdentifier childOfDirectoryInodeWithName(InodeIdentifier, const String& name) const;
  63. ByteBuffer readEntireInode(InodeIdentifier, FileDescriptor* = nullptr) const;
  64. String nameOfChildInDirectory(InodeIdentifier parent, InodeIdentifier child) const;
  65. protected:
  66. FileSystem();
  67. private:
  68. dword m_id { 0 };
  69. };
  70. inline FileSystem* InodeIdentifier::fileSystem()
  71. {
  72. return FileSystem::fromID(m_fileSystemID);
  73. }
  74. inline const FileSystem* InodeIdentifier::fileSystem() const
  75. {
  76. return FileSystem::fromID(m_fileSystemID);
  77. }
  78. inline InodeMetadata InodeIdentifier::metadata() const
  79. {
  80. if (!isValid())
  81. return InodeMetadata();
  82. return fileSystem()->inodeMetadata(*this);
  83. }
  84. inline bool InodeIdentifier::isRootInode() const
  85. {
  86. return (*this) == fileSystem()->rootInode();
  87. }
  88. inline unsigned CoreInode::fsid() const
  89. {
  90. return m_fs.id();
  91. }
  92. namespace AK {
  93. template<>
  94. struct Traits<InodeIdentifier> {
  95. // FIXME: This is a shitty hash.
  96. static unsigned hash(const InodeIdentifier& inode) { return Traits<unsigned>::hash(inode.fileSystemID()) + Traits<unsigned>::hash(inode.index()); }
  97. static void dump(const InodeIdentifier& inode) { kprintf("%02u:%08u", inode.fileSystemID(), inode.index()); }
  98. };
  99. }