From b82f4c07eba5dd04d1e2878ea79f47183d83c707 Mon Sep 17 00:00:00 2001 From: Pawel Dziepak Date: Sat, 26 May 2012 19:02:20 +0200 Subject: [PATCH] nfs4: Make RPC::Reply decode RPC errors --- .../kernel/file_systems/nfs4/RPCReply.cpp | 65 +++++++++++++++++-- 1 file changed, 59 insertions(+), 6 deletions(-) diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCReply.cpp b/src/add-ons/kernel/file_systems/nfs4/RPCReply.cpp index b09728a4e3..3dfa899069 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RPCReply.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/RPCReply.cpp @@ -14,6 +14,29 @@ using namespace RPC; +enum { + REPLY = 1 +}; + +enum { + MSG_ACCEPTED = 0, + MSG_DENIED = 1 +}; + +enum accept_stat { + SUCCESS = 0, /* RPC executed successfully */ + PROG_UNAVAIL = 1, /* remote hasn't exported program */ + PROG_MISMATCH = 2, /* remote can't support version # */ + PROC_UNAVAIL = 3, /* program can't support procedure */ + GARBAGE_ARGS = 4, /* procedure can't decode params */ + SYSTEM_ERR = 5 /* e.g. memory allocation failure */ +}; + +enum reject_stat { + RPC_MISMATCH = 0, /* RPC version number != 2 */ + AUTH_ERROR = 1 /* remote can't authenticate caller */ +}; + Reply::Reply(void *buffer, int size) : @@ -22,12 +45,42 @@ Reply::Reply(void *buffer, int size) fBuffer(buffer) { fXID = fStream.GetUInt(); -#if 0 - int32 type = fStream.GetInt(); - int32 state = fStream.GetInt(); - int32 auth = fStream.GetInt(); - fStream.GetOpaque(NULL); -#endif + if (fStream.GetInt() != REPLY) { + fError = B_BAD_VALUE; + return; + } + + if (fStream.GetInt() == MSG_ACCEPTED) { + fStream.GetInt(); + fStream.GetOpaque(NULL); + + switch (fStream.GetInt()) { + case SUCCESS: + return; + case PROG_UNAVAIL: + case PROG_MISMATCH: + case PROC_UNAVAIL: + fError = B_DEVICE_NOT_FOUND; + return; + case GARBAGE_ARGS: + fError = B_MISMATCHED_VALUES; + return; + case SYSTEM_ERR: + fError = B_ERROR; + return; + default: + fError = B_BAD_VALUE; + return; + } + } else { // MSG_DENIED + if (fStream.GetInt() == RPC_MISMATCH) { + fError = B_DEVICE_NOT_FOUND; + return; + } else { // AUTH_ERROR + fError = B_PERMISSION_DENIED; + return; + } + } }