From 631d9e9867f037d35944f4fce87fdfef5f63e4da Mon Sep 17 00:00:00 2001 From: Pawel Dziepak Date: Wed, 6 Jun 2012 00:58:23 +0200 Subject: [PATCH] nfs4: Add access() hook --- .../kernel/file_systems/nfs4/Inode.cpp | 41 +++++++++++++++++++ src/add-ons/kernel/file_systems/nfs4/Inode.h | 1 + .../file_systems/nfs4/kernel_interface.cpp | 10 ++++- 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp index c3ee82e332..4b0981f067 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp @@ -132,6 +132,47 @@ Inode::LookUp(const char* name, ino_t* id) } +status_t +Inode::Access(int mode) +{ + RequestBuilder req(ProcCompound); + req.PutFH(fHandle); + req.Access(); + + RPC::Reply *rpl; + fFilesystem->Server()->SendCall(req.Request(), &rpl); + ReplyInterpreter reply(rpl); + + status_t result; + result = reply.PutFH(); + if (result != B_OK) + return result; + + uint32 allowed; + result = reply.Access(NULL, &allowed); + if (result != B_OK) + return result; + + int acc = 0; + if ((allowed & ACCESS4_READ) != 0) + acc |= R_OK; + + if (fType == NF4DIR && (allowed & ACCESS4_LOOKUP) != 0) + acc |= X_OK | R_OK; + + if (fType != NF4DIR && (allowed & ACCESS4_EXECUTE) != 0) + acc |= X_OK; + + if ((allowed & ACCESS4_MODIFY) != 0) + acc |= W_OK; + + if ((mode & acc) != mode) + return B_NOT_ALLOWED; + + return B_OK; +} + + status_t Inode::Stat(struct stat* st) { diff --git a/src/add-ons/kernel/file_systems/nfs4/Inode.h b/src/add-ons/kernel/file_systems/nfs4/Inode.h index 46959870ba..6813ed46ac 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Inode.h +++ b/src/add-ons/kernel/file_systems/nfs4/Inode.h @@ -34,6 +34,7 @@ public: inline const char* Name() const; status_t LookUp(const char* name, ino_t* id); + status_t Access(int mode); status_t Stat(struct stat* st); status_t Open(int mode, OpenFileCookie* cookie); diff --git a/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp b/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp index bcb3bbb382..d0180fb404 100644 --- a/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp @@ -131,6 +131,14 @@ nfs4_put_vnode(fs_volume* volume, fs_vnode* vnode, bool reenter) } +static status_t +nfs4_access(fs_volume* volume, fs_vnode* vnode, int mode) +{ + Inode* inode = reinterpret_cast(vnode->private_node); + return inode->Access(mode); +} + + static status_t nfs4_read_stat(fs_volume* volume, fs_vnode* vnode, struct stat* stat) { @@ -312,7 +320,7 @@ fs_vnode_ops gNFSv4VnodeOps = { NULL, // unlink() NULL, // rename() - NULL, // access() + nfs4_access, nfs4_read_stat, NULL, // write_stat() NULL, // fs_preallocate()