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 21bf31ee39SPawel Dziepak class Inode { 22bf31ee39SPawel Dziepak public: 234b48348fSPawel Dziepak Inode(Filesystem* fs, const Filehandle &fh, 24*ed517d6cSPawel Dziepak bool root = false); 25bf31ee39SPawel Dziepak 26bf31ee39SPawel Dziepak inline ino_t ID() const; 27d38e98d8SPawel Dziepak inline mode_t Type() const; 28bf31ee39SPawel Dziepak 297bfa4fe8SPawel Dziepak status_t LookUp(const char* name, ino_t* id); 30212de720SPawel Dziepak status_t Stat(struct stat* st); 317bfa4fe8SPawel Dziepak 32821f13b0SPawel Dziepak status_t OpenDir(uint64* cookie); 334b48348fSPawel Dziepak status_t ReadDir(void* buffer, uint32 size, 344b48348fSPawel Dziepak uint32* count, uint64* cookie); 35212de720SPawel Dziepak 36bf31ee39SPawel Dziepak private: 374b48348fSPawel Dziepak status_t _ReadDirOnce(DirEntry** dirents, uint32* count, 384b48348fSPawel Dziepak uint64* cookie, bool* eof); 394b48348fSPawel Dziepak status_t _FillDirEntry(struct dirent* de, ino_t id, 404b48348fSPawel Dziepak const char* name, uint32 pos, uint32 size); 41*ed517d6cSPawel Dziepak status_t _ReadDirUp(struct dirent* de, uint32 pos, 42*ed517d6cSPawel Dziepak uint32 size); 434b48348fSPawel Dziepak 444b48348fSPawel Dziepak static inline ino_t _FileIdToInoT(uint64 fileid); 454b48348fSPawel Dziepak 46bf31ee39SPawel Dziepak uint64 fFileId; 47d38e98d8SPawel Dziepak uint32 fType; 48bf31ee39SPawel Dziepak 49bf31ee39SPawel Dziepak Filehandle fHandle; 50bf31ee39SPawel Dziepak Filesystem* fFilesystem; 51*ed517d6cSPawel Dziepak 52*ed517d6cSPawel Dziepak bool fRoot; 53bf31ee39SPawel Dziepak }; 54bf31ee39SPawel Dziepak 55bf31ee39SPawel Dziepak 56bf31ee39SPawel Dziepak inline ino_t 574b48348fSPawel Dziepak Inode::_FileIdToInoT(uint64 fileid) 584b48348fSPawel Dziepak { 594b48348fSPawel Dziepak if (sizeof(ino_t) >= sizeof(uint64)) 604b48348fSPawel Dziepak return fileid; 614b48348fSPawel Dziepak else 624b48348fSPawel Dziepak return (ino_t)fileid ^ (fileid >> 634b48348fSPawel Dziepak (sizeof(uint64) - sizeof(ino_t)) * 8); 644b48348fSPawel Dziepak } 654b48348fSPawel Dziepak 664b48348fSPawel Dziepak 674b48348fSPawel Dziepak inline ino_t 68bf31ee39SPawel Dziepak Inode::ID() const 69bf31ee39SPawel Dziepak { 704b48348fSPawel Dziepak return _FileIdToInoT(fFileId); 71bf31ee39SPawel Dziepak } 72bf31ee39SPawel Dziepak 73bf31ee39SPawel Dziepak 74d38e98d8SPawel Dziepak inline mode_t 75d38e98d8SPawel Dziepak Inode::Type() const 76d38e98d8SPawel Dziepak { 77d38e98d8SPawel Dziepak return sNFSFileTypeToHaiku[fType]; 78d38e98d8SPawel Dziepak } 79d38e98d8SPawel Dziepak 80d38e98d8SPawel Dziepak 81bf31ee39SPawel Dziepak #endif // INODE_H 82bf31ee39SPawel Dziepak 83