summaryrefslogtreecommitdiff
path: root/commands
diff options
context:
space:
mode:
authorAhmad Fatoum <ahmad@a3f.at>2022-07-26 07:41:36 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2022-08-08 15:30:42 +0200
commitd5e8a370e3e8b46c4e713f2f47e0227fee101401 (patch)
treee4acbed21983775c1e8c63361af189ce5332c027 /commands
parentf6eccbf5924514087074129dca102f8b632c3f17 (diff)
downloadbarebox-d5e8a370e3e8b46c4e713f2f47e0227fee101401.tar.gz
commands: boot: support preselecting boot entry in menu
boot -m -t 3 already opens a boot menu with a countdown of 3 seconds before selecting the first element. So far, only way to influence preselection was shifting around boot entries, so they are iterated over differently. Add a new -M option that works analogously to -m, but takes an integer index of the boot menu entry to preselect. This allows simple customizable interactive boots: #!/bin/sh boot -M "$nv.bootmenu_default" -t 3 mmc0.0 With mmc0.0 containing multiple bootloader spec files that would be iterated over in lexical order. The index is 1-based like the index displayed in the boot menu. Signed-off-by: Ahmad Fatoum <ahmad@a3f.at> Link: https://lore.barebox.org/20220726054136.267069-1-ahmad@a3f.at Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'commands')
-rw-r--r--commands/boot.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/commands/boot.c b/commands/boot.c
index 18f4e36ec7..485559bc46 100644
--- a/commands/boot.c
+++ b/commands/boot.c
@@ -28,13 +28,14 @@ static int do_boot(int argc, char *argv[])
char *freep = NULL;
int opt, ret = 0, do_list = 0, do_menu = 0;
int dryrun = 0, verbose = 0, timeout = -1;
+ unsigned default_menu_entry = 0;
struct bootentries *entries;
struct bootentry *entry;
void *handle;
const char *name;
char *(*next)(void *);
- while ((opt = getopt(argc, argv, "vldmt:w:")) > 0) {
+ while ((opt = getopt(argc, argv, "vldmM:t:w:")) > 0) {
switch (opt) {
case 'v':
verbose++;
@@ -45,6 +46,16 @@ static int do_boot(int argc, char *argv[])
case 'd':
dryrun = 1;
break;
+ case 'M':
+ /* To simplify scripting, an empty string is treated as 1 */
+ if (*optarg == '\0') {
+ default_menu_entry = 1;
+ } else {
+ ret = kstrtouint(optarg, 0, &default_menu_entry);
+ if (ret)
+ return ret;
+ }
+ fallthrough;
case 'm':
do_menu = 1;
break;
@@ -104,7 +115,7 @@ static int do_boot(int argc, char *argv[])
if (do_list)
bootsources_list(entries);
else if (do_menu)
- bootsources_menu(entries, timeout);
+ bootsources_menu(entries, default_menu_entry, timeout);
ret = 0;
out:
@@ -136,6 +147,7 @@ BAREBOX_CMD_HELP_OPT ("-v","Increase verbosity")
BAREBOX_CMD_HELP_OPT ("-d","Dryrun. See what happens but do no actually boot")
BAREBOX_CMD_HELP_OPT ("-l","List available boot sources")
BAREBOX_CMD_HELP_OPT ("-m","Show a menu with boot options")
+BAREBOX_CMD_HELP_OPT ("-M INDEX","Show a menu with boot options with entry INDEX preselected")
BAREBOX_CMD_HELP_OPT ("-w SECS","Start watchdog with timeout SECS before booting")
BAREBOX_CMD_HELP_OPT ("-t SECS","specify timeout in SECS")
BAREBOX_CMD_HELP_END
@@ -143,7 +155,7 @@ BAREBOX_CMD_HELP_END
BAREBOX_CMD_START(boot)
.cmd = do_boot,
BAREBOX_CMD_DESC("boot from script, device, ...")
- BAREBOX_CMD_OPTS("[-vdlmwt] [BOOTSRC...]")
+ BAREBOX_CMD_OPTS("[-vdlmMwt] [BOOTSRC...]")
BAREBOX_CMD_GROUP(CMD_GRP_BOOT)
BAREBOX_CMD_HELP(cmd_boot_help)
BAREBOX_CMD_END