The safe mode options now actually do what they should do, ie. the

selected "/safemode/" options are now passed to the kernel.
Added help texts to some safe mode options.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@12204 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2005-03-31 20:10:19 +00:00
parent 29150acff7
commit c1e0d8cf5e
3 changed files with 66 additions and 1 deletions

View File

@ -7,6 +7,7 @@
#include "load_driver_settings.h" #include "load_driver_settings.h"
#include <OS.h> #include <OS.h>
#include <drivers/driver_settings.h>
#include <boot/driver_settings.h> #include <boot/driver_settings.h>
#include <boot/kernel_args.h> #include <boot/kernel_args.h>
@ -82,3 +83,34 @@ load_driver_settings(stage2_args */*args*/, Directory *volume)
return B_OK; return B_OK;
} }
status_t
add_safe_mode_settings(char *settings)
{
if (settings == NULL || settings[0] == '\0')
return B_OK;
size_t length = strlen(settings);
char *buffer = (char *)kernel_args_malloc(length + 1);
if (buffer == NULL)
return B_NO_MEMORY;
driver_settings_file *file = (driver_settings_file *)kernel_args_malloc(sizeof(driver_settings_file));
if (file == NULL) {
kernel_args_free(buffer);
return B_NO_MEMORY;
}
strlcpy(file->name, B_SAFEMODE_DRIVER_SETTINGS, sizeof(file->name));
memcpy(buffer, settings, length + 1);
file->buffer = buffer;
file->size = length;
// add it to the list
file->next = gKernelArgs.driver_settings;
gKernelArgs.driver_settings = file;
return B_OK;
}

View File

@ -9,6 +9,7 @@
#include <boot/vfs.h> #include <boot/vfs.h>
extern status_t add_safe_mode_settings(char *buffer);
extern status_t load_driver_settings(stage2_args *args, Directory *volume); extern status_t load_driver_settings(stage2_args *args, Directory *volume);
#endif /* LOAD_DRIVER_SETTINGS_H */ #endif /* LOAD_DRIVER_SETTINGS_H */

View File

@ -7,6 +7,7 @@
#include "menu.h" #include "menu.h"
#include "loader.h" #include "loader.h"
#include "RootFileSystem.h" #include "RootFileSystem.h"
#include "load_driver_settings.h"
#include <OS.h> #include <OS.h>
@ -407,9 +408,15 @@ add_safe_mode_menu()
safeMenu->AddItem(item = new MenuItem("Safe mode")); safeMenu->AddItem(item = new MenuItem("Safe mode"));
item->SetData(B_SAFEMODE_SAFE_MODE); item->SetData(B_SAFEMODE_SAFE_MODE);
item->SetType(MENU_ITEM_MARKABLE); item->SetType(MENU_ITEM_MARKABLE);
item->SetHelpText("Puts the system into safe mode. This can be enabled independently "
"from the other options.");
safeMenu->AddItem(item = new MenuItem("Disable user add-ons")); safeMenu->AddItem(item = new MenuItem("Disable user add-ons"));
item->SetData(B_SAFEMODE_DISABLE_USER_ADD_ONS); item->SetData(B_SAFEMODE_DISABLE_USER_ADD_ONS);
item->SetType(MENU_ITEM_MARKABLE); item->SetType(MENU_ITEM_MARKABLE);
item->SetHelpText("Prevent all user installed add-ons to be loaded. Only the add-ons "
"in the system directory will be used.");
safeMenu->AddItem(item = new MenuItem("Disable IDE DMA")); safeMenu->AddItem(item = new MenuItem("Disable IDE DMA"));
item->SetData(B_SAFEMODE_DISABLE_IDE_DMA); item->SetData(B_SAFEMODE_DISABLE_IDE_DMA);
item->SetType(MENU_ITEM_MARKABLE); item->SetType(MENU_ITEM_MARKABLE);
@ -423,6 +430,27 @@ add_safe_mode_menu()
} }
static void
apply_safe_mode_options(Menu *menu)
{
MenuItemIterator iterator = menu->ItemIterator();
MenuItem *item;
char buffer[2048];
int32 pos = 0;
buffer[0] = '\0';
while ((item = iterator.Next()) != NULL) {
if (item->Type() == MENU_ITEM_SEPARATOR || !item->IsMarked() || (uint32)pos > sizeof(buffer))
continue;
pos += snprintf(buffer + pos, sizeof(buffer) - pos, "%s true\n", (const char *)item->Data());
}
add_safe_mode_settings(buffer);
}
static bool static bool
user_menu_reboot(Menu *menu, MenuItem *item) user_menu_reboot(Menu *menu, MenuItem *item)
{ {
@ -435,13 +463,14 @@ status_t
user_menu(Directory **_bootVolume) user_menu(Directory **_bootVolume)
{ {
Menu *menu = new Menu(MAIN_MENU); Menu *menu = new Menu(MAIN_MENU);
Menu *safeModeMenu;
MenuItem *item; MenuItem *item;
// Add boot volume // Add boot volume
menu->AddItem(item = new MenuItem("Select boot volume", add_boot_volume_menu(*_bootVolume))); menu->AddItem(item = new MenuItem("Select boot volume", add_boot_volume_menu(*_bootVolume)));
// Add safe mode // Add safe mode
menu->AddItem(item = new MenuItem("Select safe mode options", add_safe_mode_menu())); menu->AddItem(item = new MenuItem("Select safe mode options", safeModeMenu = add_safe_mode_menu()));
// Add platform dependent menus // Add platform dependent menus
platform_add_menus(menu); platform_add_menus(menu);
@ -464,6 +493,9 @@ user_menu(Directory **_bootVolume)
if (item->Data() != NULL) if (item->Data() != NULL)
*_bootVolume = (Directory *)item->Data(); *_bootVolume = (Directory *)item->Data();
apply_safe_mode_options(safeModeMenu);
delete menu;
return B_OK; return B_OK;
} }