1 /* ----------------------------------------------------------------------- * 2 * 3 * Copyright 2009 Erwan Velu - All Rights Reserved 4 * 5 * Permission is hereby granted, free of charge, to any person 6 * obtaining a copy of this software and associated documentation 7 * files (the "Software"), to deal in the Software without 8 * restriction, including without limitation the rights to use, 9 * copy, modify, merge, publish, distribute, sublicense, and/or 10 * sell copies of the Software, and to permit persons to whom 11 * the Software is furnished to do so, subject to the following 12 * conditions: 13 * 14 * The above copyright notice and this permission notice shall 15 * be included in all copies or substantial portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 19 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 20 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 21 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 22 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 23 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 24 * OTHER DEALINGS IN THE SOFTWARE. 25 * 26 * ----------------------------------------------------------------------- 27 */ 28 29 #include <unistd.h> 30 #include <memory.h> 31 #include <syslinux/reboot.h> 32 #include "hdt-menu.h" 33 34 int start_menu_mode(struct s_hardware *hardware, char *version_string) 35 { 36 struct s_hdt_menu hdt_menu; 37 38 memset(&hdt_menu, 0, sizeof(hdt_menu)); 39 40 /* Setup the menu system */ 41 setup_menu(version_string); 42 43 /* Compute all submenus */ 44 compute_submenus(&hdt_menu, hardware); 45 46 /* Compute the main menu */ 47 compute_main_menu(&hdt_menu, hardware); 48 49 #ifdef WITH_MENU_DISPLAY 50 t_menuitem *curr; 51 char cmd[160]; 52 53 if (!quiet) 54 more_printf("Starting Menu (%d menus)\n", hdt_menu.total_menu_count); 55 curr = showmenus(hdt_menu.main_menu.menu); 56 /* When we exit the menu, do we have something to do? */ 57 if (curr) { 58 /* When want to execute something */ 59 if (curr->action == OPT_RUN) { 60 /* Tweak, we want to switch to the cli */ 61 if (!strncmp 62 (curr->data, HDT_SWITCH_TO_CLI, sizeof(HDT_SWITCH_TO_CLI))) { 63 return HDT_RETURN_TO_CLI; 64 } 65 /* Tweak, we want to start the dump mode */ 66 if (!strncmp 67 (curr->data, HDT_DUMP, sizeof(HDT_DUMP))) { 68 dump(hardware); 69 return 0; 70 } 71 if (!strncmp 72 (curr->data, HDT_REBOOT, sizeof(HDT_REBOOT))) { 73 syslinux_reboot(1); 74 } 75 strcpy(cmd, curr->data); 76 77 /* Use specific syslinux call if needed */ 78 if (issyslinux()) 79 runsyslinuxcmd(cmd); 80 else 81 csprint(cmd, 0x07); 82 return 1; // Should not happen when run from SYSLINUX 83 } 84 } 85 #endif 86 return 0; 87 } 88 89 /* In the menu system, what to do on keyboard timeout */ 90 TIMEOUTCODE ontimeout(void) 91 { 92 // beep(); 93 return CODE_WAIT; 94 } 95 96 /* Keyboard handler for the menu system */ 97 void keys_handler(t_menusystem * ms 98 __attribute__ ((unused)), t_menuitem * mi, int scancode) 99 { 100 int nr, nc; 101 102 /* 0xFFFF is an invalid helpid */ 103 if (scancode == KEY_F1 && mi->helpid != 0xFFFF) { 104 runhelpsystem(mi->helpid); 105 } 106 107 /* 108 * If user hit TAB, and item is an "executable" item 109 * and user has privileges to edit it, edit it in place. 110 */ 111 if ((scancode == KEY_TAB) && (mi->action == OPT_RUN)) { 112 //(isallowed(username,"editcmd") || isallowed(username,"root"))) { 113 if (getscreensize(1, &nr, &nc)) { 114 /* Unknown screen size? */ 115 nc = 80; 116 nr = 24; 117 } 118 /* User typed TAB and has permissions to edit command line */ 119 gotoxy(EDITPROMPT, 1); 120 csprint("Command line:", 0x07); 121 editstring(mi->data, ACTIONLEN); 122 gotoxy(EDITPROMPT, 1); 123 cprint(' ', 0x07, nc - 1); 124 } 125 } 126 127 /* Setup the Menu system */ 128 void setup_menu(char *version) 129 { 130 /* Creating the menu */ 131 init_menusystem(version); 132 set_window_size(0, 0, 25, 80); 133 134 /* Do not use inactive attributes - they make little sense for HDT */ 135 set_normal_attr(-1, -1, 0x17, 0x1F); 136 137 /* Register the menusystem handler */ 138 // reg_handler(HDLR_SCREEN,&msys_handler); 139 reg_handler(HDLR_KEYS, &keys_handler); 140 141 /* Register the ontimeout handler, with a time out of 10 seconds */ 142 reg_ontimeout(ontimeout, 1000, 0); 143 } 144 145 /* Compute Main' submenus */ 146 void compute_submenus(struct s_hdt_menu *hdt_menu, struct s_hardware *hardware) 147 { 148 149 /* Compute this menu if a DMI table exists */ 150 if (hardware->is_dmi_valid) { 151 if (hardware->dmi.ipmi.filled == true) 152 compute_ipmi(&hdt_menu->ipmi_menu, &hardware->dmi); 153 if (hardware->dmi.base_board.filled == true) 154 compute_motherboard(&(hdt_menu->mobo_menu), &(hardware->dmi)); 155 if (hardware->dmi.chassis.filled == true) 156 compute_chassis(&(hdt_menu->chassis_menu), &(hardware->dmi)); 157 if (hardware->dmi.system.filled == true) 158 compute_system(&(hdt_menu->system_menu), &(hardware->dmi)); 159 compute_memory(hdt_menu, &(hardware->dmi), hardware); 160 if (hardware->dmi.bios.filled == true) 161 compute_bios(&(hdt_menu->bios_menu), &(hardware->dmi)); 162 if (hardware->dmi.battery.filled == true) 163 compute_battery(&(hdt_menu->battery_menu), &(hardware->dmi)); 164 } 165 166 compute_processor(&(hdt_menu->cpu_menu), hardware); 167 compute_vpd(&(hdt_menu->vpd_menu), hardware); 168 compute_disks(hdt_menu, hardware); 169 170 compute_PCI(hdt_menu, hardware); 171 compute_PXE(&(hdt_menu->pxe_menu), hardware); 172 compute_kernel(&(hdt_menu->kernel_menu), hardware); 173 174 compute_summarymenu(&(hdt_menu->summary_menu), hardware); 175 compute_syslinuxmenu(&(hdt_menu->syslinux_menu), hardware); 176 compute_VESA(hdt_menu, hardware); 177 compute_ACPI(hdt_menu, hardware); 178 compute_aboutmenu(&(hdt_menu->about_menu)); 179 } 180 181 void compute_main_menu(struct s_hdt_menu *hdt_menu, struct s_hardware *hardware) 182 { 183 char menu_item[64]; 184 /* Let's count the number of menus we have */ 185 hdt_menu->total_menu_count = 0; 186 hdt_menu->main_menu.items_count = 0; 187 188 hdt_menu->main_menu.menu = add_menu(" Main Menu ", -1); 189 set_item_options(-1, 24); 190 191 snprintf(menu_item, sizeof(menu_item), "PC<I> Devices(%2d)\n", 192 hardware->nb_pci_devices); 193 add_item(menu_item, "PCI Devices Menu", OPT_SUBMENU, NULL, 194 hdt_menu->pci_menu.menu); 195 hdt_menu->main_menu.items_count++; 196 hdt_menu->total_menu_count += hdt_menu->pci_menu.items_count; 197 198 if (hdt_menu->disk_menu.items_count > 0) { 199 snprintf(menu_item, sizeof(menu_item), "<D>isks (%2d)\n", 200 hdt_menu->disk_menu.items_count); 201 add_item(menu_item, "Disks Menu", OPT_SUBMENU, NULL, 202 hdt_menu->disk_menu.menu); 203 hdt_menu->main_menu.items_count++; 204 hdt_menu->total_menu_count += hdt_menu->disk_menu.items_count; 205 } 206 207 snprintf(menu_item, sizeof(menu_item), "<M>emory\n"); 208 add_item(menu_item, "Memory Menu", OPT_SUBMENU, NULL, 209 hdt_menu->memory_menu.menu); 210 hdt_menu->main_menu.items_count++; 211 hdt_menu->total_menu_count += hdt_menu->memory_menu.items_count; 212 213 add_item("<P>rocessor", "Main Processor Menu", OPT_SUBMENU, NULL, 214 hdt_menu->cpu_menu.menu); 215 hdt_menu->main_menu.items_count++; 216 217 if (hardware->is_dmi_valid) { 218 if (hardware->dmi.base_board.filled == true) { 219 add_item("M<o>therboard", "Motherboard Menu", 220 OPT_SUBMENU, NULL, hdt_menu->mobo_menu.menu); 221 hdt_menu->main_menu.items_count++; 222 } 223 224 if (hardware->dmi.bios.filled == true) { 225 add_item("<B>ios", "Bios Menu", OPT_SUBMENU, NULL, 226 hdt_menu->bios_menu.menu); 227 hdt_menu->main_menu.items_count++; 228 } 229 230 if (hardware->dmi.chassis.filled == true) { 231 add_item("<C>hassis", "Chassis Menu", OPT_SUBMENU, NULL, 232 hdt_menu->chassis_menu.menu); 233 hdt_menu->main_menu.items_count++; 234 } 235 236 if (hardware->dmi.system.filled == true) { 237 add_item("<S>ystem", "System Menu", OPT_SUBMENU, NULL, 238 hdt_menu->system_menu.menu); 239 hdt_menu->main_menu.items_count++; 240 } 241 242 if (hardware->dmi.battery.filled == true) { 243 add_item("Ba<t>tery", "Battery Menu", OPT_SUBMENU, NULL, 244 hdt_menu->battery_menu.menu); 245 hdt_menu->main_menu.items_count++; 246 } 247 if (hardware->dmi.ipmi.filled == true) { 248 add_item("I<P>MI", "IPMI Menu", OPT_SUBMENU, NULL, 249 hdt_menu->ipmi_menu.menu); 250 hdt_menu->main_menu.items_count++; 251 } 252 } 253 254 if (hardware->is_vpd_valid == true) { 255 add_item("<V>PD", "VPD Information Menu", OPT_SUBMENU, NULL, 256 hdt_menu->vpd_menu.menu); 257 hdt_menu->main_menu.items_count++; 258 } 259 260 if (hardware->is_pxe_valid == true) { 261 add_item("P<X>E", "PXE Information Menu", OPT_SUBMENU, NULL, 262 hdt_menu->pxe_menu.menu); 263 hdt_menu->main_menu.items_count++; 264 } 265 266 if (hardware->is_vesa_valid == true) { 267 add_item("<V>ESA", "VESA Information Menu", OPT_SUBMENU, NULL, 268 hdt_menu->vesa_menu.menu); 269 hdt_menu->main_menu.items_count++; 270 } 271 272 if (hardware->is_acpi_valid == true) { 273 add_item("<A>CPI", "ACPI Menu", OPT_SUBMENU, NULL, 274 hdt_menu->acpi_menu.menu); 275 hdt_menu->main_menu.items_count++; 276 } 277 278 add_item("", "", OPT_SEP, "", 0); 279 280 if ((hardware->modules_pcimap_return_code != -ENOMODULESPCIMAP) || 281 (hardware->modules_alias_return_code != -ENOMODULESALIAS)) { 282 add_item("<K>ernel Modules", "Kernel Modules Menu", OPT_SUBMENU, 283 NULL, hdt_menu->kernel_menu.menu); 284 hdt_menu->main_menu.items_count++; 285 } 286 287 add_item("S<y>slinux", "Syslinux Information Menu", OPT_SUBMENU, NULL, 288 hdt_menu->syslinux_menu.menu); 289 hdt_menu->main_menu.items_count++; 290 add_item("S<u>mmary", "Summary Information Menu", OPT_SUBMENU, NULL, 291 hdt_menu->summary_menu.menu); 292 hdt_menu->main_menu.items_count++; 293 294 add_item("", "", OPT_SEP, "", 0); 295 296 add_item("S<w>itch to CLI", "Switch to Command Line", OPT_RUN, 297 HDT_SWITCH_TO_CLI, 0); 298 299 if (hardware->is_pxe_valid == true) { 300 add_item("<D>ump to tftp", "Dump to tftp", OPT_RUN, 301 HDT_DUMP, 0); 302 } 303 304 add_item("<A>bout", "About Menu", OPT_SUBMENU, NULL, 305 hdt_menu->about_menu.menu); 306 add_item("<R>eboot", "Reboot", OPT_RUN, HDT_REBOOT, 0); 307 add_item("E<x>it", "Exit", OPT_EXITMENU, NULL, 0); 308 hdt_menu->main_menu.items_count++; 309 310 hdt_menu->total_menu_count += hdt_menu->main_menu.items_count; 311 } 312