diff --git a/src/add-ons/kernel/file_systems/nfs4/Jamfile b/src/add-ons/kernel/file_systems/nfs4/Jamfile index abe0a46688..b6aeed821e 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Jamfile +++ b/src/add-ons/kernel/file_systems/nfs4/Jamfile @@ -27,6 +27,7 @@ KernelAddon nfs4 : RPCAuth.cpp RPCCall.cpp RPCCallback.cpp + RPCCallbackReply.cpp RPCCallbackRequest.cpp RPCCallbackServer.cpp RPCReply.cpp diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCAuth.cpp b/src/add-ons/kernel/file_systems/nfs4/RPCAuth.cpp index e9ce2aa365..b10f2abba0 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RPCAuth.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/RPCAuth.cpp @@ -16,6 +16,8 @@ #include #include +#include "RPCDefs.h" + using namespace RPC; diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCAuth.h b/src/add-ons/kernel/file_systems/nfs4/RPCAuth.h index 81a127f3ab..d45a7cf460 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RPCAuth.h +++ b/src/add-ons/kernel/file_systems/nfs4/RPCAuth.h @@ -14,11 +14,6 @@ namespace RPC { -enum auth_flavour { - AUTH_NONE = 0, - AUTH_SYS = 1 -}; - class Auth { public: inline const XDR::WriteStream& Stream() const; diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCCall.cpp b/src/add-ons/kernel/file_systems/nfs4/RPCCall.cpp index 323e7f1f2e..fcc3124803 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RPCCall.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/RPCCall.cpp @@ -11,21 +11,11 @@ #include +#include "RPCDefs.h" + using namespace RPC; -enum { - CALL = 0 -}; - -#define VERSION 2 - -enum { - PROGRAM_NFS = 100003 -}; - -#define NFS_VERSION 4 - Call::Call() { diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackReply.cpp b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackReply.cpp new file mode 100644 index 0000000000..595bb0989f --- /dev/null +++ b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackReply.cpp @@ -0,0 +1,49 @@ +/* + * Copyright 2012 Haiku, Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Paweł Dziepak, pdziepak@quarnos.org + */ + + +#include "RPCCallbackReply.h" + +#include + +#include "RPCDefs.h" + + +using namespace RPC; + + +CallbackReply::CallbackReply() +{ +} + + +CallbackReply* +CallbackReply::Create(uint32 xid, AcceptStat rpcError) +{ + CallbackReply* reply = new(std::nothrow) CallbackReply; + if (reply == NULL) + return NULL; + + reply->fStream.AddUInt(xid); + + reply->fStream.AddInt(REPLY); + reply->fStream.AddUInt(MSG_ACCEPTED); + + reply->fStream.AddInt(AUTH_NONE); + reply->fStream.AddOpaque(NULL, 0); + + reply->fStream.AddUInt(rpcError); + + return reply; +} + + +CallbackReply::~CallbackReply() +{ +} + diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackReply.h b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackReply.h new file mode 100644 index 0000000000..485d5fa8a8 --- /dev/null +++ b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackReply.h @@ -0,0 +1,42 @@ +/* + * Copyright 2012 Haiku, Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Paweł Dziepak, pdziepak@quarnos.org + */ +#ifndef RPCCALLBACKREPLY_H +#define RPCCALLBACKREPLY_H + + +#include "RPCDefs.h" +#include "XDR.h" + + +namespace RPC { + +class CallbackReply { +public: + static CallbackReply* Create(uint32 xid, + AcceptStat rpcError = SUCCESS); + ~CallbackReply(); + + inline XDR::WriteStream& Stream(); + +private: + CallbackReply(); + + XDR::WriteStream fStream; +}; + + +inline XDR::WriteStream& +CallbackReply::Stream() +{ + return fStream; +} + +} // namespace RPC + + +#endif // RPCCALLBACKREPLY_H diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.cpp b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.cpp index c4841127ad..4b10efb928 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.cpp @@ -12,26 +12,16 @@ #include #include "NFS4Defs.h" +#include "RPCDefs.h" using namespace RPC; -enum { - CALL = 0 -}; - -#define VERSION 2 - -enum { - PROGRAM_NFS_CB = 0x40000000 -}; - -#define NFS_CB_VERSION 1 - CallbackRequest::CallbackRequest(void *buffer, int size) : fError(B_BAD_VALUE), + fRPCError(GARBAGE_ARGS), fStream(buffer, size), fBuffer(buffer) { @@ -43,11 +33,15 @@ CallbackRequest::CallbackRequest(void *buffer, int size) if (fStream.GetUInt() != VERSION) return; - if (fStream.GetUInt() != PROGRAM_NFS_CB) + if (fStream.GetUInt() != PROGRAM_NFS_CB) { + fRPCError = PROG_UNAVAIL; return; + } - if (fStream.GetUInt() != NFS_CB_VERSION) + if (fStream.GetUInt() != NFS_CB_VERSION) { + fRPCError = PROG_MISMATCH; return; + } fProcedure = fStream.GetUInt(); @@ -60,9 +54,11 @@ CallbackRequest::CallbackRequest(void *buffer, int size) return; fID = fStream.GetUInt(); - } - - fError = B_OK; + } else if (fProcedure == CallbackProcNull) { + fRPCError = SUCCESS; + fError = B_OK; + } else + fRPCError = PROC_UNAVAIL; } diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.h b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.h index 28b822e234..01518f3b6c 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.h +++ b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.h @@ -9,6 +9,7 @@ #define RPCCALLBACKREQUEST_H +#include "RPCDefs.h" #include "XDR.h" @@ -25,6 +26,8 @@ public: inline uint32 Procedure(); inline status_t Error(); + inline AcceptStat RPCError(); + inline XDR::ReadStream& Stream(); private: @@ -34,6 +37,7 @@ private: uint32 fProcedure; status_t fError; + AcceptStat fRPCError; XDR::ReadStream fStream; void* fBuffer; @@ -68,6 +72,13 @@ CallbackRequest::Error() } +inline AcceptStat +CallbackRequest::RPCError() +{ + return fRPCError; +} + + inline XDR::ReadStream& CallbackRequest::Stream() { diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackServer.cpp b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackServer.cpp index 5ff83f6ffc..651ccc5426 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackServer.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackServer.cpp @@ -11,6 +11,7 @@ #include "NFS4Defs.h" #include "RPCCallback.h" +#include "RPCCallbackReply.h" #include "RPCCallbackRequest.h" @@ -224,6 +225,7 @@ status_t CallbackServer::ConnectionThread(ConnectionEntry* entry) { Connection* connection = entry->fConnection; + CallbackReply* reply; while (fThreadRunning) { uint32 size; @@ -238,15 +240,30 @@ CallbackServer::ConnectionThread(ConnectionEntry* entry) if (request == NULL || request->Error() != B_OK) { free(buffer); continue; + } else if (request != NULL) { + reply = CallbackReply::Create(request->XID(), request->RPCError()); + if (reply != NULL) { + connection->Send(reply->Stream().Buffer(), + reply->Stream().Size()); + delete reply; + } + free(buffer); + continue; } + switch (request->Procedure()) { case CallbackProcCompound: GetCallback(request->ID())->EnqueueRequest(request, connection); break; case CallbackProcNull: - dprintf("GOT CB_NULL %x\n", (int)request->XID()); + reply = CallbackReply::Create(request->XID()); + if (reply != NULL) { + connection->Send(reply->Stream().Buffer(), + reply->Stream().Size()); + delete reply; + } default: free(buffer); diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCDefs.h b/src/add-ons/kernel/file_systems/nfs4/RPCDefs.h new file mode 100644 index 0000000000..bd551a69b5 --- /dev/null +++ b/src/add-ons/kernel/file_systems/nfs4/RPCDefs.h @@ -0,0 +1,61 @@ +/* + * Copyright 2012 Haiku, Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Paweł Dziepak, pdziepak@quarnos.org + */ +#ifndef RPCDEFS_H +#define RPCDEFS_H + + +namespace RPC { + +enum { + VERSION = 2 +}; + +enum { + PROGRAM_NFS = 100003, + PROGRAM_NFS_CB = 0x40000000 +}; + +enum { + NFS_VERSION = 4, + NFS_CB_VERSION = 1 +}; + +enum { + CALL = 0, + REPLY = 1 +}; + +enum { + MSG_ACCEPTED = 0, + MSG_DENIED = 1 +}; + +enum AcceptStat { + 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 RejectStat { + RPC_MISMATCH = 0, /* RPC version number != 2 */ + AUTH_ERROR = 1 /* remote can't authenticate caller */ +}; + +enum AuthFlavour { + AUTH_NONE = 0, + AUTH_SYS = 1 +}; + +} // namespace RPC + + +#endif // RPCDEFS_H + diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCReply.cpp b/src/add-ons/kernel/file_systems/nfs4/RPCReply.cpp index 3dfa899069..3f61357e09 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RPCReply.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/RPCReply.cpp @@ -11,32 +11,11 @@ #include +#include "RPCDefs.h" + 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) :