hdt: Adding say command
[profile/ivi/syslinux.git] / com32 / hdt / hdt-cli-hdt.c
1 /* ----------------------------------------------------------------------- *
2  *
3  *   Copyright 2009 Pierre-Alexandre Meyer - 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 <stdio.h>
30 #include <string.h>
31 #include <stdlib.h>
32 #include <syslinux/config.h>
33 #include <syslinux/reboot.h>
34
35 #include "hdt-menu.h"
36 #include "hdt-cli.h"
37 #include "hdt-common.h"
38
39 /**
40  * cli_clear_screen - clear (erase) the entire screen
41  **/
42 static void cli_clear_screen(int argc __unused, char **argv __unused,
43                              struct s_hardware *hardware __unused)
44 {
45     clear_screen();
46 }
47
48 /**
49  * main_show_modes - show availables modes
50  **/
51 static void main_show_modes(int argc __unused, char **argv __unused,
52                             struct s_hardware *hardware __unused)
53 {
54     int i = 0;
55
56     reset_more_printf();
57     printf("Available modes:\n");
58     while (list_modes[i]) {
59         printf("%s ", list_modes[i]->name);
60         i++;
61     }
62     printf("\n");
63 }
64
65 /**
66  * cli_set_mode - set the mode of the cli, in the cli
67  *
68  * The mode number must be supplied in argv, position 0.
69  **/
70 static void cli_set_mode(int argc, char **argv, struct s_hardware *hardware)
71 {
72     cli_mode_t new_mode;
73
74     reset_more_printf();
75     if (argc <= 0) {
76         more_printf("Which mode?\n");
77         return;
78     }
79
80     /*
81      * Note! argv[0] is a string representing the mode, we need the
82      * equivalent cli_mode_t to pass it to set_mode.
83      */
84     new_mode = mode_s_to_mode_t(argv[0]);
85     set_mode(new_mode, hardware);
86 }
87
88 /**
89  * do_exit - shared helper to exit a mode
90  **/
91 static void do_exit(int argc __unused, char **argv __unused,
92                     struct s_hardware *hardware)
93 {
94     int new_mode = HDT_MODE;
95
96     switch (hdt_cli.mode) {
97     case HDT_MODE:
98         new_mode = EXIT_MODE;
99         break;
100     default:
101         new_mode = HDT_MODE;
102         break;
103     }
104
105     dprintf("CLI DEBUG: Switching from mode %d to mode %d\n", hdt_cli.mode,
106             new_mode);
107     set_mode(new_mode, hardware);
108 }
109
110 /**
111  * show_cli_help - shared helper to show available commands
112  **/
113 static void show_cli_help(int argc __unused, char **argv __unused,
114                           struct s_hardware *hardware __unused)
115 {
116     int j = 0;
117     struct cli_mode_descr *current_mode;
118     struct cli_callback_descr *associated_module = NULL;
119
120     find_cli_mode_descr(hdt_cli.mode, &current_mode);
121
122     printf("Available commands are:\n");
123
124     /* List first default modules of the mode */
125     if (current_mode->default_modules && current_mode->default_modules->modules) {
126         while (current_mode->default_modules->modules[j].name) {
127             printf("%s ", current_mode->default_modules->modules[j].name);
128             j++;
129         }
130         printf("\n");
131     }
132
133     /* List finally the default modules of the hdt mode */
134     if (current_mode->mode != hdt_mode.mode &&
135         hdt_mode.default_modules && hdt_mode.default_modules->modules) {
136         j = 0;
137         while (hdt_mode.default_modules->modules[j].name) {
138             /*
139              * Any default command that is present in hdt mode but
140              * not in the current mode is available. A default
141              * command can be redefined in the current mode though.
142              * This next call test this use case: if it is
143              * overwritten, do not print it again.
144              */
145             find_cli_callback_descr(hdt_mode.default_modules->modules[j].name,
146                                     current_mode->default_modules,
147                                     &associated_module);
148             if (associated_module == NULL)
149                 printf("%s ", hdt_mode.default_modules->modules[j].name);
150             j++;
151         }
152         printf("\n");
153     }
154
155     /* List secondly the show modules of the mode */
156     if (current_mode->show_modules && current_mode->show_modules->modules) {
157         printf("\nshow commands:\n");
158         j = 0;
159         while (current_mode->show_modules->modules[j].name) {
160             printf("%s ", current_mode->show_modules->modules[j].name);
161             j++;
162         }
163         printf("\n");
164     }
165
166     /* List thirdly the set modules of the mode */
167     if (current_mode->set_modules && current_mode->set_modules->modules) {
168         printf("\nset commands:\n");
169         j = 0;
170         while (current_mode->set_modules->modules[j].name) {
171             printf("%s ", current_mode->set_modules->modules[j].name);
172             j++;
173         }
174         printf("\n");
175     }
176
177
178     printf("\n");
179     main_show_modes(argc, argv, hardware);
180 }
181
182 /**
183  * show_cli_help - shared helper to show available commands
184  **/
185 static void goto_menu(int argc __unused, char **argv __unused,
186                       struct s_hardware *hardware)
187 {
188     char version_string[256];
189     snprintf(version_string, sizeof version_string, "%s %s (%s)",
190              PRODUCT_NAME, VERSION, CODENAME);
191     start_menu_mode(hardware, version_string);
192     return;
193 }
194
195 /**
196  * main_show_summary - give an overview of the system
197  **/
198 void main_show_summary(int argc __unused, char **argv __unused,
199                        struct s_hardware *hardware)
200 {
201     reset_more_printf();
202     clear_screen();
203     main_show_cpu(argc, argv, hardware);
204     if (hardware->is_dmi_valid) {
205         more_printf("System\n");
206         more_printf(" Manufacturer : %s\n", hardware->dmi.system.manufacturer);
207         more_printf(" Product Name : %s\n", hardware->dmi.system.product_name);
208         more_printf(" Serial       : %s\n", hardware->dmi.system.serial);
209         more_printf("Bios\n");
210         more_printf(" Version      : %s\n", hardware->dmi.bios.version);
211         more_printf(" Release      : %s\n", hardware->dmi.bios.release_date);
212         more_printf("Memory Size   : %lu MB (%lu KB)\n",
213                     (hardware->detected_memory_size + (1 << 9)) >> 10,
214                     hardware->detected_memory_size);
215     }
216     main_show_pci(argc, argv, hardware);
217
218     if (hardware->is_pxe_valid)
219         main_show_pxe(argc, argv, hardware);
220
221     main_show_kernel(argc, argv, hardware);
222 }
223
224 void main_show_hdt(int argc __unused, char **argv __unused,
225                    struct s_hardware *hardware __unused)
226 {
227     reset_more_printf();
228     more_printf("HDT\n");
229     more_printf(" Product        : %s\n", PRODUCT_NAME);
230     more_printf(" Version        : %s (%s)\n", VERSION, CODENAME);
231     more_printf(" Website        : %s\n", WEBSITE_URL);
232     more_printf(" IRC Channel    : %s\n", IRC_CHANNEL);
233     more_printf(" Mailing List   : %s\n", CONTACT);
234     more_printf(" Project Leader : %s\n", AUTHOR);
235     more_printf(" Core Developer : %s\n", CORE_DEVELOPER);
236     char *contributors[NB_CONTRIBUTORS] = CONTRIBUTORS;
237     for (int c = 0; c < NB_CONTRIBUTORS; c++) {
238         more_printf(" Contributor    : %s\n", contributors[c]);
239     }
240 }
241
242 /**
243  * do_reboot - reboot the system
244  **/
245 static void do_reboot(int argc __unused, char **argv __unused,
246                       struct s_hardware *hardware)
247 {
248     (void) hardware;
249     /* Let's call the internal rebooting call */
250     syslinux_reboot(1);
251 }
252
253 /**
254  * do_dump - dump info
255  **/
256 static void do_dump(int argc __unused, char **argv __unused,
257                       struct s_hardware *hardware)
258 {
259     dump(hardware);
260 }
261
262 /**
263  * do_say - say message to user
264  **/
265 static void do_say(int argc , char **argv ,
266                       struct s_hardware *hardware)
267 {
268    (void) hardware;
269    if (argc == 0) return;
270
271    char text_to_say[255]={0};
272    int arg=0;
273    int sleep_time=0;
274 #if DEBUG
275    for (int i=0; i<argc;i++) dprintf("SAY: arg[%d]={%s}\n",i,argv[i]);
276 #endif
277    char *argument = strchr(argv[arg],'`');
278    if ( argument != NULL) {
279         argument++;
280         strcat(text_to_say, argument);
281
282         while ((strchr(argument, '`') == NULL) && (arg+1<argc)) {
283                 arg++;
284                 argument = (char *)argv[arg];
285                 strcat(text_to_say, " ");
286                 strcat(text_to_say, argument);
287         }
288     
289         /* Removing last ` if any */
290         char *last_quote = strrchr(text_to_say,'`');
291         if ( last_quote != NULL ) {
292         *last_quote='\0';
293         dprintf("SAY CMD = [%s]\n",text_to_say);           
294         }
295
296         /* The % char can be in the same argument, let's consider it again */
297         arg--;
298
299         /* Searching for a % argument to determine the time to show the message */
300         char *time_to_display = NULL;
301         /* Search for a requested time to display */
302         while ( ((time_to_display=strchr(argument, '%')) == NULL) && (arg+1<argc)) {
303                 arg++;
304                 argument = (char *)argv[arg];
305         }
306
307         if (time_to_display != NULL) {
308                 sleep_time=atoi(time_to_display+1);
309                 dprintf("SAY CMD :Time to display = %d\n",sleep_time);     
310         }
311
312         printf("%s\n",text_to_say);
313         sleep(sleep_time);
314   }
315 }
316
317 /* Default hdt mode */
318 struct cli_callback_descr list_hdt_default_modules[] = {
319     {
320      .name = CLI_CLEAR,
321      .exec = cli_clear_screen,
322      .nomodule = false,
323      },
324     {
325      .name = CLI_EXIT,
326      .exec = do_exit,
327      .nomodule = false,
328      },
329     {
330      .name = CLI_HELP,
331      .exec = show_cli_help,
332      .nomodule = false,
333      },
334     {
335      .name = CLI_MENU,
336      .exec = goto_menu,
337      .nomodule = false,
338      },
339     {
340      .name = CLI_REBOOT,
341      .exec = do_reboot,
342      .nomodule = false,
343      },
344     {
345      .name = CLI_HISTORY,
346      .exec = print_history,
347      .nomodule = false,
348      },
349     {
350      .name = CLI_DUMP,
351      .exec = do_dump,
352      .nomodule = false,
353      },
354     {
355      .name = CLI_SAY,
356      .exec = do_say,
357      .nomodule = true,
358      },
359     {
360      .name = NULL,
361      .exec = NULL,
362      .nomodule = false},
363 };
364
365 struct cli_callback_descr list_hdt_show_modules[] = {
366     {
367      .name = CLI_SUMMARY,
368      .exec = main_show_summary,
369      .nomodule = false,
370      },
371     {
372      .name = CLI_PCI,
373      .exec = main_show_pci,
374      .nomodule = false,
375      },
376     {
377      .name = CLI_DMI,
378      .exec = main_show_dmi,
379      .nomodule = false,
380      },
381     {
382      .name = CLI_CPU,
383      .exec = main_show_cpu,
384      .nomodule = false,
385      },
386     {
387      .name = CLI_DISK,
388      .exec = disks_summary,
389      .nomodule = false,
390      },
391     {
392      .name = CLI_PXE,
393      .exec = main_show_pxe,
394      .nomodule = false,
395      },
396     {
397      .name = CLI_SYSLINUX,
398      .exec = main_show_syslinux,
399      .nomodule = false,
400      },
401     {
402      .name = CLI_KERNEL,
403      .exec = main_show_kernel,
404      .nomodule = false,
405      },
406     {
407      .name = CLI_VESA,
408      .exec = main_show_vesa,
409      .nomodule = false,
410      },
411     {
412      .name = CLI_HDT,
413      .exec = main_show_hdt,
414      .nomodule = false,
415      },
416     {
417      .name = CLI_VPD,
418      .exec = main_show_vpd,
419      .nomodule = false,
420      },
421     {
422      .name = CLI_MEMORY,
423      .exec = show_dmi_memory_modules,
424      .nomodule = false,
425      },
426     {
427      .name = CLI_ACPI,
428      .exec = main_show_acpi,
429      .nomodule = false,
430      },
431     {
432      .name = "modes",
433      .exec = main_show_modes,
434      .nomodule = false,
435      },
436     {
437      .name = NULL,
438      .exec = NULL,
439      .nomodule = false,
440      },
441 };
442
443 struct cli_callback_descr list_hdt_set_modules[] = {
444     {
445      .name = CLI_MODE,
446      .exec = cli_set_mode,
447      .nomodule = false,
448      },
449     {
450      .name = NULL,
451      .exec = NULL,
452      .nomodule = false,
453      },
454 };
455
456 struct cli_module_descr hdt_default_modules = {
457     .modules = list_hdt_default_modules,
458 };
459
460 struct cli_module_descr hdt_show_modules = {
461     .modules = list_hdt_show_modules,
462     .default_callback = main_show_summary,
463 };
464
465 struct cli_module_descr hdt_set_modules = {
466     .modules = list_hdt_set_modules,
467 };
468
469 struct cli_mode_descr hdt_mode = {
470     .mode = HDT_MODE,
471     .name = CLI_HDT,
472     .default_modules = &hdt_default_modules,
473     .show_modules = &hdt_show_modules,
474     .set_modules = &hdt_set_modules,
475 };