diff options
Diffstat (limited to 'common/boot.c')
-rw-r--r-- | common/boot.c | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/common/boot.c b/common/boot.c index 8220b8d3fb..cbfe6649b3 100644 --- a/common/boot.c +++ b/common/boot.c @@ -75,7 +75,7 @@ static int bootscript_boot(struct bootentry *entry, int verbose, int dryrun) struct bootm_data data = {}; - if (dryrun) { + if (dryrun == 1) { printf("Would run %s\n", bs->scriptpath); return 0; } @@ -94,8 +94,8 @@ static int bootscript_boot(struct bootentry *entry, int verbose, int dryrun) if (verbose) data.verbose = verbose; - if (dryrun) - data.dryrun = dryrun; + if (dryrun >= 2) + data.dryrun = dryrun - 1; return bootm_boot(&data); } @@ -115,11 +115,18 @@ struct watchdog *boot_get_enabled_watchdog(void) } static char *global_boot_default; + +void boot_set_default(const char *boot_default) +{ + free(global_boot_default); + global_boot_default = xstrdup(boot_default); +} + static char *global_user; static int init_boot(void) { - global_boot_default = xstrdup("net"); + global_boot_default = global_boot_default ? : xstrdup("net"); globalvar_add_simple_string("boot.default", &global_boot_default); globalvar_add_simple_int("boot.watchdog_timeout", &boot_watchdog_timeout, "%u"); @@ -151,8 +158,8 @@ int boot_entry(struct bootentry *be, int verbose, int dryrun) } ret = be->boot(be, verbose, dryrun); - if (ret) - pr_err("Booting entry '%s' failed\n", be->title); + if (ret && ret != -ENOMEDIUM) + pr_err("Booting entry '%s' failed: %pe\n", be->title, ERR_PTR(ret)); return ret; } @@ -183,8 +190,12 @@ static int bootscript_create_entry(struct bootentries *bootentries, const char * { struct bootentry_script *bs; enum filetype type; + int ret; + + ret = file_name_detect_type(name, &type); + if (ret) + return ret; - type = file_name_detect_type(name); if (type != filetype_sh) return -EINVAL; @@ -272,6 +283,7 @@ int bootentry_register_provider(int (*fn)(struct bootentries *bootentries, const * name can be: * - a name of a boot script under /env/boot * - a full path of a boot script + * - a full path of a bootloader spec entry * - a device name * - a cdev name * - a full path of a directory containing bootloader spec entries @@ -313,10 +325,12 @@ int bootentry_create_from_name(struct bootentries *bootentries, /* * bootsources_menu - show a menu from an array of names */ -void bootsources_menu(struct bootentries *bootentries, int timeout) +void bootsources_menu(struct bootentries *bootentries, + unsigned default_entry, int timeout) { struct bootentry *entry; struct menu_entry *back_entry; + int i = 1; if (!IS_ENABLED(CONFIG_MENU)) { pr_warn("no menu support available\n"); @@ -328,6 +342,9 @@ void bootsources_menu(struct bootentries *bootentries, int timeout) entry->me.display = xstrdup(entry->title); entry->me.action = bootsource_action; menu_add_entry(bootentries->menu, &entry->me); + + if (i++ == default_entry) + bootentries->menu->selected = &entry->me; } back_entry = xzalloc(sizeof(*back_entry)); @@ -336,6 +353,9 @@ void bootsources_menu(struct bootentries *bootentries, int timeout) back_entry->non_re_ent = 1; menu_add_entry(bootentries->menu, back_entry); + if (i == default_entry) + bootentries->menu->selected = back_entry; + if (timeout >= 0) bootentries->menu->auto_select = timeout; |