nfs4: Allow open() on directories

This commit is contained in:
Pawel Dziepak
2012-06-29 02:14:37 +02:00
parent 631d9e9867
commit b0368e77c9
@@ -150,12 +150,19 @@ nfs4_read_stat(fs_volume* volume, fs_vnode* vnode, struct stat* stat)
static status_t static status_t
nfs4_open(fs_volume* volume, fs_vnode* vnode, int openMode, void** _cookie) nfs4_open(fs_volume* volume, fs_vnode* vnode, int openMode, void** _cookie)
{ {
Inode* inode = reinterpret_cast<Inode*>(vnode->private_node);
if (inode->Type() == S_IFDIR) {
*_cookie = NULL;
return B_OK;
}
OpenFileCookie* cookie = new OpenFileCookie; OpenFileCookie* cookie = new OpenFileCookie;
if (cookie == NULL) if (cookie == NULL)
return B_NO_MEMORY; return B_NO_MEMORY;
*_cookie = cookie; *_cookie = cookie;
Inode* inode = reinterpret_cast<Inode*>(vnode->private_node);
status_t result = inode->Open(openMode, cookie); status_t result = inode->Open(openMode, cookie);
if (result != B_OK) if (result != B_OK)
delete cookie; delete cookie;
@@ -175,6 +182,10 @@ static status_t
nfs4_free_cookie(fs_volume* volume, fs_vnode* vnode, void* _cookie) nfs4_free_cookie(fs_volume* volume, fs_vnode* vnode, void* _cookie)
{ {
Inode* inode = reinterpret_cast<Inode*>(vnode->private_node); Inode* inode = reinterpret_cast<Inode*>(vnode->private_node);
if (inode->Type() == S_IFDIR)
return B_OK;
OpenFileCookie* cookie = reinterpret_cast<OpenFileCookie*>(_cookie); OpenFileCookie* cookie = reinterpret_cast<OpenFileCookie*>(_cookie);
inode->Close(cookie); inode->Close(cookie);
delete cookie; delete cookie;
@@ -188,6 +199,10 @@ nfs4_read(fs_volume* volume, fs_vnode* vnode, void* _cookie, off_t pos,
void* buffer, size_t* length) void* buffer, size_t* length)
{ {
Inode* inode = reinterpret_cast<Inode*>(vnode->private_node); Inode* inode = reinterpret_cast<Inode*>(vnode->private_node);
if (inode->Type() == S_IFDIR)
return B_IS_A_DIRECTORY;
OpenFileCookie* cookie = reinterpret_cast<OpenFileCookie*>(_cookie); OpenFileCookie* cookie = reinterpret_cast<OpenFileCookie*>(_cookie);
return inode->Read(cookie, pos, buffer, length); return inode->Read(cookie, pos, buffer, length);