1 /* ----------------------------------------------------------------------- *
3 * Copyright 2009 Erwan Velu - All Rights Reserved
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
14 * The above copyright notice and this permission notice shall
15 * be included in all copies or substantial portions of the Software.
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.
26 * -----------------------------------------------------------------------
31 #include <syslinux/reboot.h>
34 int start_menu_mode(struct s_hardware
*hardware
, char *version_string
)
36 struct s_hdt_menu hdt_menu
;
38 memset(&hdt_menu
, 0, sizeof(hdt_menu
));
40 /* Setup the menu system */
41 setup_menu(version_string
);
43 /* Compute all submenus */
44 compute_submenus(&hdt_menu
, hardware
);
46 /* Compute the main menu */
47 compute_main_menu(&hdt_menu
, hardware
);
49 #ifdef WITH_MENU_DISPLAY
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? */
58 /* When want to execute something */
59 if (curr
->action
== OPT_RUN
) {
60 /* Tweak, we want to switch to the cli */
62 (curr
->data
, HDT_SWITCH_TO_CLI
, sizeof(HDT_SWITCH_TO_CLI
))) {
63 return HDT_RETURN_TO_CLI
;
65 /* Tweak, we want to start the dump mode */
67 (curr
->data
, HDT_DUMP
, sizeof(HDT_DUMP
))) {
72 (curr
->data
, HDT_REBOOT
, sizeof(HDT_REBOOT
))) {
75 strcpy(cmd
, curr
->data
);
77 /* Use specific syslinux call if needed */
82 return 1; // Should not happen when run from SYSLINUX
89 /* In the menu system, what to do on keyboard timeout */
90 TIMEOUTCODE
ontimeout(void)
96 /* Keyboard handler for the menu system */
97 void keys_handler(t_menusystem
* ms
98 __attribute__ ((unused
)), t_menuitem
* mi
, int scancode
)
102 /* 0xFFFF is an invalid helpid */
103 if (scancode
== KEY_F1
&& mi
->helpid
!= 0xFFFF) {
104 runhelpsystem(mi
->helpid
);
108 * If user hit TAB, and item is an "executable" item
109 * and user has privileges to edit it, edit it in place.
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? */
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);
127 /* Setup the Menu system */
128 void setup_menu(char *version
)
130 /* Creating the menu */
131 init_menusystem(version
);
132 set_window_size(0, 0, 25, 80);
134 /* Do not use inactive attributes - they make little sense for HDT */
135 set_normal_attr(-1, -1, 0x17, 0x1F);
137 /* Register the menusystem handler */
138 // reg_handler(HDLR_SCREEN,&msys_handler);
139 reg_handler(HDLR_KEYS
, &keys_handler
);
141 /* Register the ontimeout handler, with a time out of 10 seconds */
142 reg_ontimeout(ontimeout
, 1000, 0);
145 /* Compute Main' submenus */
146 void compute_submenus(struct s_hdt_menu
*hdt_menu
, struct s_hardware
*hardware
)
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
));
166 compute_processor(&(hdt_menu
->cpu_menu
), hardware
);
167 compute_vpd(&(hdt_menu
->vpd_menu
), hardware
);
168 compute_disks(hdt_menu
, hardware
);
170 compute_PCI(hdt_menu
, hardware
);
171 compute_PXE(&(hdt_menu
->pxe_menu
), hardware
);
172 compute_kernel(&(hdt_menu
->kernel_menu
), hardware
);
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
));
181 void compute_main_menu(struct s_hdt_menu
*hdt_menu
, struct s_hardware
*hardware
)
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;
188 hdt_menu
->main_menu
.menu
= add_menu(" Main Menu ", -1);
189 set_item_options(-1, 24);
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
;
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
;
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
;
213 add_item("<P>rocessor", "Main Processor Menu", OPT_SUBMENU
, NULL
,
214 hdt_menu
->cpu_menu
.menu
);
215 hdt_menu
->main_menu
.items_count
++;
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
++;
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
++;
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
++;
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
++;
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
++;
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
++;
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
++;
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
++;
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
++;
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
++;
278 add_item("", "", OPT_SEP
, "", 0);
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
++;
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
++;
294 add_item("", "", OPT_SEP
, "", 0);
296 add_item("S<w>itch to CLI", "Switch to Command Line", OPT_RUN
,
297 HDT_SWITCH_TO_CLI
, 0);
299 if (hardware
->is_pxe_valid
== true) {
300 add_item("<D>ump to tftp", "Dump to tftp", OPT_RUN
,
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
++;
310 hdt_menu
->total_menu_count
+= hdt_menu
->main_menu
.items_count
;