SyntheticFileSystem.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. #include "SyntheticFileSystem.h"
  2. #include <AK/StdLib.h>
  3. //#define SYNTHFS_DEBUG
  4. RetainPtr<SyntheticFileSystem> SyntheticFileSystem::create()
  5. {
  6. return adopt(*new SyntheticFileSystem);
  7. }
  8. SyntheticFileSystem::SyntheticFileSystem()
  9. {
  10. }
  11. SyntheticFileSystem::~SyntheticFileSystem()
  12. {
  13. }
  14. bool SyntheticFileSystem::initialize()
  15. {
  16. // Add a File for the root directory.
  17. // FIXME: This needs work.
  18. auto rootDir = make<File>();
  19. rootDir->metadata.inode = { id(), 1 };
  20. rootDir->metadata.mode = 0040555;
  21. rootDir->metadata.uid = 0;
  22. rootDir->metadata.gid = 0;
  23. rootDir->metadata.size = 0;
  24. rootDir->metadata.mtime = mepoch;
  25. m_files.append(move(rootDir));
  26. #ifndef SERENITY
  27. addFile(createTextFile("file", "I'm a synthetic file!\n"));
  28. addFile(createTextFile("message", "Hey! This isn't my bottle!\n"));
  29. #endif
  30. return true;
  31. }
  32. auto SyntheticFileSystem::createTextFile(String&& name, String&& text) -> OwnPtr<File>
  33. {
  34. auto file = make<File>();
  35. file->data = text.toByteBuffer();
  36. file->name = move(name);
  37. file->metadata.size = file->data.size();
  38. file->metadata.uid = 100;
  39. file->metadata.gid = 200;
  40. file->metadata.mode = 0100644;
  41. file->metadata.mtime = mepoch;
  42. return file;
  43. }
  44. auto SyntheticFileSystem::createGeneratedFile(String&& name, Function<ByteBuffer()>&& generator) -> OwnPtr<File>
  45. {
  46. auto file = make<File>();
  47. file->generator = move(generator);
  48. file->name = move(name);
  49. file->metadata.size = 0;
  50. file->metadata.uid = 0;
  51. file->metadata.gid = 0;
  52. file->metadata.mode = 0100644;
  53. file->metadata.mtime = mepoch;
  54. return file;
  55. }
  56. void SyntheticFileSystem::addFile(OwnPtr<File>&& file)
  57. {
  58. ASSERT(file);
  59. file->metadata.inode = { id(), m_files.size() + 1 };
  60. m_files.append(move(file));
  61. }
  62. const char* SyntheticFileSystem::className() const
  63. {
  64. return "synthfs";
  65. }
  66. InodeIdentifier SyntheticFileSystem::rootInode() const
  67. {
  68. return { id(), 1 };
  69. }
  70. bool SyntheticFileSystem::enumerateDirectoryInode(InodeIdentifier inode, Function<bool(const DirectoryEntry&)> callback) const
  71. {
  72. ASSERT(inode.fileSystemID() == id());
  73. #ifdef SYNTHFS_DEBUG
  74. kprintf("[synthfs] enumerateDirectoryInode %u\n", inode.index());
  75. #endif
  76. if (inode.index() != 1)
  77. return false;
  78. callback({ ".", m_files[0]->metadata.inode });
  79. callback({ "..", m_files[0]->metadata.inode });
  80. for (unsigned i = 1; i < m_files.size(); ++i)
  81. callback({ m_files[i]->name, m_files[i]->metadata.inode });
  82. return true;
  83. }
  84. InodeMetadata SyntheticFileSystem::inodeMetadata(InodeIdentifier inode) const
  85. {
  86. ASSERT(inode.fileSystemID() == id());
  87. #ifdef SYNTHFS_DEBUG
  88. kprintf("[synthfs] inodeMetadata(%u)\n", inode.index());
  89. #endif
  90. if (inode.index() == 0 || inode.index() > m_files.size())
  91. return InodeMetadata();
  92. auto& file = *m_files[inode.index() - 1];
  93. auto metadata = file.metadata;
  94. if (file.generator)
  95. metadata.size = file.generator().size();
  96. return metadata;
  97. }
  98. bool SyntheticFileSystem::setModificationTime(InodeIdentifier, dword timestamp)
  99. {
  100. (void) timestamp;
  101. kprintf("FIXME: Implement SyntheticFileSystem::setModificationTime().\n");
  102. return false;
  103. }
  104. InodeIdentifier SyntheticFileSystem::createInode(InodeIdentifier parentInode, const String& name, Unix::mode_t mode, unsigned size)
  105. {
  106. (void) parentInode;
  107. (void) name;
  108. (void) mode;
  109. kprintf("FIXME: Implement SyntheticFileSystem::createDirectoryInode().\n");
  110. return { };
  111. }
  112. bool SyntheticFileSystem::writeInode(InodeIdentifier, const ByteBuffer&)
  113. {
  114. kprintf("FIXME: Implement SyntheticFileSystem::writeInode().\n");
  115. return false;
  116. }
  117. Unix::ssize_t SyntheticFileSystem::readInodeBytes(InodeIdentifier inode, Unix::off_t offset, Unix::size_t count, byte* buffer) const
  118. {
  119. ASSERT(inode.fileSystemID() == id());
  120. #ifdef SYNTHFS_DEBUG
  121. kprintf("[synthfs] readInode %u\n", inode.index());
  122. #endif
  123. ASSERT(inode.index() != 1);
  124. ASSERT(inode.index() <= m_files.size());
  125. ASSERT(offset >= 0);
  126. ASSERT(buffer);
  127. auto& file = *m_files[inode.index() - 1];
  128. ByteBuffer generatedData;
  129. if (file.generator)
  130. generatedData = file.generator();
  131. auto* data = generatedData ? &generatedData : &file.data;
  132. Unix::ssize_t nread = min(static_cast<Unix::off_t>(data->size() - offset), static_cast<Unix::off_t>(count));
  133. memcpy(buffer, data->pointer() + offset, nread);
  134. return nread;
  135. }
  136. InodeIdentifier SyntheticFileSystem::makeDirectory(InodeIdentifier parentInode, const String& name, Unix::mode_t)
  137. {
  138. kprintf("FIXME: Implement SyntheticFileSystem::makeDirectory().\n");
  139. return { };
  140. }