// reiserfs_lookup static status_t reiserfs_lookup(fs_volume* fs, fs_vnode* _dir, const char *entryName, ino_t *vnid) { // FUNCTION_START(); Volume *volume = (Volume*)fs->private_volume; VNode *dir = (VNode*)_dir->private_node; FUNCTION(("dir: (%Ld: %lu, %lu), entry: `%s'\n", dir->GetID(), dir->GetDirID(), dir->GetObjectID(), entryName)); status_t error = B_OK; VNode *entryNode = NULL; // check for non-directories if (!dir->IsDir()) { error = B_ENTRY_NOT_FOUND; // special entries: "." and ".." } else if (!strcmp(entryName, ".")) { *vnid = dir->GetID(); if (volume->GetVNode(*vnid, &entryNode) != B_OK) error = B_BAD_VALUE; } else if (!strcmp(entryName, "..")) { *vnid = dir->GetParentID(); if (volume->GetVNode(*vnid, &entryNode) != B_OK) error = B_BAD_VALUE; // ordinary entries } else { // find the entry VNode foundNode; error = volume->FindDirEntry(dir, entryName, &foundNode, true); // hide non-file/dir/symlink entries, if the user desires that, and // those entries explicitly set to hidden if (error == B_OK && ((foundNode.IsEsoteric() && volume->GetHideEsoteric()) || volume->IsNegativeEntry(foundNode.GetID()))) { error = B_ENTRY_NOT_FOUND; } if (error == B_OK) { *vnid = foundNode.GetID(); error = volume->GetVNode(*vnid, &entryNode); } } // add to the entry cache if (error == B_OK) { entry_cache_add(volume->GetID(), dir->GetID(), entryName, *vnid); } RETURN_ERROR(error); }