* Implemented open_module_list_etc() in libkernel_emu.so as well.

* Added license.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24874 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2008-04-09 14:45:17 +00:00
parent 8b79f1fd68
commit afaf6f2f1b
+53 -15
View File
@@ -1,4 +1,11 @@
// kernelland_emu.cpp /*
* Copyright 2002-2008, Haiku Inc. All Rights Reserved.
* Distributed under the terms of the MIT license.
*
* Authors:
* Ingo Weinhold, [email protected].
* Axel Dörfler, [email protected].
*/
#include <lock.h> #include <lock.h>
#include <fs/devfs.h> #include <fs/devfs.h>
@@ -112,7 +119,8 @@ public:
status_t GetNextLoadedModuleName(uint32 *cookie, char *buffer, status_t GetNextLoadedModuleName(uint32 *cookie, char *buffer,
size_t *bufferSize); size_t *bufferSize);
module_name_list *OpenModuleList(const char *prefix); module_name_list *OpenModuleList(const char *prefix,
const char *suffix = NULL);
status_t ReadNextModuleName(module_name_list *list, char *buffer, status_t ReadNextModuleName(module_name_list *list, char *buffer,
size_t *bufferSize); size_t *bufferSize);
status_t CloseModuleList(module_name_list *list); status_t CloseModuleList(module_name_list *list);
@@ -123,9 +131,11 @@ public:
void PutDependencies(image_id image); void PutDependencies(image_id image);
private: private:
bool _MatchSuffix(const char *name, const char *suffix);
void _FindModules(BDirectory &dir, const char *moduleDir, void _FindModules(BDirectory &dir, const char *moduleDir,
const char *suffix, module_name_list *list);
void _FindBuiltInModules(const char *prefix, const char *suffix,
module_name_list *list); module_name_list *list);
void _FindBuiltInModules(const char *prefix, module_name_list *list);
status_t _GetAddOn(const char *path, ModuleAddOn **addon); status_t _GetAddOn(const char *path, ModuleAddOn **addon);
void _PutAddOn(ModuleAddOn *addon); void _PutAddOn(ModuleAddOn *addon);
@@ -476,19 +486,19 @@ ModuleManager::GetNextLoadedModuleName(uint32 *cookie, char *buffer,
// OpenModuleList // OpenModuleList
module_name_list * module_name_list *
ModuleManager::OpenModuleList(const char *prefix) ModuleManager::OpenModuleList(const char *prefix, const char *suffix)
{ {
module_name_list *list = NULL; module_name_list *list = NULL;
if (prefix) { if (prefix) {
list = new module_name_list; list = new module_name_list;
_FindBuiltInModules(prefix, list); _FindBuiltInModules(prefix, suffix, list);
for (int32 i = 0; gModuleDirs[i]; i++) { for (int32 i = 0; gModuleDirs[i]; i++) {
BPath path; BPath path;
BDirectory dir; BDirectory dir;
if (path.SetTo(gModuleDirs[i], prefix) == B_OK if (path.SetTo(gModuleDirs[i], prefix) == B_OK
&& dir.SetTo(path.Path()) == B_OK) { && dir.SetTo(path.Path()) == B_OK) {
_FindModules(dir, gModuleDirs[i], list); _FindModules(dir, gModuleDirs[i], suffix, list);
} }
} }
@@ -578,9 +588,25 @@ ModuleManager::PutDependencies(image_id image)
} }
bool
ModuleManager::_MatchSuffix(const char *name, const char *suffix)
{
if (suffix == NULL || suffix[0] == '\0')
return true;
size_t suffixLength = strlen(suffix);
size_t length = strlen(name);
if (length <= suffixLength)
return false;
return name[length - suffixLength - 1] == '/'
&& !strcmp(name + length - suffixLength, suffix);
}
void void
ModuleManager::_FindModules(BDirectory &dir, const char *moduleDir, ModuleManager::_FindModules(BDirectory &dir, const char *moduleDir,
module_name_list *list) const char *suffix, module_name_list *list)
{ {
BEntry entry; BEntry entry;
while (dir.GetNextEntry(&entry) == B_OK) { while (dir.GetNextEntry(&entry) == B_OK) {
@@ -591,28 +617,31 @@ ModuleManager::_FindModules(BDirectory &dir, const char *moduleDir,
&& addon.Load(path.Path(), moduleDir) == B_OK) { && addon.Load(path.Path(), moduleDir) == B_OK) {
module_info **infos = addon.ModuleInfos(); module_info **infos = addon.ModuleInfos();
for (int32 i = 0; infos[i]; i++) { for (int32 i = 0; infos[i]; i++) {
if (infos[i]->name) if (infos[i]->name
&& _MatchSuffix(infos[i]->name, suffix))
list->names.insert(infos[i]->name); list->names.insert(infos[i]->name);
} }
} }
} else if (entry.IsDirectory()) { } else if (entry.IsDirectory()) {
BDirectory subdir; BDirectory subdir;
if (subdir.SetTo(&entry) == B_OK) if (subdir.SetTo(&entry) == B_OK)
_FindModules(subdir, moduleDir, list); _FindModules(subdir, moduleDir, suffix, list);
} }
} }
} }
void void
ModuleManager::_FindBuiltInModules(const char *prefix, module_name_list *list) ModuleManager::_FindBuiltInModules(const char *prefix, const char *suffix,
module_name_list *list)
{ {
uint32 count = fModules.CountModules(); uint32 count = fModules.CountModules();
uint32 prefixLength = strlen(prefix); uint32 prefixLength = strlen(prefix);
for (uint32 i = 0; i < count; i++) { for (uint32 i = 0; i < count; i++) {
Module *module = fModules.ModuleAt(i); Module *module = fModules.ModuleAt(i);
if (!strncmp(module->Info()->name, prefix, prefixLength)) if (!strncmp(module->Info()->name, prefix, prefixLength)
&& _MatchSuffix(module->Info()->name, suffix))
list->names.insert(module->Info()->name); list->names.insert(module->Info()->name);
} }
} }
@@ -739,14 +768,22 @@ get_next_loaded_module_name(uint32 *cookie, char *name, size_t *nameLength)
} }
void *
open_module_list_etc(const char *prefix, const char *suffix)
{
TRACE(("open_module_list_etc('%s', '%s')\n", prefix, suffix));
return (void*)ModuleManager::Default()->OpenModuleList(prefix, suffix);
}
void * void *
open_module_list(const char *prefix) open_module_list(const char *prefix)
{ {
TRACE(("open_module_list(`%s')\n", prefix)); TRACE(("open_module_list('%s')\n", prefix));
return (void*)ModuleManager::Default()->OpenModuleList(prefix); return (void*)ModuleManager::Default()->OpenModuleList(prefix);
} }
// read_next_module_name
status_t status_t
read_next_module_name(void *cookie, char *buf, size_t *bufsize) read_next_module_name(void *cookie, char *buf, size_t *bufsize)
{ {
@@ -755,7 +792,7 @@ read_next_module_name(void *cookie, char *buf, size_t *bufsize)
(module_name_list*)cookie, buf, bufsize); (module_name_list*)cookie, buf, bufsize);
} }
// close_module_list
status_t status_t
close_module_list(void *cookie) close_module_list(void *cookie)
{ {
@@ -766,7 +803,8 @@ close_module_list(void *cookie)
thread_id thread_id
spawn_kernel_thread(thread_func func, const char *name, int32 priority, void *data) spawn_kernel_thread(thread_func func, const char *name, int32 priority,
void *data)
{ {
return spawn_thread(func, name, priority, data); return spawn_thread(func, name, priority, data);
} }