Node* Directory::Lookup(const char* name, bool traverseLinks) { Node* node = LookupDontTraverse(name); if (node == NULL) return NULL; if (!traverseLinks || !S_ISLNK(node->Type())) return node; // the node is a symbolic link, so we have to resolve the path char linkPath[B_PATH_NAME_LENGTH]; status_t error = node->ReadLink(linkPath, sizeof(linkPath)); node->Release(); // we don't need this one anymore if (error != B_OK) return NULL; // let open_from() do the real work int fd = open_from(this, linkPath, O_RDONLY); if (fd < 0) return NULL; node = get_node_from(fd); if (node != NULL) node->Acquire(); close(fd); return node; }
Node * Directory::Lookup(const char *name, bool traverseLinks) { off_t id; if (fTree.Find((uint8 *)name, strlen(name), &id) < B_OK) return NULL; Node *node = Stream::NodeFactory(fStream.GetVolume(), id); if (!node) return NULL; if (S_ISLNK(node->Type())) { // the node is a symbolic link, so we have to resolve the path char linkPath[B_PATH_NAME_LENGTH]; ((Link *)node)->ReadLink(linkPath, sizeof(linkPath)); delete node; // we don't need this one anymore int fd = open_from(this, linkPath, O_RDONLY); if (fd >= 0) { node = get_node_from(fd); if (node != NULL) node->Acquire(); close(fd); return node; } return NULL; } return node; }
::Node* TarFS::Directory::Lookup(const char* name, bool traverseLinks) { TarFS::Entry* entry = LookupEntry(name); if (!entry) return NULL; Node* node = entry->ToNode(); if (traverseLinks) { if (S_ISLNK(node->Type())) { Symlink* symlink = static_cast<Symlink*>(node); int fd = open_from(this, symlink->LinkPath(), O_RDONLY); if (fd >= 0) { node = get_node_from(fd); close(fd); } } } if (node) node->Acquire(); return node; }
::Node* TarFS::Directory::LookupDontTraverse(const char* name) { TarFS::Entry* entry = LookupEntry(name); if (!entry) return NULL; Node* node = entry->ToNode(); if (node) node->Acquire(); return node; }