xref: /haiku/src/add-ons/kernel/file_systems/nfs4/Inode.h (revision c702f887ad5ef4665e3d45d2e2edda325a9d6290)
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