// reiserfs_read static status_t reiserfs_read(fs_volume *fs, fs_vnode *_node, void *cookie, off_t pos, void *buffer, size_t *bufferSize) { TOUCH(fs); // FUNCTION_START(); // Volume *volume = (Volume*)fs->private_volume; VNode *node = (VNode*)_node->private_node; FUNCTION(("((%Ld: %lu, %lu), %Ld, %p, %lu)\n", node->GetID(), node->GetDirID(), node->GetObjectID(), pos, buffer, *bufferSize)); status_t error = B_OK; // don't read anything but files if (!node->IsFile()) { if (node->IsDir()) error = B_IS_A_DIRECTORY; else error = B_BAD_VALUE; } // read StreamReader *reader = (StreamReader*)cookie; if (error == B_OK) { error = reader->Resume(); if (error == B_OK) { error = reader->ReadAt(pos, buffer, *bufferSize, bufferSize); reader->Suspend(); } } RETURN_ERROR(error); }
// 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); }
// reiserfs_open_dir static status_t reiserfs_open_dir(fs_volume *fs, fs_vnode *_node, void **cookie) { // FUNCTION_START(); Volume *volume = (Volume*)fs->private_volume; VNode *node = (VNode*)_node->private_node; FUNCTION(("node: (%Ld: %lu, %lu)\n", node->GetID(), node->GetDirID(), node->GetObjectID())); status_t error = (node->IsDir() ? B_OK : B_NOT_A_DIRECTORY); if (error == B_OK) { DirectoryCookie *iterator = new(nothrow) DirectoryCookie( volume->GetTree(), node->GetDirID(), node->GetObjectID()); if (iterator) { error = iterator->Suspend(); if (error == B_OK) *cookie = iterator; else delete iterator; } else error = B_NO_MEMORY; } FUNCTION_END(); RETURN_ERROR(error); }