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" 17bf31ee39SPawel 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: 240792abe0SPawel 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; 31be4c74eaSPawel Dziepak inline Filesystem* FileSystem() const; 32bf31ee39SPawel Dziepak 337bfa4fe8SPawel Dziepak status_t LookUp(const char* name, ino_t* id); 34*f5baf2efSPawel Dziepak 35*f5baf2efSPawel Dziepak status_t CreateLink(const char* name, const char* path, 36*f5baf2efSPawel Dziepak int mode); 37f2da914dSPawel Dziepak status_t ReadLink(void* buffer, size_t* length); 38*f5baf2efSPawel Dziepak 39c0de7acaSPawel Dziepak status_t Link(Inode* dir, const char* name); 40cf511f24SPawel Dziepak status_t Remove(const char* name, FileType type); 411ec6b0c1SPawel Dziepak static status_t Rename(Inode* from, Inode* to, 421ec6b0c1SPawel Dziepak const char* fromName, const char* toName); 43631d9e98SPawel Dziepak status_t Access(int mode); 44212de720SPawel Dziepak status_t Stat(struct stat* st); 457bfa4fe8SPawel Dziepak 462a292557SPawel Dziepak status_t Open(int mode, OpenFileCookie* cookie); 4760a8140dSPawel Dziepak status_t Close(OpenFileCookie* cookie); 482f2e57d0SPawel Dziepak status_t Read(OpenFileCookie* cookie, off_t pos, 492f2e57d0SPawel Dziepak void* buffer, size_t* length); 502a292557SPawel Dziepak 51be4c74eaSPawel Dziepak status_t OpenDir(OpenDirCookie* cookie); 524b48348fSPawel Dziepak status_t ReadDir(void* buffer, uint32 size, 53be4c74eaSPawel Dziepak uint32* count, OpenDirCookie* cookie); 54212de720SPawel Dziepak 55bf31ee39SPawel Dziepak private: 560792abe0SPawel Dziepak Inode(); 570792abe0SPawel Dziepak 58c702f887SPawel Dziepak status_t _LookUpFilehandle(); 59c702f887SPawel Dziepak 604b48348fSPawel Dziepak status_t _ReadDirOnce(DirEntry** dirents, uint32* count, 61be4c74eaSPawel Dziepak OpenDirCookie* cookie, bool* eof); 624b48348fSPawel Dziepak status_t _FillDirEntry(struct dirent* de, ino_t id, 634b48348fSPawel Dziepak const char* name, uint32 pos, uint32 size); 64ed517d6cSPawel Dziepak status_t _ReadDirUp(struct dirent* de, uint32 pos, 65ed517d6cSPawel Dziepak uint32 size); 664b48348fSPawel Dziepak 674b48348fSPawel Dziepak static inline ino_t _FileIdToInoT(uint64 fileid); 684b48348fSPawel Dziepak 69bf31ee39SPawel Dziepak uint64 fFileId; 70d38e98d8SPawel Dziepak uint32 fType; 71bf31ee39SPawel Dziepak 72bf31ee39SPawel Dziepak Filehandle fHandle; 73bf31ee39SPawel Dziepak Filesystem* fFilesystem; 74ed517d6cSPawel Dziepak 7587c6b832SPawel Dziepak Filehandle fParentFH; 7687c6b832SPawel Dziepak const char* fName; 77c702f887SPawel Dziepak 78c702f887SPawel Dziepak const char* fPath; 79bf31ee39SPawel Dziepak }; 80bf31ee39SPawel Dziepak 81bf31ee39SPawel Dziepak 82bf31ee39SPawel Dziepak inline ino_t 834b48348fSPawel Dziepak Inode::_FileIdToInoT(uint64 fileid) 844b48348fSPawel Dziepak { 854b48348fSPawel Dziepak if (sizeof(ino_t) >= sizeof(uint64)) 864b48348fSPawel Dziepak return fileid; 874b48348fSPawel Dziepak else 884b48348fSPawel Dziepak return (ino_t)fileid ^ (fileid >> 894b48348fSPawel Dziepak (sizeof(uint64) - sizeof(ino_t)) * 8); 904b48348fSPawel Dziepak } 914b48348fSPawel Dziepak 924b48348fSPawel Dziepak 934b48348fSPawel Dziepak inline ino_t 94bf31ee39SPawel Dziepak Inode::ID() const 95bf31ee39SPawel Dziepak { 964b48348fSPawel Dziepak return _FileIdToInoT(fFileId); 97bf31ee39SPawel Dziepak } 98bf31ee39SPawel Dziepak 99bf31ee39SPawel Dziepak 100d38e98d8SPawel Dziepak inline mode_t 101d38e98d8SPawel Dziepak Inode::Type() const 102d38e98d8SPawel Dziepak { 103d38e98d8SPawel Dziepak return sNFSFileTypeToHaiku[fType]; 104d38e98d8SPawel Dziepak } 105d38e98d8SPawel Dziepak 106d38e98d8SPawel Dziepak 10796b7b14aSPawel Dziepak inline const char* 10896b7b14aSPawel Dziepak Inode::Name() const 10996b7b14aSPawel Dziepak { 11096b7b14aSPawel Dziepak return fName; 11196b7b14aSPawel Dziepak } 11296b7b14aSPawel Dziepak 11396b7b14aSPawel Dziepak 114be4c74eaSPawel Dziepak inline Filesystem* 115be4c74eaSPawel Dziepak Inode::FileSystem() const 116be4c74eaSPawel Dziepak { 117be4c74eaSPawel Dziepak return fFilesystem; 118be4c74eaSPawel Dziepak } 119be4c74eaSPawel Dziepak 120be4c74eaSPawel Dziepak 121bf31ee39SPawel Dziepak #endif // INODE_H 122bf31ee39SPawel Dziepak 123