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
15469f13fdSPawel Dziepak #include <lock.h>
169b7f2d1bSPawel Dziepak #include <SupportDefs.h>
17469f13fdSPawel Dziepak #include <util/KernelReferenceable.h>
189b7f2d1bSPawel Dziepak
199b7f2d1bSPawel Dziepak
209b7f2d1bSPawel Dziepak #define NFS4_FHSIZE 128
219b7f2d1bSPawel Dziepak
2200a8558cSPawel Dziepak struct FileHandle {
239b7f2d1bSPawel Dziepak uint8 fSize;
2400a8558cSPawel Dziepak uint8 fData[NFS4_FHSIZE];
259b7f2d1bSPawel Dziepak
2600a8558cSPawel Dziepak inline FileHandle();
2700a8558cSPawel Dziepak inline FileHandle(const FileHandle& fh);
2800a8558cSPawel Dziepak inline FileHandle& operator=(const FileHandle& fh);
294a153753SPawel Dziepak
3020d1b02eSPawel Dziepak
31469f13fdSPawel Dziepak inline bool operator==(const FileHandle& handle) const;
3220d1b02eSPawel Dziepak inline bool operator!=(const FileHandle& handle) const;
334a153753SPawel Dziepak inline bool operator>(const FileHandle& handle) const;
344a153753SPawel Dziepak inline bool operator<(const FileHandle& handle) const;
359b7f2d1bSPawel Dziepak };
369b7f2d1bSPawel Dziepak
37*7c234361SAugustin Cavalier struct InodeNames;
38469f13fdSPawel Dziepak
39469f13fdSPawel Dziepak struct InodeName : public SinglyLinkedListLinkImpl<InodeName> {
40469f13fdSPawel Dziepak InodeName(InodeNames* parent, const char* name);
41469f13fdSPawel Dziepak ~InodeName();
42469f13fdSPawel Dziepak
43469f13fdSPawel Dziepak InodeNames* fParent;
44469f13fdSPawel Dziepak const char* fName;
45469f13fdSPawel Dziepak };
46469f13fdSPawel Dziepak
47469f13fdSPawel Dziepak struct InodeNames : public KernelReferenceable {
48469f13fdSPawel Dziepak InodeNames();
49469f13fdSPawel Dziepak ~InodeNames();
50469f13fdSPawel Dziepak
51469f13fdSPawel Dziepak status_t AddName(InodeNames* parent, const char* name);
52469f13fdSPawel Dziepak bool RemoveName(InodeNames* parent,
53469f13fdSPawel Dziepak const char* name);
54469f13fdSPawel Dziepak
55469f13fdSPawel Dziepak mutex fLock;
56469f13fdSPawel Dziepak SinglyLinkedList<InodeName> fNames;
57469f13fdSPawel Dziepak FileHandle fHandle;
58469f13fdSPawel Dziepak };
599b7f2d1bSPawel Dziepak
6000a8558cSPawel Dziepak class FileSystem;
61209c46eeSPawel Dziepak class RequestBuilder;
629b7f2d1bSPawel Dziepak
639b7f2d1bSPawel Dziepak // Complete information needed to identify a file in any situation.
6400a8558cSPawel Dziepak // Unfortunately just a FileHandle is not enough even when they are persistent
6500a8558cSPawel Dziepak // since OPEN requires both parent FileHandle and file name (just like LOOKUP).
669b7f2d1bSPawel Dziepak struct FileInfo {
679b7f2d1bSPawel Dziepak uint64 fFileId;
6800a8558cSPawel Dziepak FileHandle fHandle;
699b7f2d1bSPawel Dziepak
70469f13fdSPawel Dziepak InodeNames* fNames;
719b7f2d1bSPawel Dziepak
72f7c35cf4SPawel Dziepak FileHandle fAttrDir;
73f7c35cf4SPawel Dziepak
74469f13fdSPawel Dziepak FileInfo();
75469f13fdSPawel Dziepak ~FileInfo();
76469f13fdSPawel Dziepak FileInfo(const FileInfo& fi);
77469f13fdSPawel Dziepak FileInfo& operator=(const FileInfo& fi);
789b7f2d1bSPawel Dziepak
7900a8558cSPawel Dziepak status_t UpdateFileHandles(FileSystem* fs);
809b7f2d1bSPawel Dziepak };
819b7f2d1bSPawel Dziepak
8200a8558cSPawel Dziepak struct FileSystemId {
839b7f2d1bSPawel Dziepak uint64 fMajor;
849b7f2d1bSPawel Dziepak uint64 fMinor;
859b7f2d1bSPawel Dziepak
8600a8558cSPawel Dziepak inline bool operator==(const FileSystemId& fsid) const;
8700a8558cSPawel Dziepak inline bool operator!=(const FileSystemId& fsid) const;
889b7f2d1bSPawel Dziepak };
899b7f2d1bSPawel Dziepak
909b7f2d1bSPawel Dziepak
919b7f2d1bSPawel Dziepak inline
FileHandle()9200a8558cSPawel Dziepak FileHandle::FileHandle()
939b7f2d1bSPawel Dziepak :
949b7f2d1bSPawel Dziepak fSize(0)
959b7f2d1bSPawel Dziepak {
969b7f2d1bSPawel Dziepak }
979b7f2d1bSPawel Dziepak
989b7f2d1bSPawel Dziepak
999b7f2d1bSPawel Dziepak inline
FileHandle(const FileHandle & fh)10000a8558cSPawel Dziepak FileHandle::FileHandle(const FileHandle& fh)
1019b7f2d1bSPawel Dziepak :
1029b7f2d1bSPawel Dziepak fSize(fh.fSize)
1039b7f2d1bSPawel Dziepak {
10400a8558cSPawel Dziepak memcpy(fData, fh.fData, fSize);
1059b7f2d1bSPawel Dziepak }
1069b7f2d1bSPawel Dziepak
1079b7f2d1bSPawel Dziepak
10800a8558cSPawel Dziepak inline FileHandle&
10900a8558cSPawel Dziepak FileHandle::operator=(const FileHandle& fh)
1109b7f2d1bSPawel Dziepak {
1119b7f2d1bSPawel Dziepak fSize = fh.fSize;
11200a8558cSPawel Dziepak memcpy(fData, fh.fData, fSize);
1139b7f2d1bSPawel Dziepak return *this;
1149b7f2d1bSPawel Dziepak }
1159b7f2d1bSPawel Dziepak
1169b7f2d1bSPawel Dziepak
1174a153753SPawel Dziepak inline bool
118469f13fdSPawel Dziepak FileHandle::operator==(const FileHandle& handle) const
11920d1b02eSPawel Dziepak {
12020d1b02eSPawel Dziepak if (fSize != handle.fSize)
121469f13fdSPawel Dziepak return false;
122469f13fdSPawel Dziepak return memcmp(fData, handle.fData, fSize) == 0;
123469f13fdSPawel Dziepak }
124469f13fdSPawel Dziepak
125469f13fdSPawel Dziepak
126469f13fdSPawel Dziepak inline bool
127469f13fdSPawel Dziepak FileHandle::operator!=(const FileHandle& handle) const
128469f13fdSPawel Dziepak {
129469f13fdSPawel Dziepak return !operator==(handle);
13020d1b02eSPawel Dziepak }
13120d1b02eSPawel Dziepak
13220d1b02eSPawel Dziepak
13320d1b02eSPawel Dziepak inline bool
1344a153753SPawel Dziepak FileHandle::operator>(const FileHandle& handle) const
1354a153753SPawel Dziepak {
1364a153753SPawel Dziepak if (fSize > handle.fSize)
1374a153753SPawel Dziepak return true;
1384a153753SPawel Dziepak return memcmp(fData, handle.fData, fSize) > 0;
1394a153753SPawel Dziepak }
1404a153753SPawel Dziepak
1414a153753SPawel Dziepak
1424a153753SPawel Dziepak inline bool
1434a153753SPawel Dziepak FileHandle::operator<(const FileHandle& handle) const
1444a153753SPawel Dziepak {
1454a153753SPawel Dziepak if (fSize < handle.fSize)
1464a153753SPawel Dziepak return true;
1474a153753SPawel Dziepak return memcmp(fData, handle.fData, fSize) < 0;
1484a153753SPawel Dziepak }
1494a153753SPawel Dziepak
1504a153753SPawel Dziepak
1519b7f2d1bSPawel Dziepak inline bool
15200a8558cSPawel Dziepak FileSystemId::operator==(const FileSystemId& fsid) const
1539b7f2d1bSPawel Dziepak {
1549b7f2d1bSPawel Dziepak return fMajor == fsid.fMajor && fMinor == fsid.fMinor;
1559b7f2d1bSPawel Dziepak }
1569b7f2d1bSPawel Dziepak
1579b7f2d1bSPawel Dziepak
1589b7f2d1bSPawel Dziepak inline bool
15900a8558cSPawel Dziepak FileSystemId::operator!=(const FileSystemId& fsid) const
1609b7f2d1bSPawel Dziepak {
1619b7f2d1bSPawel Dziepak return !operator==(fsid);
1629b7f2d1bSPawel Dziepak }
1639b7f2d1bSPawel Dziepak
1649b7f2d1bSPawel Dziepak
1659b7f2d1bSPawel Dziepak #endif // FILEHINFO_H
1669b7f2d1bSPawel Dziepak
167