xref: /haiku/src/add-ons/kernel/file_systems/nfs4/FileInfo.h (revision 4a153753100503cf374d01079fb29ca83d3ac44b)
19b7f2d1bSPawel Dziepak /*
29b7f2d1bSPawel Dziepak  * Copyright 2012 Haiku, Inc. All rights reserved.
39b7f2d1bSPawel Dziepak  * Distributed under the terms of the MIT License.
49b7f2d1bSPawel Dziepak  *
59b7f2d1bSPawel Dziepak  * Authors:
69b7f2d1bSPawel Dziepak  *		Paweł Dziepak, pdziepak@quarnos.org
79b7f2d1bSPawel Dziepak  */
89b7f2d1bSPawel Dziepak #ifndef FILEINFO_H
99b7f2d1bSPawel Dziepak #define FILEINFO_H
109b7f2d1bSPawel Dziepak 
119b7f2d1bSPawel Dziepak 
129b7f2d1bSPawel Dziepak #include <stdlib.h>
139b7f2d1bSPawel Dziepak #include <string.h>
149b7f2d1bSPawel Dziepak 
159b7f2d1bSPawel Dziepak #include <SupportDefs.h>
169b7f2d1bSPawel Dziepak 
179b7f2d1bSPawel Dziepak 
189b7f2d1bSPawel Dziepak #define NFS4_FHSIZE	128
199b7f2d1bSPawel Dziepak 
2000a8558cSPawel Dziepak struct FileHandle {
219b7f2d1bSPawel Dziepak 			uint8		fSize;
2200a8558cSPawel Dziepak 			uint8		fData[NFS4_FHSIZE];
239b7f2d1bSPawel Dziepak 
2400a8558cSPawel Dziepak 	inline				FileHandle();
2500a8558cSPawel Dziepak 	inline				FileHandle(const FileHandle& fh);
2600a8558cSPawel Dziepak 	inline	FileHandle&	operator=(const FileHandle& fh);
27*4a153753SPawel Dziepak 
28*4a153753SPawel Dziepak 	inline	bool		operator>(const FileHandle& handle) const;
29*4a153753SPawel Dziepak 	inline	bool		operator<(const FileHandle& handle) const;
309b7f2d1bSPawel Dziepak };
319b7f2d1bSPawel Dziepak 
329b7f2d1bSPawel Dziepak 
3300a8558cSPawel Dziepak class FileSystem;
34209c46eeSPawel Dziepak class RequestBuilder;
359b7f2d1bSPawel Dziepak 
369b7f2d1bSPawel Dziepak // Complete information needed to identify a file in any situation.
3700a8558cSPawel Dziepak // Unfortunately just a FileHandle is not enough even when they are persistent
3800a8558cSPawel Dziepak // since OPEN requires both parent FileHandle and file name (just like LOOKUP).
399b7f2d1bSPawel Dziepak struct FileInfo {
409b7f2d1bSPawel Dziepak 			uint64		fFileId;
4100a8558cSPawel Dziepak 			FileHandle	fHandle;
429b7f2d1bSPawel Dziepak 
4300a8558cSPawel Dziepak 			FileHandle	fParent;
449b7f2d1bSPawel Dziepak 			const char*	fName;
459b7f2d1bSPawel Dziepak 			const char*	fPath;
469b7f2d1bSPawel Dziepak 
479b7f2d1bSPawel Dziepak 	inline				FileInfo();
489b7f2d1bSPawel Dziepak 	inline				~FileInfo();
499b7f2d1bSPawel Dziepak 	inline				FileInfo(const FileInfo& fi);
509b7f2d1bSPawel Dziepak 	inline	FileInfo&	operator=(const FileInfo& fi);
519b7f2d1bSPawel Dziepak 
5200a8558cSPawel Dziepak 			status_t	UpdateFileHandles(FileSystem* fs);
53209c46eeSPawel Dziepak 
54209c46eeSPawel Dziepak 	static status_t		ParsePath(RequestBuilder& req, uint32& count,
55209c46eeSPawel Dziepak 							const char* _path);
569b7f2d1bSPawel Dziepak };
579b7f2d1bSPawel Dziepak 
5800a8558cSPawel Dziepak struct FileSystemId {
599b7f2d1bSPawel Dziepak 			uint64		fMajor;
609b7f2d1bSPawel Dziepak 			uint64		fMinor;
619b7f2d1bSPawel Dziepak 
6200a8558cSPawel Dziepak 	inline	bool		operator==(const FileSystemId& fsid) const;
6300a8558cSPawel Dziepak 	inline	bool		operator!=(const FileSystemId& fsid) const;
649b7f2d1bSPawel Dziepak };
659b7f2d1bSPawel Dziepak 
669b7f2d1bSPawel Dziepak 
679b7f2d1bSPawel Dziepak inline
6800a8558cSPawel Dziepak FileHandle::FileHandle()
699b7f2d1bSPawel Dziepak 	:
709b7f2d1bSPawel Dziepak 	fSize(0)
719b7f2d1bSPawel Dziepak {
729b7f2d1bSPawel Dziepak }
739b7f2d1bSPawel Dziepak 
749b7f2d1bSPawel Dziepak 
759b7f2d1bSPawel Dziepak inline
7600a8558cSPawel Dziepak FileHandle::FileHandle(const FileHandle& fh)
779b7f2d1bSPawel Dziepak 	:
789b7f2d1bSPawel Dziepak 	fSize(fh.fSize)
799b7f2d1bSPawel Dziepak {
8000a8558cSPawel Dziepak 	memcpy(fData, fh.fData, fSize);
819b7f2d1bSPawel Dziepak }
829b7f2d1bSPawel Dziepak 
839b7f2d1bSPawel Dziepak 
8400a8558cSPawel Dziepak inline FileHandle&
8500a8558cSPawel Dziepak FileHandle::operator=(const FileHandle& fh)
869b7f2d1bSPawel Dziepak {
879b7f2d1bSPawel Dziepak 	fSize = fh.fSize;
8800a8558cSPawel Dziepak 	memcpy(fData, fh.fData, fSize);
899b7f2d1bSPawel Dziepak 	return *this;
909b7f2d1bSPawel Dziepak }
919b7f2d1bSPawel Dziepak 
929b7f2d1bSPawel Dziepak 
93*4a153753SPawel Dziepak inline bool
94*4a153753SPawel Dziepak FileHandle::operator>(const FileHandle& handle) const
95*4a153753SPawel Dziepak {
96*4a153753SPawel Dziepak 	if (fSize > handle.fSize)
97*4a153753SPawel Dziepak 		return true;
98*4a153753SPawel Dziepak 	return memcmp(fData, handle.fData, fSize) > 0;
99*4a153753SPawel Dziepak }
100*4a153753SPawel Dziepak 
101*4a153753SPawel Dziepak 
102*4a153753SPawel Dziepak inline bool
103*4a153753SPawel Dziepak FileHandle::operator<(const FileHandle& handle) const
104*4a153753SPawel Dziepak {
105*4a153753SPawel Dziepak 	if (fSize < handle.fSize)
106*4a153753SPawel Dziepak 		return true;
107*4a153753SPawel Dziepak 	return memcmp(fData, handle.fData, fSize) < 0;
108*4a153753SPawel Dziepak }
109*4a153753SPawel Dziepak 
110*4a153753SPawel Dziepak 
1119b7f2d1bSPawel Dziepak inline
1129b7f2d1bSPawel Dziepak FileInfo::FileInfo()
1139b7f2d1bSPawel Dziepak 	:
1149b7f2d1bSPawel Dziepak 	fFileId(0),
1159b7f2d1bSPawel Dziepak 	fName(NULL),
1169b7f2d1bSPawel Dziepak 	fPath(NULL)
1179b7f2d1bSPawel Dziepak {
1189b7f2d1bSPawel Dziepak }
1199b7f2d1bSPawel Dziepak 
1209b7f2d1bSPawel Dziepak 
1219b7f2d1bSPawel Dziepak inline
1229b7f2d1bSPawel Dziepak FileInfo::~FileInfo()
1239b7f2d1bSPawel Dziepak {
1249b7f2d1bSPawel Dziepak 	free(const_cast<char*>(fName));
1259b7f2d1bSPawel Dziepak 	free(const_cast<char*>(fPath));
1269b7f2d1bSPawel Dziepak }
1279b7f2d1bSPawel Dziepak 
1289b7f2d1bSPawel Dziepak 
1299b7f2d1bSPawel Dziepak inline
1309b7f2d1bSPawel Dziepak FileInfo::FileInfo(const FileInfo& fi)
1319b7f2d1bSPawel Dziepak 	:
1329b7f2d1bSPawel Dziepak 	fFileId(fi.fFileId),
1339b7f2d1bSPawel Dziepak 	fHandle(fi.fHandle),
1349b7f2d1bSPawel Dziepak 	fParent(fi.fParent),
1359b7f2d1bSPawel Dziepak 	fName(strdup(fi.fName)),
1369b7f2d1bSPawel Dziepak 	fPath(strdup(fi.fPath))
1379b7f2d1bSPawel Dziepak {
1389b7f2d1bSPawel Dziepak }
1399b7f2d1bSPawel Dziepak 
1409b7f2d1bSPawel Dziepak 
1419b7f2d1bSPawel Dziepak inline FileInfo&
1429b7f2d1bSPawel Dziepak FileInfo::operator=(const FileInfo& fi)
1439b7f2d1bSPawel Dziepak {
1449b7f2d1bSPawel Dziepak 	fFileId = fi.fFileId;
1459b7f2d1bSPawel Dziepak 	fHandle = fi.fHandle;
1469b7f2d1bSPawel Dziepak 	fParent = fi.fParent;
1479b7f2d1bSPawel Dziepak 
1489b7f2d1bSPawel Dziepak 	free(const_cast<char*>(fName));
1499b7f2d1bSPawel Dziepak 	fName = strdup(fi.fName);
1509b7f2d1bSPawel Dziepak 
1519b7f2d1bSPawel Dziepak 	free(const_cast<char*>(fPath));
1529b7f2d1bSPawel Dziepak 	fPath = strdup(fi.fPath);
1539b7f2d1bSPawel Dziepak 
1549b7f2d1bSPawel Dziepak 	return *this;
1559b7f2d1bSPawel Dziepak }
1569b7f2d1bSPawel Dziepak 
1579b7f2d1bSPawel Dziepak 
1589b7f2d1bSPawel Dziepak inline bool
15900a8558cSPawel Dziepak FileSystemId::operator==(const FileSystemId& fsid) const
1609b7f2d1bSPawel Dziepak {
1619b7f2d1bSPawel Dziepak 	return fMajor == fsid.fMajor && fMinor == fsid.fMinor;
1629b7f2d1bSPawel Dziepak }
1639b7f2d1bSPawel Dziepak 
1649b7f2d1bSPawel Dziepak 
1659b7f2d1bSPawel Dziepak inline bool
16600a8558cSPawel Dziepak FileSystemId::operator!=(const FileSystemId& fsid) const
1679b7f2d1bSPawel Dziepak {
1689b7f2d1bSPawel Dziepak 	return !operator==(fsid);
1699b7f2d1bSPawel Dziepak }
1709b7f2d1bSPawel Dziepak 
1719b7f2d1bSPawel Dziepak 
1729b7f2d1bSPawel Dziepak #endif	// FILEHINFO_H
1739b7f2d1bSPawel Dziepak 
174