1/* 2 * Copyright 2012 Haiku, Inc. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Pawe�� Dziepak, pdziepak@quarnos.org 7 */ 8#ifndef REPLYINTERPRETER_H 9#define REPLYINTERPRETER_H 10 11 12#include <SupportDefs.h> 13 14#include "FileInfo.h" 15#include "NFS4Defs.h" 16#include "RPCReply.h" 17 18 19struct FSLocation { 20 const char** fRootPath; 21 22 const char** fLocations; 23 uint32 fCount; 24 25 ~FSLocation(); 26}; 27 28struct FSLocations { 29 const char** fRootPath; 30 31 FSLocation* fLocations; 32 uint32 fCount; 33 34 ~FSLocations(); 35}; 36 37struct AttrValue { 38 AttrValue(); 39 ~AttrValue(); 40 41 uint8 fAttribute; 42 bool fFreePointer; 43 union { 44 uint32 fValue32; 45 uint64 fValue64; 46 void* fPointer; 47 FSLocations* fLocations; 48 } fData; 49}; 50 51struct DirEntry { 52 const char* fName; 53 AttrValue* fAttrs; 54 uint32 fAttrCount; 55 56 DirEntry(); 57 ~DirEntry(); 58}; 59 60struct LockInfo; 61 62class ReplyInterpreter { 63public: 64 ReplyInterpreter(RPC::Reply* reply = NULL); 65 ~ReplyInterpreter(); 66 67 inline status_t SetTo(RPC::Reply* reply); 68 inline void Reset(); 69 70 inline uint32 NFS4Error(); 71 72 status_t Access(uint32* supported, uint32* allowed); 73 status_t Close(); 74 status_t Commit(); 75 status_t Create(uint64* before, uint64* after, bool& atomic); 76 inline status_t DelegReturn(); 77 status_t GetAttr(AttrValue** attrs, uint32* count); 78 status_t GetFH(FileHandle* fh); 79 status_t Link(uint64* before, uint64* after, bool& atomic); 80 status_t Lock(LockInfo* linfo); 81 status_t LockT(uint64* pos, uint64* len, LockType* type); 82 status_t LockU(LockInfo* linfo); 83 inline status_t LookUp(); 84 inline status_t LookUpUp(); 85 inline status_t Nverify(); 86 status_t Open(uint32* id, uint32* seq, bool* confirm, 87 OpenDelegationData* delegData, 88 ChangeInfo* changeInfo = NULL); 89 inline status_t OpenAttrDir(); 90 status_t OpenConfirm(uint32* stateSeq); 91 inline status_t PutFH(); 92 inline status_t PutRootFH(); 93 status_t Read(void* buffer, uint32* size, bool* eof); 94 status_t ReadDir(uint64* cookie, uint64* cookieVerf, 95 DirEntry** dirents, uint32* count, bool* eof); 96 status_t ReadLink(void* buffer, uint32* size, uint32 maxSize); 97 status_t Remove(uint64* before, uint64* after, bool& atomic); 98 status_t Rename(uint64* fromBefore, uint64* fromAfter, 99 bool& fromAtomic, uint64* toBefore, uint64* toAfter, 100 bool& toAtomic); 101 inline status_t Renew(); 102 inline status_t SaveFH(); 103 status_t SetAttr(); 104 status_t SetClientID(uint64* clientid, uint64* verifier); 105 inline status_t SetClientIDConfirm(); 106 inline status_t Verify(); 107 status_t Write(uint32* size); 108 inline status_t ReleaseLockOwner(); 109 110private: 111 void _ParseHeader(); 112 113 static const char** _GetPath(XDR::ReadStream& stream); 114 115 status_t _DecodeAttrs(XDR::ReadStream& stream, AttrValue** attrs, 116 uint32* count); 117 status_t _OperationError(Opcode op); 118 119 static status_t _NFS4ErrorToHaiku(uint32 x); 120 121 uint32 fNFS4Error; 122 bool fDecodeError; 123 RPC::Reply* fReply; 124}; 125 126 127inline status_t 128ReplyInterpreter::SetTo(RPC::Reply* _reply) 129{ 130 if (fReply != NULL) 131 return B_DONT_DO_THAT; 132 133 fDecodeError = false; 134 fReply = _reply; 135 136 if (fReply != NULL) 137 _ParseHeader(); 138 139 return B_OK; 140} 141 142 143inline void 144ReplyInterpreter::Reset() 145{ 146 delete fReply; 147 fReply = NULL; 148 fDecodeError = false; 149} 150 151 152inline uint32 153ReplyInterpreter::NFS4Error() 154{ 155 return fNFS4Error; 156} 157 158 159inline status_t 160ReplyInterpreter::DelegReturn() 161{ 162 return _OperationError(OpDelegReturn); 163} 164 165 166inline status_t 167ReplyInterpreter::LookUp() 168{ 169 return _OperationError(OpLookUp); 170} 171 172 173inline status_t 174ReplyInterpreter::LookUpUp() 175{ 176 return _OperationError(OpLookUpUp); 177} 178 179 180inline status_t 181ReplyInterpreter::OpenAttrDir() 182{ 183 return _OperationError(OpOpenAttrDir); 184} 185 186 187inline status_t 188ReplyInterpreter::Nverify() 189{ 190 return _OperationError(OpNverify); 191} 192 193 194inline status_t 195ReplyInterpreter::PutFH() 196{ 197 return _OperationError(OpPutFH); 198} 199 200 201inline status_t 202ReplyInterpreter::PutRootFH() 203{ 204 return _OperationError(OpPutRootFH); 205} 206 207 208inline status_t 209ReplyInterpreter::Renew() 210{ 211 return _OperationError(OpRenew); 212} 213 214 215inline status_t 216ReplyInterpreter::SaveFH() 217{ 218 return _OperationError(OpSaveFH); 219} 220 221 222inline status_t 223ReplyInterpreter::SetClientIDConfirm() 224{ 225 return _OperationError(OpSetClientIDConfirm); 226} 227 228 229inline status_t 230ReplyInterpreter::Verify() 231{ 232 return _OperationError(OpVerify); 233} 234 235 236inline status_t 237ReplyInterpreter::ReleaseLockOwner() 238{ 239 return _OperationError(OpReleaseLockOwner); 240} 241 242 243#endif // REPLYINTERPRETER_H 244 245