FileSystem.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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 : public Retainable<FileSystem> {
  18. public:
  19. static void initializeGlobals();
  20. virtual ~FileSystem();
  21. dword id() const { return m_id; }
  22. static FileSystem* fromID(dword);
  23. virtual bool initialize() = 0;
  24. virtual const char* className() const = 0;
  25. virtual InodeIdentifier rootInode() const = 0;
  26. virtual bool writeInode(InodeIdentifier, const ByteBuffer&) = 0;
  27. virtual InodeMetadata inodeMetadata(InodeIdentifier) const = 0;
  28. virtual Unix::ssize_t readInodeBytes(InodeIdentifier, Unix::off_t offset, Unix::size_t count, byte* buffer, FileDescriptor*) const = 0;
  29. struct DirectoryEntry {
  30. DirectoryEntry(const char* name, InodeIdentifier, byte fileType);
  31. DirectoryEntry(const char* name, Unix::size_t name_length, InodeIdentifier, byte fileType);
  32. char name[256];
  33. Unix::size_t name_length { 0 };
  34. InodeIdentifier inode;
  35. byte fileType { 0 };
  36. };
  37. virtual bool enumerateDirectoryInode(InodeIdentifier, Function<bool(const DirectoryEntry&)>) const = 0;
  38. virtual bool setModificationTime(InodeIdentifier, dword timestamp) = 0;
  39. virtual InodeIdentifier createInode(InodeIdentifier parentInode, const String& name, Unix::mode_t, unsigned size) = 0;
  40. virtual InodeIdentifier makeDirectory(InodeIdentifier parentInode, const String& name, Unix::mode_t) = 0;
  41. virtual InodeIdentifier findParentOfInode(InodeIdentifier) const = 0;
  42. InodeIdentifier childOfDirectoryInodeWithName(InodeIdentifier, const String& name) const;
  43. ByteBuffer readEntireInode(InodeIdentifier, FileDescriptor* = nullptr) const;
  44. String nameOfChildInDirectory(InodeIdentifier parent, InodeIdentifier child) const;
  45. protected:
  46. FileSystem();
  47. private:
  48. dword m_id { 0 };
  49. };
  50. inline FileSystem* InodeIdentifier::fileSystem()
  51. {
  52. return FileSystem::fromID(m_fileSystemID);
  53. }
  54. inline const FileSystem* InodeIdentifier::fileSystem() const
  55. {
  56. return FileSystem::fromID(m_fileSystemID);
  57. }
  58. inline InodeMetadata InodeIdentifier::metadata() const
  59. {
  60. if (!isValid())
  61. return InodeMetadata();
  62. return fileSystem()->inodeMetadata(*this);
  63. }
  64. inline bool InodeIdentifier::isRootInode() const
  65. {
  66. return (*this) == fileSystem()->rootInode();
  67. }
  68. namespace AK {
  69. template<>
  70. struct Traits<InodeIdentifier> {
  71. // FIXME: This is a shitty hash.
  72. static unsigned hash(const InodeIdentifier& inode) { return Traits<unsigned>::hash(inode.fileSystemID()) + Traits<unsigned>::hash(inode.index()); }
  73. static void dump(const InodeIdentifier& inode) { kprintf("%02u:%08u", inode.fileSystemID(), inode.index()); }
  74. };
  75. }