xref: /haiku/headers/private/kernel/boot/vfs.h (revision e81a954787e50e56a7f06f72705b7859b6ab06d1)
1 /*
2  * Copyright 2003-2005, Axel Dörfler, axeld@pinc-software.de.
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef KERNEL_BOOT_VFS_H
6 #define KERNEL_BOOT_VFS_H
7 
8 
9 #include <dirent.h>
10 
11 #include <SupportDefs.h>
12 
13 #include <util/DoublyLinkedList.h>
14 #include <boot/stage2_args.h>
15 
16 
17 #ifdef __cplusplus
18 
19 struct file_map_run;
20 struct stat;
21 class PackageVolumeInfo;
22 class PackageVolumeState;
23 
24 /** This is the base class for all VFS nodes */
25 
26 class Node : public DoublyLinkedListLinkImpl<Node> {
27 	public:
28 		Node();
29 		virtual ~Node();
30 
31 		virtual status_t Open(void **_cookie, int mode);
32 		virtual status_t Close(void *cookie);
33 
34 		virtual ssize_t ReadAt(void *cookie, off_t pos, void *buffer,
35 			size_t bufferSize) = 0;
36 		virtual ssize_t WriteAt(void *cookie, off_t pos, const void *buffer,
37 			size_t bufferSize) = 0;
38 
39 		virtual status_t ReadLink(char* buffer, size_t bufferSize);
40 
41 		virtual status_t GetName(char *nameBuffer, size_t bufferSize) const;
42 		virtual status_t GetFileMap(struct file_map_run *runs, int32 *count);
43 		virtual int32 Type() const;
44 		virtual off_t Size() const;
45 		virtual ino_t Inode() const;
46 
47 		void Stat(struct stat& stat);
48 
49 		status_t Acquire();
50 		status_t Release();
51 
52 	protected:
53 		int32		fRefCount;
54 };
55 
56 typedef DoublyLinkedList<Node> NodeList;
57 typedef NodeList::Iterator NodeIterator;
58 
59 
60 class Directory : public Node {
61 	public:
62 		Directory();
63 
64 		virtual ssize_t ReadAt(void *cookie, off_t pos, void *buffer, size_t bufferSize);
65 		virtual ssize_t WriteAt(void *cookie, off_t pos, const void *buffer, size_t bufferSize);
66 
67 		virtual int32 Type() const;
68 
69 		virtual Node* Lookup(const char* name, bool traverseLinks);
70 		virtual Node* LookupDontTraverse(const char* name) = 0;
71 
72 		virtual status_t GetNextEntry(void *cookie, char *nameBuffer, size_t bufferSize) = 0;
73 		virtual status_t GetNextNode(void *cookie, Node **_node) = 0;
74 		virtual status_t Rewind(void *cookie) = 0;
75 		virtual bool IsEmpty() = 0;
76 
77 		virtual status_t CreateFile(const char *name, mode_t permissions,
78 			Node **_node);
79 };
80 
81 /** The console based nodes don't need cookies for I/O, they
82  *	also don't support to change the stream position.
83  *	Live is simple in the boot loader :-)
84  */
85 
86 class ConsoleNode : public Node {
87 	public:
88 		ConsoleNode();
89 
90 		virtual ssize_t Read(void *buffer, size_t bufferSize);
91 		virtual ssize_t Write(const void *buffer, size_t bufferSize);
92 };
93 
94 
95 class MemoryDisk : public Node {
96 	public:
97 		MemoryDisk(const uint8* data, size_t size, const char* name);
98 
99 		virtual ssize_t ReadAt(void* cookie, off_t pos, void* buffer,
100 			size_t bufferSize);
101 		virtual ssize_t WriteAt(void* cookie, off_t pos, const void* buffer,
102 			size_t bufferSize);
103 
104 		virtual off_t Size() const;
105 		virtual status_t GetName(char *nameBuffer, size_t bufferSize) const;
106 
107 	private:
108 		const uint8*	fData;
109 		size_t			fSize;
110 		char			fName[64];
111 };
112 
113 
114 class BootVolume {
115 public:
116 								BootVolume();
117 								~BootVolume();
118 
119 			status_t			SetTo(Directory* rootDirectory,
120 									PackageVolumeInfo* packageVolumeInfo
121 										= NULL,
122 									PackageVolumeState* packageVolumeState
123 										= NULL);
124 			void				Unset();
125 
126 			bool				IsValid() const
127 									{ return fRootDirectory != NULL; }
128 
129 			Directory*			RootDirectory() const
130 									{ return fRootDirectory; }
131 			Directory*			SystemDirectory() const
132 									{ return fSystemDirectory; }
133 			bool				IsPackaged() const
134 									{ return fPackageVolumeInfo != NULL; }
135 			PackageVolumeInfo*	GetPackageVolumeInfo() const
136 									{ return fPackageVolumeInfo; }
137 			PackageVolumeState*	GetPackageVolumeState() const
138 									{ return fPackageVolumeState; }
139 
140 private:
141 			status_t			_SetTo(Directory* rootDirectory,
142 									PackageVolumeInfo* packageVolumeInfo,
143 									PackageVolumeState* packageVolumeState);
144 			int					_OpenSystemPackage();
145 
146 private:
147 			Directory*			fRootDirectory;
148 				// root directory of the volume
149 			Directory*			fSystemDirectory;
150 				// "system" directory of the volume; if packaged the root
151 				// directory of the mounted packagefs
152 			PackageVolumeInfo*	fPackageVolumeInfo;
153 			PackageVolumeState*	fPackageVolumeState;
154 };
155 
156 
157 /* function prototypes */
158 
159 extern status_t vfs_init(stage2_args *args);
160 extern status_t register_boot_file_system(BootVolume& bootVolume);
161 extern status_t get_boot_file_system(stage2_args* args,
162 			BootVolume& _bootVolume);
163 extern status_t mount_file_systems(stage2_args *args);
164 extern int open_node(Node *node, int mode);
165 extern int open_from(Directory *directory, const char *path, int mode,
166 			mode_t permissions = 0);
167 extern DIR* open_directory(Directory* baseDirectory, const char* path);
168 extern status_t get_stat(Directory* directory, const char* path,
169 			struct stat& st);
170 
171 extern Node* get_node_from(int fd);
172 	// returns a reference
173 extern Directory* directory_from(DIR* dir);
174 	// does not return a reference
175 
176 extern status_t add_partitions_for(int fd, bool mountFileSystems, bool isBootDevice = false);
177 extern status_t add_partitions_for(Node *device, bool mountFileSystems, bool isBootDevice = false);
178 
179 #endif	/* __cplusplus */
180 
181 #endif	/* KERNEL_BOOT_VFS_H */
182