xref: /haiku/src/system/boot/loader/RootFileSystem.cpp (revision 4466b89c65970de4c7236ac87faa2bee4589f413)
1 /*
2  * Copyright 2003-2006, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include "RootFileSystem.h"
8 
9 #include <OS.h>
10 #include <util/kernel_cpp.h>
11 
12 #include <string.h>
13 #include <fcntl.h>
14 
15 
16 RootFileSystem::RootFileSystem()
17 {
18 }
19 
20 
21 RootFileSystem::~RootFileSystem()
22 {
23 	struct entry *entry = NULL;
24 
25 	while ((entry = fList.RemoveHead()) != NULL) {
26 		entry->root->Release();
27 		delete entry;
28 	}
29 }
30 
31 
32 status_t
33 RootFileSystem::Open(void **_cookie, int mode)
34 {
35 	EntryIterator *iterator = new (std::nothrow) EntryIterator(&fList);
36 	if (iterator == NULL)
37 		return B_NO_MEMORY;
38 
39 	*_cookie = iterator;
40 
41 	return B_OK;
42 }
43 
44 
45 status_t
46 RootFileSystem::Close(void *cookie)
47 {
48 	delete (EntryIterator *)cookie;
49 	return B_OK;
50 }
51 
52 
53 Node *
54 RootFileSystem::Lookup(const char *name, bool /*traverseLinks*/)
55 {
56 	EntryIterator iterator = fLinks.GetIterator();
57 	struct entry *entry;
58 
59 	// first check the links
60 
61 	while ((entry = iterator.Next()) != NULL) {
62 		if (!strcmp(name, entry->name)) {
63 			entry->root->Acquire();
64 			return entry->root;
65 		}
66 	}
67 
68 	// then all mounted file systems
69 
70 	iterator = fList.GetIterator();
71 
72 	while ((entry = iterator.Next()) != NULL) {
73 		char entryName[B_OS_NAME_LENGTH];
74 		if (entry->root->GetName(entryName, sizeof(entryName)) != B_OK)
75 			continue;
76 
77 		if (!strcmp(entryName, name)) {
78 			entry->root->Acquire();
79 			return entry->root;
80 		}
81 	}
82 
83 	return NULL;
84 }
85 
86 
87 status_t
88 RootFileSystem::GetNextEntry(void *_cookie, char *name, size_t size)
89 {
90 	EntryIterator *iterator = (EntryIterator *)_cookie;
91 	struct entry *entry;
92 
93 	entry = iterator->Next();
94 	if (entry != NULL)
95 		return entry->root->GetName(name, size);
96 
97 	return B_ENTRY_NOT_FOUND;
98 }
99 
100 
101 status_t
102 RootFileSystem::GetNextNode(void *_cookie, Node **_node)
103 {
104 	EntryIterator *iterator = (EntryIterator *)_cookie;
105 	struct entry *entry;
106 
107 	entry = iterator->Next();
108 	if (entry != NULL) {
109 		*_node = entry->root;
110 		return B_OK;
111 	}
112 	return B_ENTRY_NOT_FOUND;
113 }
114 
115 
116 status_t
117 RootFileSystem::Rewind(void *_cookie)
118 {
119 	EntryIterator *iterator = (EntryIterator *)_cookie;
120 
121 	iterator->Rewind();
122 	return B_OK;
123 }
124 
125 
126 bool
127 RootFileSystem::IsEmpty()
128 {
129 	return fList.IsEmpty();
130 }
131 
132 
133 status_t
134 RootFileSystem::AddVolume(Directory *volume, Partition *partition)
135 {
136 	struct entry *entry = new (std::nothrow) RootFileSystem::entry();
137 	if (entry == NULL)
138 		return B_NO_MEMORY;
139 
140 	volume->Acquire();
141 	entry->name = NULL;
142 	entry->root = volume;
143 	entry->partition = partition;
144 
145 	fList.Add(entry);
146 
147 	return B_OK;
148 }
149 
150 
151 status_t
152 RootFileSystem::AddLink(const char *name, Directory *target)
153 {
154 	struct entry *entry = new (std::nothrow) RootFileSystem::entry();
155 	if (entry == NULL)
156 		return B_NO_MEMORY;
157 
158 	target->Acquire();
159 	entry->name = name;
160 	entry->root = target;
161 
162 	fLinks.Add(entry);
163 
164 	return B_OK;
165 }
166 
167 
168 status_t
169 RootFileSystem::GetPartitionFor(Directory *volume, Partition **_partition)
170 {
171 	EntryIterator iterator = fList.GetIterator();
172 	struct entry *entry;
173 
174 	while ((entry = iterator.Next()) != NULL) {
175 		if (entry->root == volume) {
176 			*_partition = entry->partition;
177 			return B_OK;
178 		}
179 	}
180 
181 	return B_ENTRY_NOT_FOUND;
182 }
183 
184