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