xref: /haiku/src/add-ons/kernel/file_systems/ufs2/Inode.h (revision e1c4049fed1047bdb957b0529e1921e97ef94770)
1 /*
2  * Copyright 2020 Suhel Mehta, mehtasuhel@gmail.com
3  * Copyright 2008-2010, Axel Dörfler, axeld@pinc-software.de.
4  * All rights reserved. Distributed under the terms of the MIT License.
5  */
6 
7 #ifndef INODE_H
8 #define INODE_H
9 
10 #include "ufs2.h"
11 #include "Volume.h"
12 
13 #define	UFS2_ROOT	((ino_t)2)
14 
15 
16 struct timeval32
17 {
18 	int tv_sec, tv_usec;
19 };
20 
21 
22 struct ufs2_inode {
23 	u_int16_t	fileMode;
24 	int16_t		linkCount;
25 	int32_t		userId;
26 	int32_t		groupId;
27 	int32_t		inodeBlockSize;
28 	int64_t		size;
29 	int64_t		inodeBlocks;
30 	struct		timeval32	accessTime;
31 	struct		timeval32	modifiedTime;
32 	struct		timeval32	changeTime;
33 	struct		timeval32	createTime;
34 	/* time in nano seconds */
35 	int32_t		nsModifiedTime;
36 	int32_t		nsAccessTime;
37 	int32_t		nsChangeTime;
38 	int32_t		nsCreateTime;
39 	int32_t		generationNumber;
40 	int32_t		kernelFlags;
41 	int32_t		statusFlags;
42 	int32_t		extendedAttSize; /* Extended attribute size */
43 	/* 2 Direct extended attribute block pointers */
44 	int64_t		extendedBklPtr1;
45 	int64_t		extendedBklPtr2;
46 
47 	union {
48 		struct {
49 			int64_t		directBlockPointer[12];
50 			int64_t		indirectBlockPointer;
51 			int64_t		doubleIndriectBlockPointer;
52 			int64_t		tripleIndriectBlockPointer;
53 		};
54 		char	symlinkpath[120];
55 	};
56 	/* Unused but need to figure out what are they */
57 	int64_t		unused1;
58 	int64_t		unused2;
59 	int64_t		unused3;
60 
61 
62 	static void _DecodeTime(struct timespec& timespec, timeval32 time)
63 	{
64 		timespec.tv_sec = time.tv_sec;
65 		timespec.tv_nsec = time.tv_usec * 1000;
66 	}
67 	void GetAccessTime(struct timespec& timespec) const
68 		{ _DecodeTime(timespec, accessTime); }
69 	void GetChangeTime(struct timespec& timespec) const
70 		{ _DecodeTime(timespec, changeTime); }
71 	void GetModificationTime(struct timespec& timespec) const
72 		{ _DecodeTime(timespec, modifiedTime); }
73 	void GetCreationTime(struct timespec& timespec) const
74 		{ _DecodeTime(timespec, createTime); }
75 };
76 
77 class Inode {
78 	public:
79 						Inode(Volume* volume, ino_t id);
80 						Inode(Volume* volume, ino_t id,
81 							const ufs2_inode& item);
82 						~Inode();
83 
84 			status_t	InitCheck();
85 
86 			ino_t		ID() const { return fID; }
87 //
88 			rw_lock*	Lock() { return& fLock; }
89 //
90 //			status_t	UpdateNodeFromDisk();
91 
92 			bool		IsDirectory() const
93 							{ return S_ISDIR(Mode()); }
94 			bool		IsFile() const
95 							{ return S_ISREG(Mode()); }
96 			bool		IsSymLink() const
97 							{ return S_ISLNK(Mode()); }
98 //			status_t	CheckPermissions(int accessMode) const;
99 
100 			mode_t		Mode() const { return fNode.fileMode; }
101 			off_t		Size() const { return fNode.size; }
102 			uid_t		UserID() const { return fNode.userId; }
103 			gid_t		GroupID() const { return fNode.groupId; }
104 			int16_t		LinkCount() const { return fNode.linkCount; }
105 			uint64_t	NumBlocks() const
106 							{ return fNode.inodeBlocks * (fNode.inodeBlockSize >> 9); }
107 			void		GetChangeTime(struct timespec& timespec) const
108 							{ fNode.GetChangeTime(timespec); }
109 			void		GetModificationTime(struct timespec& timespec) const
110 							{ fNode.GetModificationTime(timespec); }
111 			void		GetCreationTime(struct timespec& timespec) const
112 							{ fNode.GetCreationTime(timespec); }
113 			void		GetAccessTime(struct timespec& timespec) const
114 							{ fNode.GetAccessTime(timespec); }
115 			status_t	CheckPermissions(int accessMode) const;
116 
117 			Volume*		GetVolume() const { return fVolume; }
118 
119 			ino_t		Parent();
120 
121 			off_t   	FindBlock(off_t block_number, off_t block_offset);
122 			status_t	ReadAt(off_t pos, uint8* buffer, size_t* length);
123 			status_t	ReadLink(char* buffer, size_t *_bufferSize);
124 //			status_t	FillGapWithZeros(off_t start, off_t end);
125 
126 			void*		FileCache() const { return fCache; }
127 			void*		Map() const { return fMap; }
128 
129 //			status_t	FindParent(ino_t* id);
130 	//static	Inode*		Create(Transaction& transaction, ino_t id, Inode* parent, int32 mode, uint64 size = 0, uint64 flags = 0);
131 private:
132 						Inode(Volume* volume);
133 						Inode(const Inode&);
134 						Inode& operator=(const Inode&);
135 			int64_t		GetBlockPointer(int ptrNumber) {
136 						return fNode.directBlockPointer[ptrNumber]; }
137 
138 			int64_t 	GetIndirectBlockPointer() {
139 						return fNode.indirectBlockPointer; }
140 
141 			int64_t 	GetDoubleIndirectBlockPtr() {
142 						return fNode.doubleIndriectBlockPointer; }
143 
144 			int64_t 	GetTripleIndirectBlockPtr() {
145 						return fNode.tripleIndriectBlockPointer; }
146 
147 //			uint64		_NumBlocks();
148 private:
149 
150 			rw_lock		fLock;
151 			::Volume*	fVolume;
152 			ino_t		fID;
153 			void*		fCache;
154 			void*		fMap;
155 			status_t	fInitStatus;
156 			ufs2_inode	fNode;
157 };
158 
159 #endif	// INODE_H
160