Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
::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;
}
Example #4
0
::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;
}