diff --git a/VirtualFileSystem/Ext2FileSystem.cpp b/VirtualFileSystem/Ext2FileSystem.cpp index dad24ba3ff..9505d79114 100644 --- a/VirtualFileSystem/Ext2FileSystem.cpp +++ b/VirtualFileSystem/Ext2FileSystem.cpp @@ -336,38 +336,6 @@ Unix::ssize_t Ext2FileSystem::readInodeBytes(InodeIdentifier inode, Unix::off_t return nread; } -ByteBuffer Ext2FileSystem::readInode(InodeIdentifier inode) const -{ - ASSERT(inode.fileSystemID() == id()); - - auto e2inode = lookupExt2Inode(inode.index()); - if (!e2inode) { - printf("[ext2fs] readInode: metadata lookup for inode %u failed\n", inode.index()); - return nullptr; - } - - auto contents = ByteBuffer::createUninitialized(e2inode->i_size); - - Unix::ssize_t nread; - byte buffer[512]; - byte* out = contents.pointer(); - Unix::off_t offset = 0; - for (;;) { - nread = readInodeBytes(inode, offset, sizeof(buffer), buffer); - if (nread <= 0) - break; - memcpy(out, buffer, nread); - out += nread; - offset += nread; - } - if (nread < 0) { - printf("[ext2fs] readInode: ERROR: %d\n", nread); - return nullptr; - } - - return contents; -} - bool Ext2FileSystem::writeInode(InodeIdentifier inode, const ByteBuffer& data) { ASSERT(inode.fileSystemID() == id()); @@ -412,7 +380,7 @@ bool Ext2FileSystem::enumerateDirectoryInode(InodeIdentifier inode, std::functio printf("[ext2fs] Enumerating directory contents of inode %u:\n", inode.index()); #endif - auto buffer = readInode(inode); + auto buffer = readEntireInode(inode); ASSERT(buffer); auto* entry = reinterpret_cast(buffer.pointer()); diff --git a/VirtualFileSystem/Ext2FileSystem.h b/VirtualFileSystem/Ext2FileSystem.h index 1cdecc8133..9ec4279b60 100644 --- a/VirtualFileSystem/Ext2FileSystem.h +++ b/VirtualFileSystem/Ext2FileSystem.h @@ -35,7 +35,6 @@ private: virtual bool initialize() override; virtual const char* className() const override; virtual InodeIdentifier rootInode() const override; - virtual ByteBuffer readInode(InodeIdentifier) const override; virtual bool writeInode(InodeIdentifier, const ByteBuffer&) override; virtual bool enumerateDirectoryInode(InodeIdentifier, std::function) const override; virtual InodeMetadata inodeMetadata(InodeIdentifier) const override; diff --git a/VirtualFileSystem/FileHandle.cpp b/VirtualFileSystem/FileHandle.cpp index cd10ddfd19..2f0819d1e9 100644 --- a/VirtualFileSystem/FileHandle.cpp +++ b/VirtualFileSystem/FileHandle.cpp @@ -104,6 +104,6 @@ ByteBuffer FileHandle::readEntireFile() return buffer; } - return m_vnode->fileSystem()->readInode(m_vnode->inode); + return m_vnode->fileSystem()->readEntireInode(m_vnode->inode); } diff --git a/VirtualFileSystem/FileSystem.cpp b/VirtualFileSystem/FileSystem.cpp index d7fb622694..49b5af07b2 100644 --- a/VirtualFileSystem/FileSystem.cpp +++ b/VirtualFileSystem/FileSystem.cpp @@ -29,7 +29,7 @@ FileSystem* FileSystem::fromID(dword id) return nullptr; } -InodeIdentifier FileSystem::childOfDirectoryInodeWithName(InodeIdentifier inode, const String& name) +InodeIdentifier FileSystem::childOfDirectoryInodeWithName(InodeIdentifier inode, const String& name) const { InodeIdentifier foundInode; enumerateDirectoryInode(inode, [&] (const DirectoryEntry& entry) { @@ -42,3 +42,35 @@ InodeIdentifier FileSystem::childOfDirectoryInodeWithName(InodeIdentifier inode, return foundInode; } +ByteBuffer FileSystem::readEntireInode(InodeIdentifier inode) const +{ + ASSERT(inode.fileSystemID() == id()); + + auto metadata = inodeMetadata(inode); + if (!metadata.isValid()) { + printf("[fs] readInode: metadata lookup for inode %u failed\n", inode.index()); + return nullptr; + } + + auto contents = ByteBuffer::createUninitialized(metadata.size); + + Unix::ssize_t nread; + byte buffer[512]; + byte* out = contents.pointer(); + Unix::off_t offset = 0; + for (;;) { + nread = readInodeBytes(inode, offset, sizeof(buffer), buffer); + if (nread <= 0) + break; + memcpy(out, buffer, nread); + out += nread; + offset += nread; + } + if (nread < 0) { + printf("[fs] readInode: ERROR: %d\n", nread); + return nullptr; + } + + return contents; +} + diff --git a/VirtualFileSystem/FileSystem.h b/VirtualFileSystem/FileSystem.h index fe9a2afb04..81132f0ba9 100644 --- a/VirtualFileSystem/FileSystem.h +++ b/VirtualFileSystem/FileSystem.h @@ -25,7 +25,6 @@ public: virtual bool initialize() = 0; virtual const char* className() const = 0; virtual InodeIdentifier rootInode() const = 0; - virtual ByteBuffer readInode(InodeIdentifier) const = 0; virtual bool writeInode(InodeIdentifier, const ByteBuffer&) = 0; virtual InodeMetadata inodeMetadata(InodeIdentifier) const = 0; @@ -41,7 +40,8 @@ public: virtual bool setModificationTime(InodeIdentifier, dword timestamp) = 0; virtual InodeIdentifier createInode(InodeIdentifier parentInode, const String& name, word mode) = 0; - InodeIdentifier childOfDirectoryInodeWithName(InodeIdentifier, const String& name); + InodeIdentifier childOfDirectoryInodeWithName(InodeIdentifier, const String& name) const; + ByteBuffer readEntireInode(InodeIdentifier) const; protected: FileSystem(); diff --git a/VirtualFileSystem/InodeIdentifier.cpp b/VirtualFileSystem/InodeIdentifier.cpp index 787f039f1f..45aa2dd1ca 100644 --- a/VirtualFileSystem/InodeIdentifier.cpp +++ b/VirtualFileSystem/InodeIdentifier.cpp @@ -5,5 +5,5 @@ ByteBuffer InodeIdentifier::readEntireFile() const { if (!fileSystem()) return { }; - return fileSystem()->readInode(*this); + return fileSystem()->readEntireInode(*this); } diff --git a/VirtualFileSystem/SyntheticFileSystem.cpp b/VirtualFileSystem/SyntheticFileSystem.cpp index 5479933a42..bc750b5546 100644 --- a/VirtualFileSystem/SyntheticFileSystem.cpp +++ b/VirtualFileSystem/SyntheticFileSystem.cpp @@ -62,17 +62,6 @@ InodeIdentifier SyntheticFileSystem::rootInode() const return { id(), 1 }; } -ByteBuffer SyntheticFileSystem::readInode(InodeIdentifier inode) const -{ - ASSERT(inode.fileSystemID() == id()); -#ifdef SYNTHFS_DEBUG - printf("[synthfs] readInode %u\n", inode.index()); -#endif - ASSERT(inode.index() != 1); - ASSERT(inode.index() <= m_files.size()); - return m_files[inode.index() - 1]->data; -} - bool SyntheticFileSystem::enumerateDirectoryInode(InodeIdentifier inode, std::function callback) const { ASSERT(inode.fileSystemID() == id()); diff --git a/VirtualFileSystem/SyntheticFileSystem.h b/VirtualFileSystem/SyntheticFileSystem.h index a9389e6e18..c59917cc32 100644 --- a/VirtualFileSystem/SyntheticFileSystem.h +++ b/VirtualFileSystem/SyntheticFileSystem.h @@ -12,7 +12,6 @@ public: virtual bool initialize() override; virtual const char* className() const override; virtual InodeIdentifier rootInode() const override; - virtual ByteBuffer readInode(InodeIdentifier) const override; virtual bool writeInode(InodeIdentifier, const ByteBuffer&) override; virtual bool enumerateDirectoryInode(InodeIdentifier, std::function) const override; virtual InodeMetadata inodeMetadata(InodeIdentifier) const override; diff --git a/VirtualFileSystem/VirtualFileSystem.cpp b/VirtualFileSystem/VirtualFileSystem.cpp index a6597d5cd8..99397b016a 100644 --- a/VirtualFileSystem/VirtualFileSystem.cpp +++ b/VirtualFileSystem/VirtualFileSystem.cpp @@ -285,7 +285,7 @@ void VirtualFileSystem::listDirectory(const String& path) if (metadata.isDirectory()) { printf("/"); } else if (metadata.isSymbolicLink()) { - auto symlinkContents = directoryInode.fileSystem()->readInode(metadata.inode); + auto symlinkContents = directoryInode.fileSystem()->readEntireInode(metadata.inode); printf(" -> %s", String((const char*)symlinkContents.pointer(), symlinkContents.size()).characters()); } printf("\n");