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