status_t add_stage2_driver_settings(stage2_args* args) { // TODO: split more intelligently for (const char** arg = args->arguments; arg != NULL && args->arguments_count-- && arg[0] != NULL; arg++) { dprintf("adding args: '%s'\n", arg[0]); add_safe_mode_settings((char*)arg[0]); } return B_OK; }
static void apply_safe_mode_options(Menu* menu) { char buffer[2048]; int32 pos = 0; buffer[0] = '\0'; MenuItemIterator iterator = menu->ItemIterator(); while (MenuItem* item = iterator.Next()) { if (item->Type() == MENU_ITEM_SEPARATOR || !item->IsMarked() || item->Data() == NULL || (uint32)pos > sizeof(buffer)) continue; size_t totalBytes = snprintf(buffer + pos, sizeof(buffer) - pos, "%s true\n", (const char*)item->Data()); pos += std::min(totalBytes, sizeof(buffer) - pos - 1); } add_safe_mode_settings(buffer); }
status_t user_menu(BootVolume& _bootVolume, PathBlacklist& _pathBlacklist) { Menu* menu = new(std::nothrow) Menu(MAIN_MENU); sMainMenu = menu; sBootVolume = &_bootVolume; sPathBlacklist = &_pathBlacklist; Menu* safeModeMenu = NULL; Menu* debugMenu = NULL; MenuItem* item; TRACE(("user_menu: enter\n")); // Add boot volume menu->AddItem(item = new(std::nothrow) MenuItem("Select boot volume", add_boot_volume_menu())); // Add safe mode menu->AddItem(item = new(std::nothrow) MenuItem("Select safe mode options", safeModeMenu = add_safe_mode_menu())); // add debug menu menu->AddItem(item = new(std::nothrow) MenuItem("Select debug options", debugMenu = add_debug_menu())); // Add platform dependent menus platform_add_menus(menu); menu->AddSeparatorItem(); menu->AddItem(item = new(std::nothrow) MenuItem("Reboot")); item->SetTarget(user_menu_reboot); item->SetShortcut('r'); menu->AddItem(item = new(std::nothrow) MenuItem("Continue booting")); if (!_bootVolume.IsValid()) { item->SetEnabled(false); menu->ItemAt(0)->Select(true); } else item->SetShortcut('b'); menu->Run(); apply_safe_mode_options(safeModeMenu); apply_safe_mode_options(debugMenu); apply_safe_mode_path_blacklist(); add_safe_mode_settings(sSafeModeOptionsBuffer.String()); delete menu; TRACE(("user_menu: leave\n")); sMainMenu = NULL; sBlacklistRootMenu = NULL; sBootVolume = NULL; sPathBlacklist = NULL; return B_OK; }