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