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