haiku/src/system/boot/loader/RootFileSystem.cpp
Ingo Weinhold 0dc4d1e5ca Reverted r27685, r27676, r27665, and r27664, the changes related to
letting the boot loader provide full paths for the pre-loaded images.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27753 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-27 00:28:10 +00:00

184 lines
3.0 KiB
C++

/*
* Copyright 2003-2006, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#include "RootFileSystem.h"
#include <OS.h>
#include <util/kernel_cpp.h>
#include <string.h>
#include <fcntl.h>
RootFileSystem::RootFileSystem()
{
}
RootFileSystem::~RootFileSystem()
{
struct entry *entry = NULL;
while ((entry = fList.RemoveHead()) != NULL) {
entry->root->Release();
delete entry;
}
}
status_t
RootFileSystem::Open(void **_cookie, int mode)
{
EntryIterator *iterator = new (std::nothrow) EntryIterator(&fList);
if (iterator == NULL)
return B_NO_MEMORY;
*_cookie = iterator;
return B_OK;
}
status_t
RootFileSystem::Close(void *cookie)
{
delete (EntryIterator *)cookie;
return B_OK;
}
Node *
RootFileSystem::Lookup(const char *name, bool /*traverseLinks*/)
{
EntryIterator iterator = fLinks.GetIterator();
struct entry *entry;
// first check the links
while ((entry = iterator.Next()) != NULL) {
if (!strcmp(name, entry->name)) {
entry->root->Acquire();
return entry->root;
}
}
// then all mounted file systems
iterator = fList.GetIterator();
while ((entry = iterator.Next()) != NULL) {
char entryName[B_OS_NAME_LENGTH];
if (entry->root->GetName(entryName, sizeof(entryName)) != B_OK)
continue;
if (!strcmp(entryName, name)) {
entry->root->Acquire();
return entry->root;
}
}
return NULL;
}
status_t
RootFileSystem::GetNextEntry(void *_cookie, char *name, size_t size)
{
EntryIterator *iterator = (EntryIterator *)_cookie;
struct entry *entry;
entry = iterator->Next();
if (entry != NULL)
return entry->root->GetName(name, size);
return B_ENTRY_NOT_FOUND;
}
status_t
RootFileSystem::GetNextNode(void *_cookie, Node **_node)
{
EntryIterator *iterator = (EntryIterator *)_cookie;
struct entry *entry;
entry = iterator->Next();
if (entry != NULL) {
*_node = entry->root;
return B_OK;
}
return B_ENTRY_NOT_FOUND;
}
status_t
RootFileSystem::Rewind(void *_cookie)
{
EntryIterator *iterator = (EntryIterator *)_cookie;
iterator->Rewind();
return B_OK;
}
bool
RootFileSystem::IsEmpty()
{
return fList.IsEmpty();
}
status_t
RootFileSystem::AddVolume(Directory *volume, Partition *partition)
{
struct entry *entry = new (std::nothrow) RootFileSystem::entry();
if (entry == NULL)
return B_NO_MEMORY;
volume->Acquire();
entry->name = NULL;
entry->root = volume;
entry->partition = partition;
fList.Add(entry);
return B_OK;
}
status_t
RootFileSystem::AddLink(const char *name, Directory *target)
{
struct entry *entry = new (std::nothrow) RootFileSystem::entry();
if (entry == NULL)
return B_NO_MEMORY;
target->Acquire();
entry->name = name;
entry->root = target;
fLinks.Add(entry);
return B_OK;
}
status_t
RootFileSystem::GetPartitionFor(Directory *volume, Partition **_partition)
{
EntryIterator iterator = fList.GetIterator();
struct entry *entry;
while ((entry = iterator.Next()) != NULL) {
if (entry->root == volume) {
*_partition = entry->partition;
return B_OK;
}
}
return B_ENTRY_NOT_FOUND;
}