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 16be4c74eaSPawel Dziepak #include "Cookie.h" 1700a8558cSPawel Dziepak #include "FileSystem.h" 18bf31ee39SPawel Dziepak #include "NFS4Defs.h" 194b48348fSPawel Dziepak #include "ReplyInterpreter.h" 20bf31ee39SPawel Dziepak 21bf31ee39SPawel Dziepak 22bf31ee39SPawel Dziepak class Inode { 23bf31ee39SPawel Dziepak public: 2400a8558cSPawel Dziepak static status_t CreateInode(FileSystem* fs, const FileInfo& fi, 250792abe0SPawel Dziepak Inode** inode); 2687c6b832SPawel Dziepak ~Inode(); 27bf31ee39SPawel Dziepak 28bf31ee39SPawel Dziepak inline ino_t ID() const; 29d38e98d8SPawel Dziepak inline mode_t Type() const; 3096b7b14aSPawel Dziepak inline const char* Name() const; 3100a8558cSPawel Dziepak inline FileSystem* GetFileSystem() const; 32bf31ee39SPawel Dziepak 33*75fe7b90SPawel Dziepak status_t GetChangeInfo(uint64* change); 34*75fe7b90SPawel Dziepak 357bfa4fe8SPawel Dziepak status_t LookUp(const char* name, ino_t* id); 36f5baf2efSPawel Dziepak 37f5baf2efSPawel Dziepak status_t CreateLink(const char* name, const char* path, 38f5baf2efSPawel Dziepak int mode); 39f2da914dSPawel Dziepak status_t ReadLink(void* buffer, size_t* length); 40f5baf2efSPawel Dziepak 41c0de7acaSPawel Dziepak status_t Link(Inode* dir, const char* name); 42cf511f24SPawel Dziepak status_t Remove(const char* name, FileType type); 431ec6b0c1SPawel Dziepak static status_t Rename(Inode* from, Inode* to, 441ec6b0c1SPawel Dziepak const char* fromName, const char* toName); 45abba2fddSPawel Dziepak 46631d9e98SPawel Dziepak status_t Access(int mode); 47212de720SPawel Dziepak status_t Stat(struct stat* st); 48abba2fddSPawel Dziepak status_t WriteStat(const struct stat* st, uint32 mask); 497bfa4fe8SPawel Dziepak 5020bd3ee1SPawel Dziepak status_t Create(const char* name, int mode, int perms, 5120bd3ee1SPawel Dziepak OpenFileCookie* cookie, ino_t* id); 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); 56e36a5442SPawel Dziepak status_t Write(OpenFileCookie* cookie, off_t pos, 5786d2cab3SPawel Dziepak const void* buffer, size_t *_length); 582a292557SPawel Dziepak 5969adfb6dSPawel Dziepak status_t CreateDir(const char* name, int mode); 60be4c74eaSPawel Dziepak status_t OpenDir(OpenDirCookie* cookie); 614b48348fSPawel Dziepak status_t ReadDir(void* buffer, uint32 size, 62be4c74eaSPawel Dziepak uint32* count, OpenDirCookie* cookie); 63212de720SPawel Dziepak 647d0b8c97SPawel Dziepak status_t TestLock(OpenFileCookie* cookie, 657d0b8c97SPawel Dziepak struct flock* lock); 667d0b8c97SPawel Dziepak status_t AcquireLock(OpenFileCookie* cookie, 677d0b8c97SPawel Dziepak const struct flock* lock, bool wait); 687d0b8c97SPawel Dziepak status_t ReleaseLock(OpenFileCookie* cookie, 697d0b8c97SPawel Dziepak const struct flock* lock); 707d0b8c97SPawel Dziepak status_t ReleaseAllLocks(OpenFileCookie* cookie); 717d0b8c97SPawel Dziepak 727d0b8c97SPawel Dziepak 732f03ff09SPawel Dziepak protected: 740792abe0SPawel Dziepak Inode(); 750792abe0SPawel Dziepak 7607f2e2d2SPawel Dziepak bool _HandleErrors(uint32 nfs4Error, 7707f2e2d2SPawel Dziepak RPC::Server* serv, 7807f2e2d2SPawel Dziepak OpenFileCookie* cookie = NULL); 79c702f887SPawel Dziepak 8000a8558cSPawel Dziepak status_t _ConfirmOpen(const FileHandle& fh, 810f4dcd8bSPawel Dziepak OpenFileCookie* cookie); 822a73e4c5SPawel Dziepak 834b48348fSPawel Dziepak status_t _ReadDirOnce(DirEntry** dirents, uint32* count, 84be4c74eaSPawel Dziepak OpenDirCookie* cookie, bool* eof); 854b48348fSPawel Dziepak status_t _FillDirEntry(struct dirent* de, ino_t id, 864b48348fSPawel Dziepak const char* name, uint32 pos, uint32 size); 87ed517d6cSPawel Dziepak status_t _ReadDirUp(struct dirent* de, uint32 pos, 88ed517d6cSPawel Dziepak uint32 size); 894b48348fSPawel Dziepak 9089f05134SPawel Dziepak static inline status_t _CheckLockType(short ltype, uint32 mode); 9189f05134SPawel Dziepak 924b48348fSPawel Dziepak static inline ino_t _FileIdToInoT(uint64 fileid); 934b48348fSPawel Dziepak 9478fc85a6SPawel Dziepak struct stat fAttrCache; 9578fc85a6SPawel Dziepak mutex fAttrCacheLock; 9678fc85a6SPawel Dziepak time_t fAttrCacheExpire; 9778fc85a6SPawel Dziepak static const time_t kAttrCacheExpirationTime = 60; 9878fc85a6SPawel Dziepak status_t _UpdateAttrCache(bool force = false); 9978fc85a6SPawel Dziepak 100d38e98d8SPawel Dziepak uint32 fType; 101bf31ee39SPawel Dziepak 102a28e8732SPawel Dziepak FileInfo fInfo; 10300a8558cSPawel Dziepak FileSystem* fFileSystem; 104*75fe7b90SPawel Dziepak 105*75fe7b90SPawel Dziepak DirectoryCache* fCache; 106bf31ee39SPawel Dziepak }; 107bf31ee39SPawel Dziepak 108bf31ee39SPawel Dziepak 109bf31ee39SPawel Dziepak inline ino_t 1104b48348fSPawel Dziepak Inode::_FileIdToInoT(uint64 fileid) 1114b48348fSPawel Dziepak { 1124b48348fSPawel Dziepak if (sizeof(ino_t) >= sizeof(uint64)) 1134b48348fSPawel Dziepak return fileid; 1144b48348fSPawel Dziepak else 1154b48348fSPawel Dziepak return (ino_t)fileid ^ (fileid >> 1164b48348fSPawel Dziepak (sizeof(uint64) - sizeof(ino_t)) * 8); 1174b48348fSPawel Dziepak } 1184b48348fSPawel Dziepak 1194b48348fSPawel Dziepak 1204b48348fSPawel Dziepak inline ino_t 121bf31ee39SPawel Dziepak Inode::ID() const 122bf31ee39SPawel Dziepak { 123a28e8732SPawel Dziepak return _FileIdToInoT(fInfo.fFileId); 124bf31ee39SPawel Dziepak } 125bf31ee39SPawel Dziepak 126bf31ee39SPawel Dziepak 127d38e98d8SPawel Dziepak inline mode_t 128d38e98d8SPawel Dziepak Inode::Type() const 129d38e98d8SPawel Dziepak { 130d38e98d8SPawel Dziepak return sNFSFileTypeToHaiku[fType]; 131d38e98d8SPawel Dziepak } 132d38e98d8SPawel Dziepak 133d38e98d8SPawel Dziepak 13496b7b14aSPawel Dziepak inline const char* 13596b7b14aSPawel Dziepak Inode::Name() const 13696b7b14aSPawel Dziepak { 137a28e8732SPawel Dziepak return fInfo.fName; 13896b7b14aSPawel Dziepak } 13996b7b14aSPawel Dziepak 14096b7b14aSPawel Dziepak 14100a8558cSPawel Dziepak inline FileSystem* 14200a8558cSPawel Dziepak Inode::GetFileSystem() const 143be4c74eaSPawel Dziepak { 14400a8558cSPawel Dziepak return fFileSystem; 145be4c74eaSPawel Dziepak } 146be4c74eaSPawel Dziepak 147be4c74eaSPawel Dziepak 148bf31ee39SPawel Dziepak #endif // INODE_H 149bf31ee39SPawel Dziepak 150