nfs4: Add open_dir, close_dir and free_dir_cookie hooks

This commit is contained in:
Pawel Dziepak
2012-06-29 02:14:24 +02:00
parent c1a7ba322d
commit 821f13b077
3 changed files with 83 additions and 0 deletions
@@ -107,3 +107,34 @@ Inode::Stat(struct stat* st)
return B_OK; return B_OK;
} }
status_t
Inode::OpenDir(uint64* cookie)
{
if (fType != NF4DIR)
return B_NOT_A_DIRECTORY;
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;
if (allowed & ACCESS4_READ != ACCESS4_READ)
return B_PERMISSION_DENIED;
return B_OK;
}
@@ -25,6 +25,7 @@ public:
inline mode_t Type() const; inline mode_t Type() const;
status_t Stat(struct stat* st); status_t Stat(struct stat* st);
status_t OpenDir(uint64* cookie);
private: private:
uint64 fFileId; uint64 fFileId;
@@ -95,6 +95,38 @@ nfs4_read_stat(fs_volume* volume, fs_vnode* vnode, struct stat* stat)
} }
static status_t
nfs4_open_dir(fs_volume* volume, fs_vnode* vnode, void** _cookie)
{
uint64* cookie = new(std::nothrow) uint64;
if (cookie == NULL)
return B_NO_MEMORY;
*_cookie = cookie;
Inode* inode = reinterpret_cast<Inode*>(vnode->private_node);
status_t result = inode->OpenDir(cookie);
if (result != B_OK)
delete cookie;
return result;
}
static status_t
nfs4_close_dir(fs_volume* volume, fs_vnode* vnode, void* cookie)
{
return B_OK;
}
static status_t
nfs4_free_dir_cookie(fs_volume* volume, fs_vnode* vnode, void* cookie)
{
delete reinterpret_cast<uint64*>(cookie);
return B_OK;
}
status_t status_t
nfs4_init() nfs4_init()
{ {
@@ -174,6 +206,25 @@ fs_vnode_ops gNFSv4VnodeOps = {
NULL, // access() NULL, // access()
&nfs4_read_stat, &nfs4_read_stat,
NULL, // write_stat()
NULL, // fs_preallocate()
/* file operations */
NULL, // create()
NULL, // open()
NULL, // close()
NULL, // free_cookie()
NULL, // read()
NULL, // write,
/* directory operations */
NULL, // create_dir()
NULL, // remove_dir()
nfs4_open_dir,
nfs4_close_dir,
nfs4_free_dir_cookie,
NULL, // read_dir()
NULL, // rewind_dir,
}; };
static file_system_module_info sNFSv4ModuleInfo = { static file_system_module_info sNFSv4ModuleInfo = {