xref: /haiku/src/system/boot/loader/RootFileSystem.cpp (revision 9f81ca838ce7b92b5689e57d3f86765db4705a7b)
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 
RootFileSystem()15 RootFileSystem::RootFileSystem()
16 {
17 }
18 
19 
~RootFileSystem()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
Open(void ** _cookie,int mode)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
Close(void * cookie)45 RootFileSystem::Close(void *cookie)
46 {
47 	delete (EntryIterator *)cookie;
48 	return B_OK;
49 }
50 
51 
52 Node*
LookupDontTraverse(const char * name)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
GetNextEntry(void * _cookie,char * name,size_t size)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
GetNextNode(void * _cookie,Node ** _node)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
Rewind(void * _cookie)116 RootFileSystem::Rewind(void *_cookie)
117 {
118 	EntryIterator *iterator = (EntryIterator *)_cookie;
119 
120 	iterator->Rewind();
121 	return B_OK;
122 }
123 
124 
125 bool
IsEmpty()126 RootFileSystem::IsEmpty()
127 {
128 	return fList.IsEmpty();
129 }
130 
131 
132 status_t
AddVolume(Directory * volume,Partition * partition)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
AddLink(const char * name,Directory * target)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
GetPartitionFor(Directory * volume,Partition ** _partition)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