static Menu * add_boot_volume_menu(Directory *bootVolume) { Menu *menu = new(nothrow) Menu(CHOICE_MENU, "Select Boot Volume"); MenuItem *item; void *cookie; int32 count = 0; if (gRoot->Open(&cookie, O_RDONLY) == B_OK) { Directory *volume; while (gRoot->GetNextNode(cookie, (Node **)&volume) == B_OK) { // only list bootable volumes if (!is_bootable(volume)) continue; char name[B_FILE_NAME_LENGTH]; if (volume->GetName(name, sizeof(name)) == B_OK) { menu->AddItem(item = new(nothrow) MenuItem(name)); item->SetTarget(user_menu_boot_volume); item->SetData(volume); if (volume == bootVolume) { item->SetMarked(true); item->Select(true); } count++; } } gRoot->Close(cookie); } if (count == 0) { // no boot volume found yet menu->AddItem(item = new(nothrow) MenuItem("<No boot volume found>")); item->SetType(MENU_ITEM_NO_CHOICE); item->SetEnabled(false); } menu->AddSeparatorItem(); menu->AddItem(item = new(nothrow) MenuItem("Rescan volumes")); item->SetHelpText("Please insert a Antares CD-ROM or attach a USB disk - " "depending on your system, you can then boot from them."); item->SetType(MENU_ITEM_NO_CHOICE); if (count == 0) item->Select(true); menu->AddItem(item = new(nothrow) MenuItem("Return to main menu")); item->SetType(MENU_ITEM_NO_CHOICE); if (gKernelArgs.boot_volume.GetBool(BOOT_VOLUME_BOOTED_FROM_IMAGE, false)) menu->SetChoiceText("CD-ROM or hard drive"); return menu; }