From d8a223873f9743816a10660c41da8a3e05c74191 Mon Sep 17 00:00:00 2001 From: Pawel Dziepak Date: Mon, 11 Jun 2012 22:43:06 +0200 Subject: [PATCH] nfs4: Use ACCESS if server does not provide file mode --- .../kernel/file_systems/nfs4/Inode.cpp | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp index c0d44ea169..6d7af636ae 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp @@ -223,14 +223,40 @@ Inode::Stat(struct stat* st) if (count >= next && values[next].fAttribute == FATTR4_MODE) { st->st_mode |= values[next].fData.fValue32; next++; + } else { + // Try to guess using ACCESS request + request.Reset(); + request.Builder().PutFH(fHandle); + request.Builder().Access(); + result = request.Send(); + if (result != B_OK) + return result; + result = request.Reply().PutFH(); + if (result != B_OK) + return result; + uint32 prvl; + result = request.Reply().Access(NULL, &prvl); + if (result != B_OK) + return result; + + if ((prvl & ACCESS4_READ) != 0) + st->st_mode |= S_IRUSR | S_IRGRP | S_IROTH; + + if ((prvl & ACCESS4_MODIFY) != 0) + st->st_mode |= S_IWUSR | S_IWGRP | S_IWOTH; + + if (fType == NF4DIR && (prvl & ACCESS4_LOOKUP) != 0) + st->st_mode |= S_IXUSR | S_IXGRP | S_IXOTH; + + if (fType != NF4DIR && (prvl & ACCESS4_EXECUTE) != 0) + st->st_mode |= S_IXUSR | S_IXGRP | S_IXOTH; } - // TODO: else: get some info from ACCESS if (count >= next && values[next].fAttribute == FATTR4_NUMLINKS) { st->st_nlink = values[next].fData.fValue32; next++; } else - st->st_nlink = 1; // TODO: if !link_support we dont have to ask + st->st_nlink = 1; st->st_uid = 0; st->st_gid = 0;