diff --git a/src/kernel/boot/loader/RootFileSystem.cpp b/src/kernel/boot/loader/RootFileSystem.cpp index e2cae85d50..0f5e67d2ea 100644 --- a/src/kernel/boot/loader/RootFileSystem.cpp +++ b/src/kernel/boot/loader/RootFileSystem.cpp @@ -53,8 +53,21 @@ RootFileSystem::Close(void *cookie) Node * RootFileSystem::Lookup(const char *name, bool /*traverseLinks*/) { - EntryIterator iterator = fList.Iterator(); - struct entry *entry = NULL; + EntryIterator iterator = fLinks.Iterator(); + struct entry *entry; + + // first check the links + + while ((entry = iterator.Next()) != NULL) { + if (!strcmp(name, entry->name)) { + entry->root->Acquire(); + return entry->root; + } + } + + // then all mounted file systems + + iterator = fList.Iterator(); while ((entry = iterator.Next()) != NULL) { char entryName[B_OS_NAME_LENGTH]; @@ -116,18 +129,32 @@ RootFileSystem::IsEmpty() status_t -RootFileSystem::AddNode(Node *node) +RootFileSystem::AddVolume(Directory *volume) { - // we don't have RTTI - if (node->Type() != S_IFDIR) - return B_BAD_TYPE; - struct entry *entry = new RootFileSystem::entry(); if (entry == NULL) return B_NO_MEMORY; - node->Acquire(); - entry->root = (Directory *)node; + volume->Acquire(); + entry->name = NULL; + entry->root = volume; + + fList.Add(entry); + + return B_OK; +} + + +status_t +RootFileSystem::AddLink(const char *name, Directory *target) +{ + struct entry *entry = new RootFileSystem::entry(); + if (entry == NULL) + return B_NO_MEMORY; + + target->Acquire(); + entry->name = name; + entry->root = target; fList.Add(entry); diff --git a/src/kernel/boot/loader/RootFileSystem.h b/src/kernel/boot/loader/RootFileSystem.h index 822d23739c..eacf8afef3 100644 --- a/src/kernel/boot/loader/RootFileSystem.h +++ b/src/kernel/boot/loader/RootFileSystem.h @@ -24,18 +24,22 @@ class RootFileSystem : public Directory { virtual status_t Rewind(void *cookie); virtual bool IsEmpty(); - virtual status_t AddNode(Node *node); + status_t AddVolume(Directory *volume); + status_t AddLink(const char *name, Directory *target); private: struct entry { DoublyLinked::Link link; + const char *name; Directory *root; }; typedef DoublyLinked::Iterator EntryIterator; typedef DoublyLinked::List EntryList; EntryList fList; + EntryList fLinks; }; +extern RootFileSystem *gRoot; #endif /* ROOT_FILE_SYSTEM_H */