From 04ea36797580e7555762c4835717682ef7c3415b Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Thu, 23 Jun 2011 17:37:44 +0200 Subject: [PATCH] Remove kernel_interface.cpp LeafNode dependency Introduce abstract virtual Node::ReadSymlink() method that is now used in packagefs_read_symlink() instead of casting to LeafNode. --- .../file_systems/packagefs/Directory.cpp | 9 ++++++- .../kernel/file_systems/packagefs/Directory.h | 5 +++- .../file_systems/packagefs/LeafNode.cpp | 27 ++++++++++++++++++- .../kernel/file_systems/packagefs/LeafNode.h | 5 +++- .../kernel/file_systems/packagefs/Node.h | 5 +++- .../packagefs/kernel_interface.cpp | 13 +-------- 6 files changed, 47 insertions(+), 17 deletions(-) diff --git a/src/add-ons/kernel/file_systems/packagefs/Directory.cpp b/src/add-ons/kernel/file_systems/packagefs/Directory.cpp index e047223bde..663afeb52a 100644 --- a/src/add-ons/kernel/file_systems/packagefs/Directory.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/Directory.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. + * Copyright 2009-2011, Ingo Weinhold, ingo_weinhold@gmx.de. * Distributed under the terms of the MIT License. */ @@ -164,6 +164,13 @@ Directory::Read(io_request* request) } +status_t +Directory::ReadSymlink(void* buffer, size_t* bufferSize) +{ + return B_IS_A_DIRECTORY; +} + + void Directory::AddChild(Node* node) { diff --git a/src/add-ons/kernel/file_systems/packagefs/Directory.h b/src/add-ons/kernel/file_systems/packagefs/Directory.h index 099fd74325..95c56dd9c9 100644 --- a/src/add-ons/kernel/file_systems/packagefs/Directory.h +++ b/src/add-ons/kernel/file_systems/packagefs/Directory.h @@ -1,5 +1,5 @@ /* - * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. + * Copyright 2009-2011, Ingo Weinhold, ingo_weinhold@gmx.de. * Distributed under the terms of the MIT License. */ #ifndef DIRECTORY_H @@ -48,6 +48,9 @@ public: size_t* bufferSize); virtual status_t Read(io_request* request); + virtual status_t ReadSymlink(void* buffer, + size_t* bufferSize); + void AddChild(Node* node); void RemoveChild(Node* node); Node* FindChild(const char* name); diff --git a/src/add-ons/kernel/file_systems/packagefs/LeafNode.cpp b/src/add-ons/kernel/file_systems/packagefs/LeafNode.cpp index 43804d67d2..382441d420 100644 --- a/src/add-ons/kernel/file_systems/packagefs/LeafNode.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/LeafNode.cpp @@ -1,11 +1,15 @@ /* - * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. + * Copyright 2009-2011, Ingo Weinhold, ingo_weinhold@gmx.de. * Distributed under the terms of the MIT License. */ #include "LeafNode.h" +#include + +#include + #include "Utils.h" @@ -168,6 +172,27 @@ LeafNode::Read(io_request* request) } +status_t +LeafNode::ReadSymlink(void* buffer, size_t* bufferSize) +{ + PackageLeafNode* packageNode = fPackageNodes.Head(); + if (packageNode == NULL) + return B_BAD_VALUE; + + const char* linkPath = packageNode->SymlinkPath(); + if (linkPath == NULL) { + *bufferSize = 0; + return B_OK; + } + + size_t toCopy = std::min(strlen(linkPath), *bufferSize); + memcpy(buffer, linkPath, toCopy); + *bufferSize = toCopy; + + return B_OK; +} + + const char* LeafNode::SymlinkPath() const { diff --git a/src/add-ons/kernel/file_systems/packagefs/LeafNode.h b/src/add-ons/kernel/file_systems/packagefs/LeafNode.h index d680e19273..2d3b403ec2 100644 --- a/src/add-ons/kernel/file_systems/packagefs/LeafNode.h +++ b/src/add-ons/kernel/file_systems/packagefs/LeafNode.h @@ -1,5 +1,5 @@ /* - * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. + * Copyright 2009-2011, Ingo Weinhold, ingo_weinhold@gmx.de. * Distributed under the terms of the MIT License. */ #ifndef LEAF_NODE_H @@ -35,6 +35,9 @@ public: size_t* bufferSize); virtual status_t Read(io_request* request); + virtual status_t ReadSymlink(void* buffer, + size_t* bufferSize); + const char* SymlinkPath() const; private: diff --git a/src/add-ons/kernel/file_systems/packagefs/Node.h b/src/add-ons/kernel/file_systems/packagefs/Node.h index f02d9f05b1..f2ec3576f2 100644 --- a/src/add-ons/kernel/file_systems/packagefs/Node.h +++ b/src/add-ons/kernel/file_systems/packagefs/Node.h @@ -1,5 +1,5 @@ /* - * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. + * Copyright 2009-2011, Ingo Weinhold, ingo_weinhold@gmx.de. * Distributed under the terms of the MIT License. */ #ifndef NODE_H @@ -60,6 +60,9 @@ public: size_t* bufferSize) = 0; virtual status_t Read(io_request* request) = 0; + virtual status_t ReadSymlink(void* buffer, + size_t* bufferSize) = 0; + protected: rw_lock fLock; ino_t fID; diff --git a/src/add-ons/kernel/file_systems/packagefs/kernel_interface.cpp b/src/add-ons/kernel/file_systems/packagefs/kernel_interface.cpp index c2c6c93636..7868d0ea57 100644 --- a/src/add-ons/kernel/file_systems/packagefs/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/kernel_interface.cpp @@ -21,7 +21,6 @@ #include "DebugSupport.h" #include "Directory.h" #include "GlobalFactory.h" -#include "LeafNode.h" #include "PackageFSRoot.h" #include "Volume.h" @@ -315,17 +314,7 @@ packagefs_read_symlink(fs_volume* fsVolume, fs_vnode* fsNode, char* buffer, if (!S_ISLNK(node->Mode())) return B_BAD_VALUE; - const char* linkPath = dynamic_cast(node)->SymlinkPath(); - if (linkPath == NULL) { - *_bufferSize = 0; - return B_OK; - } - - size_t toCopy = std::min(strlen(linkPath), *_bufferSize); - memcpy(buffer, linkPath, toCopy); - *_bufferSize = toCopy; - - return B_OK; + return node->ReadSymlink(buffer, _bufferSize); }