sd-boot: introduce a one-time override for the boot menu timeout

This is useful to allow userspace to request a "boot into boot menu"
feature.
This commit is contained in:
Lennart Poettering 2018-10-22 13:40:51 +02:00
parent 2366d92345
commit fe2579dd9c
2 changed files with 20 additions and 5 deletions

View File

@ -256,8 +256,12 @@
<varlistentry>
<term><varname>LoaderConfigTimeout</varname></term>
<listitem><para>The menu time-out. Read by the boot loader. (Also, modified by it when the
<keycap>t</keycap>/<keycap>T</keycap> keys are used, see above.)</para></listitem>
<term><varname>LoaderConfigTimeoutOneShot</varname></term>
<listitem><para>The menu time-out in seconds. Read by the boot loader. <varname>LoaderConfigTimeout</varname>
is maintained persistently, while <varname>LoaderConfigTimeoutOneShot</varname> is a one-time override which is
read once (in which case it takes precedence over <varname>LoaderConfigTimeout</varname>) and then
removed. <varname>LoaderConfigTimeout</varname> may be manipulated with the
<keycap>t</keycap>/<keycap>T</keycap> keys, see above.)</para></listitem>
</varlistentry>
<varlistentry>

View File

@ -62,6 +62,7 @@ typedef struct {
BOOLEAN editor;
BOOLEAN auto_entries;
BOOLEAN auto_firmware;
BOOLEAN force_menu;
UINTN console_mode;
enum console_mode_change_type console_mode_change;
} Config;
@ -1417,6 +1418,15 @@ static VOID config_load_defaults(Config *config, EFI_FILE *root_dir) {
config->timeout_sec = sec;
} else
config->timeout_sec_efivar = -1;
err = efivar_get_int(L"LoaderConfigTimeoutOneShot", &sec);
if (!EFI_ERROR(err)) {
/* Unset variable now, after all it's "one shot". */
(void) efivar_set(L"LoaderConfigTimeoutOneShot", NULL, TRUE);
config->timeout_sec = sec;
config->force_menu = TRUE; /* force the menu when this is set */
}
}
static VOID config_load_entries(
@ -2167,7 +2177,9 @@ EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) {
}
/* select entry or show menu when key is pressed or timeout is set */
if (config.timeout_sec == 0) {
if (config.force_menu || config.timeout_sec > 0)
menu = TRUE;
else {
UINT64 key;
err = console_key_read(&key, FALSE);
@ -2181,8 +2193,7 @@ EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) {
else
menu = TRUE;
}
} else
menu = TRUE;
}
for (;;) {
ConfigEntry *entry;