From b6f6080f56986670a3012fa565391da112724d21 Mon Sep 17 00:00:00 2001 From: Heinrich Schuchardt Date: Sun, 17 Jan 2021 05:13:21 +0100 Subject: [PATCH] efi_selftest: ask before overwriting in dtbdump.efi Before overwriting an existing file ask the user. Signed-off-by: Heinrich Schuchardt --- lib/efi_selftest/dtbdump.c | 60 +++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/lib/efi_selftest/dtbdump.c b/lib/efi_selftest/dtbdump.c index efef759863..cbc9067b5a 100644 --- a/lib/efi_selftest/dtbdump.c +++ b/lib/efi_selftest/dtbdump.c @@ -41,7 +41,51 @@ static void error(u16 *string) } /** - * input() - read string from console + * efi_input_yn() - get answer to yes/no question + * + * Return: + * y or Y + * EFI_SUCCESS + * n or N + * EFI_ACCESS_DENIED + * ESC + * EFI_ABORTED + */ +static efi_status_t efi_input_yn(void) +{ + struct efi_input_key key = {0}; + efi_uintn_t index; + efi_status_t ret; + + /* Drain the console input */ + ret = cin->reset(cin, true); + for (;;) { + ret = bs->wait_for_event(1, &cin->wait_for_key, &index); + if (ret != EFI_SUCCESS) + continue; + ret = cin->read_key_stroke(cin, &key); + if (ret != EFI_SUCCESS) + continue; + switch (key.scan_code) { + case 0x17: /* Escape */ + return EFI_ABORTED; + default: + break; + } + /* Convert to lower case */ + switch (key.unicode_char | 0x20) { + case 'y': + return EFI_SUCCESS; + case 'n': + return EFI_ACCESS_DENIED; + default: + break; + } + } +} + +/** + * efi_input() - read string from console * * @buffer: input buffer * @buffer_size: buffer size @@ -379,6 +423,20 @@ efi_status_t do_save(u16 *filename) error(L"Failed to open volume\n"); return ret; } + /* Check if file already exists */ + ret = root->open(root, &file, filename, EFI_FILE_MODE_READ, 0); + if (ret == EFI_SUCCESS) { + file->close(file); + cout->output_string(cout, L"Overwrite existing file (y/n)? "); + ret = efi_input_yn(); + cout->output_string(cout, L"\n"); + if (ret != EFI_SUCCESS) { + root->close(root); + error(L"Aborted by user\n"); + return ret; + } + } + /* Create file */ ret = root->open(root, &file, filename, EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | -- 2.39.5