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

Reply via email to