diff --git a/VirtualFileSystem/Makefile b/VirtualFileSystem/Makefile index 9542483941..9ea79d9604 100644 --- a/VirtualFileSystem/Makefile +++ b/VirtualFileSystem/Makefile @@ -7,6 +7,7 @@ AK_OBJS = \ ../AK/TemporaryFile.o \ ../AK/SimpleMalloc.o \ ../AK/StringBuilder.o \ + ../AK/FileSystemPath.o \ ../AK/kmalloc.o VFS_OBJS = \ diff --git a/VirtualFileSystem/VirtualFileSystem.cpp b/VirtualFileSystem/VirtualFileSystem.cpp index 9e4e59f9a1..8c6e3e330e 100644 --- a/VirtualFileSystem/VirtualFileSystem.cpp +++ b/VirtualFileSystem/VirtualFileSystem.cpp @@ -258,10 +258,10 @@ void VirtualFileSystem::enumerateDirectoryInode(InodeIdentifier directoryInode, } #ifndef SERENITY -void VirtualFileSystem::listDirectory(const String& path) +void VirtualFileSystem::listDirectory(const String& path, InodeIdentifier base) { int error; - auto directoryInode = resolvePath(path, error); + auto directoryInode = resolvePath(path, error, base); if (!directoryInode.isValid()) return; @@ -359,10 +359,10 @@ void VirtualFileSystem::listDirectory(const String& path) }); } -void VirtualFileSystem::listDirectoryRecursively(const String& path) +void VirtualFileSystem::listDirectoryRecursively(const String& path, InodeIdentifier base) { int error; - auto directory = resolvePath(path, error); + auto directory = resolvePath(path, error, base); if (!directory.isValid()) return; @@ -374,7 +374,7 @@ void VirtualFileSystem::listDirectoryRecursively(const String& path) if (entry.name != "." && entry.name != "..") { char buf[4096]; ksprintf(buf, "%s/%s", path.characters(), entry.name.characters()); - listDirectoryRecursively(buf); + listDirectoryRecursively(buf, base); } } else { kprintf("%s/%s\n", path.characters(), entry.name.characters()); diff --git a/VirtualFileSystem/VirtualFileSystem.h b/VirtualFileSystem/VirtualFileSystem.h index 082be01d35..2f30223d72 100644 --- a/VirtualFileSystem/VirtualFileSystem.h +++ b/VirtualFileSystem/VirtualFileSystem.h @@ -79,8 +79,8 @@ public: ~VirtualFileSystem(); bool isDirectory(const String& path, InodeIdentifier base = InodeIdentifier()); - void listDirectory(const String& path); - void listDirectoryRecursively(const String& path); + void listDirectory(const String& path, InodeIdentifier base); + void listDirectoryRecursively(const String& path, InodeIdentifier base); unsigned maxNodeCount() const { return m_maxNodeCount; } unsigned allocatedNodeCount() const { return m_maxNodeCount - m_nodeFreeList.size(); } diff --git a/VirtualFileSystem/test.cpp b/VirtualFileSystem/test.cpp index 5cb14dfd2e..d39650dd89 100644 --- a/VirtualFileSystem/test.cpp +++ b/VirtualFileSystem/test.cpp @@ -8,6 +8,7 @@ #include "FullDevice.h" #include "RandomDevice.h" #include +#include #include #include #include @@ -77,9 +78,9 @@ int main(int c, char** v) vfs.mount(std::move(synthfs), "/syn"); - vfs.listDirectory("/"); + vfs.listDirectory(".", vfs.root()->inode); printf("list /syn:\n"); - vfs.listDirectory("/syn"); + vfs.listDirectory("/syn", vfs.root()->inode); #if 0 auto descriptor = vfs.open("/home/andreas/../../home/./andreas/./file2"); @@ -94,6 +95,8 @@ int main(int c, char** v) String currentDirectory = "/"; + auto cwd = vfs.root()->inode; + while (true) { char cmdbuf[256]; printf("::>"); @@ -120,22 +123,30 @@ int main(int c, char** v) } if (cmd == "ls") { - vfs.listDirectory(currentDirectory); + vfs.listDirectory(".", cwd); continue; } if (cmd == "lr") { - vfs.listDirectoryRecursively(currentDirectory); + vfs.listDirectoryRecursively(".", cwd); continue; } if (cmd == "cd" && parts.size() > 1) { - char buf[1024]; + char buf[4096]; sprintf(buf, "%s/%s", currentDirectory.characters(), parts[1].characters()); - if (vfs.isDirectory(buf)) { - currentDirectory = buf; + FileSystemPath new_path(buf); + if (new_path.string() == "/") { + cwd = vfs.root()->inode; + continue; + } + int error; + auto new_cwd = vfs.open(new_path.string(), error, 0, cwd); + if (new_cwd && new_cwd->isDirectory()) { + currentDirectory = new_path.string(); + cwd = new_cwd->metadata().inode; } else { - printf("No such directory: %s\n", buf); + printf("No such directory: %s\n", parts[1].characters()); } continue; }