1bf31ee39SPawel Dziepak /* 2bf31ee39SPawel Dziepak * Copyright 2012 Haiku, Inc. All rights reserved. 3bf31ee39SPawel Dziepak * Distributed under the terms of the MIT License. 4bf31ee39SPawel Dziepak * 5bf31ee39SPawel Dziepak * Authors: 6bf31ee39SPawel Dziepak * Paweł Dziepak, pdziepak@quarnos.org 7bf31ee39SPawel Dziepak */ 8bf31ee39SPawel Dziepak #ifndef INODE_H 9bf31ee39SPawel Dziepak #define INODE_H 10bf31ee39SPawel Dziepak 11bf31ee39SPawel Dziepak 12212de720SPawel Dziepak #include <sys/stat.h> 13212de720SPawel Dziepak 14bf31ee39SPawel Dziepak #include <SupportDefs.h> 15bf31ee39SPawel Dziepak 16bf31ee39SPawel Dziepak #include "Filesystem.h" 17bf31ee39SPawel Dziepak #include "NFS4Defs.h" 184b48348fSPawel Dziepak #include "ReplyInterpreter.h" 19bf31ee39SPawel Dziepak 20bf31ee39SPawel Dziepak 212a292557SPawel Dziepak struct OpenFileCookie { 226ee3ed0fSPawel Dziepak uint64 fClientId; 23d1e6b61eSPawel Dziepak 24d1e6b61eSPawel Dziepak uint32 fMode; 25d1e6b61eSPawel Dziepak 26d1e6b61eSPawel Dziepak Filehandle fHandle; 272a292557SPawel Dziepak uint32 fStateId[3]; 282a292557SPawel Dziepak uint32 fStateSeq; 29d1e6b61eSPawel Dziepak 30d1e6b61eSPawel Dziepak uint32 fOwnerTime; 31d1e6b61eSPawel Dziepak uint32 fOwnerTID; 32d1e6b61eSPawel Dziepak 33d1e6b61eSPawel Dziepak OpenFileCookie* fNext; 34d1e6b61eSPawel Dziepak OpenFileCookie* fPrev; 352a292557SPawel Dziepak }; 362a292557SPawel Dziepak 37bf31ee39SPawel Dziepak class Inode { 38bf31ee39SPawel Dziepak public: 390792abe0SPawel Dziepak static status_t CreateInode(Filesystem* fs, const FileInfo& fi, 400792abe0SPawel Dziepak Inode** inode); 4187c6b832SPawel Dziepak ~Inode(); 42bf31ee39SPawel Dziepak 43bf31ee39SPawel Dziepak inline ino_t ID() const; 44d38e98d8SPawel Dziepak inline mode_t Type() const; 4596b7b14aSPawel Dziepak inline const char* Name() const; 46bf31ee39SPawel Dziepak 477bfa4fe8SPawel Dziepak status_t LookUp(const char* name, ino_t* id); 48f2da914dSPawel Dziepak status_t ReadLink(void* buffer, size_t* length); 49631d9e98SPawel Dziepak status_t Access(int mode); 50212de720SPawel Dziepak status_t Stat(struct stat* st); 517bfa4fe8SPawel Dziepak 522a292557SPawel Dziepak status_t Open(int mode, OpenFileCookie* cookie); 5360a8140dSPawel Dziepak status_t Close(OpenFileCookie* cookie); 542f2e57d0SPawel Dziepak status_t Read(OpenFileCookie* cookie, off_t pos, 552f2e57d0SPawel Dziepak void* buffer, size_t* length); 562a292557SPawel Dziepak 57821f13b0SPawel Dziepak status_t OpenDir(uint64* cookie); 584b48348fSPawel Dziepak status_t ReadDir(void* buffer, uint32 size, 594b48348fSPawel Dziepak uint32* count, uint64* cookie); 60212de720SPawel Dziepak 61bf31ee39SPawel Dziepak private: 620792abe0SPawel Dziepak Inode(); 630792abe0SPawel Dziepak 64*c702f887SPawel Dziepak status_t _LookUpFilehandle(); 65*c702f887SPawel Dziepak 664b48348fSPawel Dziepak status_t _ReadDirOnce(DirEntry** dirents, uint32* count, 674b48348fSPawel Dziepak uint64* cookie, bool* eof); 684b48348fSPawel Dziepak status_t _FillDirEntry(struct dirent* de, ino_t id, 694b48348fSPawel Dziepak const char* name, uint32 pos, uint32 size); 70ed517d6cSPawel Dziepak status_t _ReadDirUp(struct dirent* de, uint32 pos, 71ed517d6cSPawel Dziepak uint32 size); 724b48348fSPawel Dziepak 734b48348fSPawel Dziepak static inline ino_t _FileIdToInoT(uint64 fileid); 744b48348fSPawel Dziepak 75bf31ee39SPawel Dziepak uint64 fFileId; 76d38e98d8SPawel Dziepak uint32 fType; 77bf31ee39SPawel Dziepak 78bf31ee39SPawel Dziepak Filehandle fHandle; 79bf31ee39SPawel Dziepak Filesystem* fFilesystem; 80ed517d6cSPawel Dziepak 8187c6b832SPawel Dziepak Filehandle fParentFH; 8287c6b832SPawel Dziepak const char* fName; 83*c702f887SPawel Dziepak 84*c702f887SPawel Dziepak const char* fPath; 85bf31ee39SPawel Dziepak }; 86bf31ee39SPawel Dziepak 87bf31ee39SPawel Dziepak 88bf31ee39SPawel Dziepak inline ino_t 894b48348fSPawel Dziepak Inode::_FileIdToInoT(uint64 fileid) 904b48348fSPawel Dziepak { 914b48348fSPawel Dziepak if (sizeof(ino_t) >= sizeof(uint64)) 924b48348fSPawel Dziepak return fileid; 934b48348fSPawel Dziepak else 944b48348fSPawel Dziepak return (ino_t)fileid ^ (fileid >> 954b48348fSPawel Dziepak (sizeof(uint64) - sizeof(ino_t)) * 8); 964b48348fSPawel Dziepak } 974b48348fSPawel Dziepak 984b48348fSPawel Dziepak 994b48348fSPawel Dziepak inline ino_t 100bf31ee39SPawel Dziepak Inode::ID() const 101bf31ee39SPawel Dziepak { 1024b48348fSPawel Dziepak return _FileIdToInoT(fFileId); 103bf31ee39SPawel Dziepak } 104bf31ee39SPawel Dziepak 105bf31ee39SPawel Dziepak 106d38e98d8SPawel Dziepak inline mode_t 107d38e98d8SPawel Dziepak Inode::Type() const 108d38e98d8SPawel Dziepak { 109d38e98d8SPawel Dziepak return sNFSFileTypeToHaiku[fType]; 110d38e98d8SPawel Dziepak } 111d38e98d8SPawel Dziepak 112d38e98d8SPawel Dziepak 11396b7b14aSPawel Dziepak inline const char* 11496b7b14aSPawel Dziepak Inode::Name() const 11596b7b14aSPawel Dziepak { 11696b7b14aSPawel Dziepak return fName; 11796b7b14aSPawel Dziepak } 11896b7b14aSPawel Dziepak 11996b7b14aSPawel Dziepak 120bf31ee39SPawel Dziepak #endif // INODE_H 121bf31ee39SPawel Dziepak 122