nfs4: Use ACCESS if server does not provide file mode

This commit is contained in:
Pawel Dziepak 2012-06-11 22:43:06 +02:00
parent e6e9b107de
commit d8a223873f

View File

@ -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;