summaryrefslogtreecommitdiff
path: root/src/boot/efi/boot.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2018-10-22 13:40:51 +0200
committerLennart Poettering <lennart@poettering.net>2018-11-16 15:47:18 +0100
commitfe2579dd9c526bf14e0f1275fea61594ba54dcf7 (patch)
tree5986d85bba75f427cfa45a23af30aa5eedc069ab /src/boot/efi/boot.c
parent2366d923450e7722fdc743075d5f88550455e37a (diff)
downloadsystemd-fe2579dd9c526bf14e0f1275fea61594ba54dcf7.tar.gz
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.
Diffstat (limited to 'src/boot/efi/boot.c')
-rw-r--r--src/boot/efi/boot.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/boot/efi/boot.c b/src/boot/efi/boot.c
index 3190849b7e..b2fa8f1e2a 100644
--- a/src/boot/efi/boot.c
+++ b/src/boot/efi/boot.c
@@ -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;