From: khaalid <khaliidc...@gmail.com> Hi Vladimir 'phcoder' Serbinenko, I realize this patch is taking longer than expected, and I’d like to avoid more back-and-forths that take time from both of us. Would it be possible for us to work through the remaining points together more directly or clarify the final expectations? I really want to get this right and align it with the project standards, and I’d appreciate any help in making the process smoother.
Just wondering — is this revision close to being ready for acceptance, or should I expect one last round of feedback? I’d like to make sure we can finalize it soon so it doesn’t keep taking up both our time. About `-l` option i added a boolean parameter to the dumping function so it dumps the contents or just lists. Well unless this isn't against coding style i thoght it is the best. As i understood from your suggestion i used puts_ on all attribute printing. About "puts_(N_(..))" i think you mean use it on all attribute printing, well if that is right i did it. Thanks again for your time and guidance so far. Best regards, Khaalid Signed-off-by: Khalid Ali <khaliidc...@gmail.com> --- grub-core/Makefile.core.def | 6 ++ grub-core/commands/efi/lsefivar.c | 139 ++++++++++++++++++++++++++++++ 2 files changed, 145 insertions(+) create mode 100644 grub-core/commands/efi/lsefivar.c diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def index f70e02e69..8b9cf2a68 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def @@ -840,6 +840,12 @@ module = { enable = efi; }; +module = { + name = lsefivar; + efi = commands/efi/lsefivar.c; + enable = efi; +}; + module = { name = blocklist; common = commands/blocklist.c; diff --git a/grub-core/commands/efi/lsefivar.c b/grub-core/commands/efi/lsefivar.c new file mode 100644 index 000000000..2176bee72 --- /dev/null +++ b/grub-core/commands/efi/lsefivar.c @@ -0,0 +1,139 @@ +/* efivar.c - dump runtime uefi variables. */ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2025 Free Software Foundation, Inc. + * + * GRUB is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GRUB is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GRUB. If not, see <http://www.gnu.org/licenses/>. + */ + + + +#include <grub/dl.h> +#include <grub/misc.h> +#include <grub/charset.h> +#include <grub/extcmd.h> +#include <grub/efi/efi.h> +#include <grub/efi/api.h> +#include <grub/lib/hexdump.h> + +GRUB_MOD_LICENSE ("GPLv3+"); + +static const struct grub_arg_option options[] = +{ + {0, 'l', 0, N_("Dump variable contents"), 0, 0}, + {0, 0, 0, 0, 0, 0} +}; + +static void +dump_variable_data(const char *variable_name, grub_guid_t *variable_guid) +{ + grub_efi_status_t status; + grub_efi_uint32_t attributes; + grub_size_t data_size; + void *data; + + status = grub_efi_get_variable_with_attributes(variable_name, variable_guid, + &data_size, &data, &attributes); + if (status != GRUB_EFI_SUCCESS) + { + grub_errno = GRUB_ERR_NONE; + return; + } + + grub_puts_(N_("Attributes:")); + if (attributes & GRUB_EFI_VARIABLE_NON_VOLATILE) + grub_puts_(N_("\tNon-Volatile")); + if (attributes & GRUB_EFI_VARIABLE_BOOTSERVICE_ACCESS) + grub_puts_(N_("\tBoot Service Access")); + if (attributes & GRUB_EFI_VARIABLE_RUNTIME_ACCESS) + grub_puts_(N_("\tRuntime Service Access")); + + grub_puts_(N_("Value:")); + hexdump(0, data, data_size); + grub_free(data); +} + +static grub_err_t +dump_efi_variables(grub_efi_boolean_t dump_variable_content) +{ + grub_efi_status_t status; + grub_efi_runtime_services_t *r; + grub_efi_uintn_t variable_name_size = 512; + grub_efi_char16_t *variable_name; + grub_uint8_t *variable_name_string = NULL; + grub_guid_t vendor_guid; + + r = grub_efi_system_table->runtime_services; + + variable_name = grub_calloc(variable_name_size, sizeof(grub_efi_char16_t)); + if (variable_name == NULL) + return grub_errno; + *variable_name = 0; /* Start with empty string */ + + while (1) + { + status = r->get_next_variable_name(&variable_name_size, variable_name, &vendor_guid); + if (status == GRUB_EFI_NOT_FOUND) + break; + else if (status == GRUB_EFI_BUFFER_TOO_SMALL) + { + grub_efi_char16_t *tmp; + grub_dprintf("lsefivar", "buffer isn't enough, enlarging up to %ld bytes\n",variable_name_size * sizeof(grub_efi_char16_t)); + tmp = grub_realloc(variable_name, variable_name_size * sizeof(grub_efi_char16_t)); + if (tmp == NULL) + { + grub_free (variable_name); + return grub_errno; + } + variable_name = tmp; + } + variable_name_string = grub_calloc(variable_name_size + 1, GRUB_MAX_UTF8_PER_UTF16); + if (variable_name_string == NULL) + { + grub_free(variable_name); + return grub_errno; + } + *grub_utf16_to_utf8(variable_name_string, variable_name, variable_name_size) = '\0'; + grub_printf("%pG-%s\n",&vendor_guid, variable_name_string); + if (dump_variable_content) + dump_variable_data((char*)variable_name_string, &vendor_guid); + } + + grub_free(variable_name); + grub_free(variable_name_string); + return GRUB_ERR_NONE; +} + +static grub_err_t +grub_cmd_lsefivar (grub_extcmd_context_t ctxt, + int argc __attribute__((unused)), char **argv __attribute__((unused))) +{ + if (ctxt->state[0].set) + return dump_efi_variables(true); /* true: dump variables and contents*/ + + return dump_efi_variables(false); /* false: do not dump variable contents*/ +} + +static grub_extcmd_t cmd; + +GRUB_MOD_INIT(lsefivar) +{ + cmd = grub_register_extcmd ("lsefivar", grub_cmd_lsefivar, 0, N_("[-l]"), N_("Display UEFI variables."), options); +} +GRUB_MOD_FINI(lsefivar) +{ + grub_unregister_extcmd (cmd); +} + + -- 2.49.0 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel