Added a SUPPORT_BOOTFS definition and made the vfs_get_module_path() the new
standard mechanism - recurse_directory() is now only used if SUPPORT_BOOTFS is defined and vfs_get_module_path() failed. Added standard system kernel add-ons directory to the search path list. Renamed USER_MODULE_PATHS to FIRST_USER_MODULE_PATH as that's what it is. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@10599 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
+35
-28
@@ -21,7 +21,18 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
|
|
||||||
|
//#define TRACE_MODULE
|
||||||
|
#ifdef TRACE_MODULE
|
||||||
|
# define TRACE(x) dprintf x
|
||||||
|
#else
|
||||||
|
# define TRACE(x) ;
|
||||||
|
#endif
|
||||||
|
#define FATAL(x) dprintf x
|
||||||
|
|
||||||
|
|
||||||
#define MODULE_HASH_SIZE 16
|
#define MODULE_HASH_SIZE 16
|
||||||
|
#define SUPPORT_BOOTFS
|
||||||
|
|
||||||
/** The modules referenced by this structure are built-in
|
/** The modules referenced by this structure are built-in
|
||||||
* modules that can't be loaded from disk.
|
* modules that can't be loaded from disk.
|
||||||
@@ -49,15 +60,6 @@ static module_info *sBuiltInModules[] = {
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
//#define TRACE_MODULE
|
|
||||||
#ifdef TRACE_MODULE
|
|
||||||
# define TRACE(x) dprintf x
|
|
||||||
#else
|
|
||||||
# define TRACE(x) ;
|
|
||||||
#endif
|
|
||||||
#define FATAL(x) dprintf x
|
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
MODULE_QUERIED = 0,
|
MODULE_QUERIED = 0,
|
||||||
MODULE_LOADED,
|
MODULE_LOADED,
|
||||||
@@ -141,16 +143,19 @@ static recursive_lock sModulesLock;
|
|||||||
/* These are the standard base paths where we start to look for modules
|
/* These are the standard base paths where we start to look for modules
|
||||||
* to load. Order is important, the last entry here will be searched
|
* to load. Order is important, the last entry here will be searched
|
||||||
* first.
|
* first.
|
||||||
* ToDo: these are not yet BeOS compatible (because the current bootfs is very limited)
|
* ToDo: the first entry is only there for bootfs compatibility
|
||||||
* ToDo: these should probably be retrieved by using find_directory().
|
* ToDo: these should probably be retrieved by using find_directory().
|
||||||
*/
|
*/
|
||||||
static const char * const sModulePaths[] = {
|
static const char * const sModulePaths[] = {
|
||||||
|
#ifdef SUPPORT_BOOTFS
|
||||||
"/boot/addons/kernel",
|
"/boot/addons/kernel",
|
||||||
|
#endif
|
||||||
|
"/boot/beos/system/add-ons/kernel",
|
||||||
"/boot/home/config/add-ons/kernel",
|
"/boot/home/config/add-ons/kernel",
|
||||||
};
|
};
|
||||||
|
|
||||||
#define NUM_MODULE_PATHS (sizeof(sModulePaths) / sizeof(sModulePaths[0]))
|
#define NUM_MODULE_PATHS (sizeof(sModulePaths) / sizeof(sModulePaths[0]))
|
||||||
#define USER_MODULE_PATHS 1 /* first user path */
|
#define FIRST_USER_MODULE_PATH (NUM_MODULE_PATHS - 1) /* first user path */
|
||||||
|
|
||||||
/* we store the loaded modules by directory path, and all known modules by module name
|
/* we store the loaded modules by directory path, and all known modules by module name
|
||||||
* in a hash table for quick access
|
* in a hash table for quick access
|
||||||
@@ -562,28 +567,30 @@ search_module(const char *name)
|
|||||||
|
|
||||||
TRACE(("search_module(%s)\n", name));
|
TRACE(("search_module(%s)\n", name));
|
||||||
|
|
||||||
// ToDo: As Ingo found out, BeOS uses the module name to locate the module
|
|
||||||
// on disk. We now have the vfs_get_module_path() call to achieve this.
|
|
||||||
// As soon as we boot from a file system other than bootfs, we should
|
|
||||||
// change the loading behaviour to only use that function (bootfs has
|
|
||||||
// a very low maximum path length, which makes it unable to contain
|
|
||||||
// the standard module directories).
|
|
||||||
// The call to vfs_get_module_path() is only for testing purposes
|
|
||||||
|
|
||||||
for (i = 0; i < NUM_MODULE_PATHS; i++) {
|
for (i = 0; i < NUM_MODULE_PATHS; i++) {
|
||||||
if (sDisableUserAddOns && i >= USER_MODULE_PATHS)
|
char path[B_FILE_NAME_LENGTH];
|
||||||
|
|
||||||
|
if (sDisableUserAddOns && i >= FIRST_USER_MODULE_PATH)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
{
|
// let's the VFS find that module for us
|
||||||
char path[B_FILE_NAME_LENGTH];
|
|
||||||
if (vfs_get_module_path(sModulePaths[i], name, path, sizeof(path)) < B_OK) {
|
status = vfs_get_module_path(sModulePaths[i], name, path, sizeof(path));
|
||||||
TRACE(("vfs_get_module_path() failed for \"%s\"\n", name));
|
if (status == B_OK) {
|
||||||
} else {
|
status = check_module_image(path, name);
|
||||||
TRACE(("vfs_get_module_path(): found \"%s\" (for \"%s\")\n", path, name));
|
if (status == B_OK)
|
||||||
}
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef SUPPORT_BOOTFS
|
||||||
|
// BeOS uses the module name to locate the module on disk. We now have the
|
||||||
|
// above vfs_get_module_path() call to achieve this.
|
||||||
|
// "bootfs" has a very low maximum path length, which makes it unable to
|
||||||
|
// contain the standard module directories).
|
||||||
|
|
||||||
if ((status = recurse_directory(sModulePaths[i], name)) == B_OK)
|
if ((status = recurse_directory(sModulePaths[i], name)) == B_OK)
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status != B_OK)
|
if (status != B_OK)
|
||||||
@@ -1114,7 +1121,7 @@ open_module_list(const char *prefix)
|
|||||||
for (i = 0; i < NUM_MODULE_PATHS; i++) {
|
for (i = 0; i < NUM_MODULE_PATHS; i++) {
|
||||||
const char *path;
|
const char *path;
|
||||||
|
|
||||||
if (sDisableUserAddOns && i >= USER_MODULE_PATHS)
|
if (sDisableUserAddOns && i >= FIRST_USER_MODULE_PATH)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
path = strdup(sModulePaths[i]);
|
path = strdup(sModulePaths[i]);
|
||||||
|
|||||||
Reference in New Issue
Block a user