xref: /haiku/src/add-ons/kernel/file_systems/nfs4/Inode.h (revision 87c6b83293724346b8b2899fb288fd28d200a5da)
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:
23*87c6b832SPawel Dziepak 								Inode(Filesystem* fs, const FileInfo& fi);
24*87c6b832SPawel Dziepak 								~Inode();
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);
41ed517d6cSPawel Dziepak 					status_t	_ReadDirUp(struct dirent* de, uint32 pos,
42ed517d6cSPawel 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;
51ed517d6cSPawel Dziepak 
52*87c6b832SPawel Dziepak 					Filehandle	fParentFH;
53*87c6b832SPawel Dziepak 					const char*	fName;
54bf31ee39SPawel Dziepak };
55bf31ee39SPawel Dziepak 
56bf31ee39SPawel Dziepak 
57bf31ee39SPawel Dziepak inline ino_t
584b48348fSPawel Dziepak Inode::_FileIdToInoT(uint64 fileid)
594b48348fSPawel Dziepak {
604b48348fSPawel Dziepak 	if (sizeof(ino_t) >= sizeof(uint64))
614b48348fSPawel Dziepak 		return fileid;
624b48348fSPawel Dziepak 	else
634b48348fSPawel Dziepak 		return (ino_t)fileid ^ (fileid >>
644b48348fSPawel Dziepak 					(sizeof(uint64) - sizeof(ino_t)) * 8);
654b48348fSPawel Dziepak }
664b48348fSPawel Dziepak 
674b48348fSPawel Dziepak 
684b48348fSPawel Dziepak inline ino_t
69bf31ee39SPawel Dziepak Inode::ID() const
70bf31ee39SPawel Dziepak {
714b48348fSPawel Dziepak 	return _FileIdToInoT(fFileId);
72bf31ee39SPawel Dziepak }
73bf31ee39SPawel Dziepak 
74bf31ee39SPawel Dziepak 
75d38e98d8SPawel Dziepak inline mode_t
76d38e98d8SPawel Dziepak Inode::Type() const
77d38e98d8SPawel Dziepak {
78d38e98d8SPawel Dziepak 	return sNFSFileTypeToHaiku[fType];
79d38e98d8SPawel Dziepak }
80d38e98d8SPawel Dziepak 
81d38e98d8SPawel Dziepak 
82bf31ee39SPawel Dziepak #endif	// INODE_H
83bf31ee39SPawel Dziepak 
84