From: Lennart Poettering Date: Mon, 22 Oct 2018 11:40:51 +0000 (+0200) Subject: sd-boot: introduce a one-time override for the boot menu timeout X-Git-Tag: v240~305^2~7 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=fe2579dd9c526bf14e0f1275fea61594ba54dcf7;p=thirdparty%2Fsystemd.git 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. --- diff --git a/man/systemd-boot.xml b/man/systemd-boot.xml index 3b726e63a4f..e1d1910c910 100644 --- a/man/systemd-boot.xml +++ b/man/systemd-boot.xml @@ -256,8 +256,12 @@ LoaderConfigTimeout - The menu time-out. Read by the boot loader. (Also, modified by it when the - t/T keys are used, see above.) + LoaderConfigTimeoutOneShot + The menu time-out in seconds. Read by the boot loader. LoaderConfigTimeout + is maintained persistently, while LoaderConfigTimeoutOneShot is a one-time override which is + read once (in which case it takes precedence over LoaderConfigTimeout) and then + removed. LoaderConfigTimeout may be manipulated with the + t/T keys, see above.) diff --git a/src/boot/efi/boot.c b/src/boot/efi/boot.c index 3190849b7e4..b2fa8f1e2a5 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;