> > > > Changes in v3: > - Command arguments, maybe this command is better if it doesn't have > any command argument, since we are printing only. Command options is > just unneccessary. And this is how many grub commands does, so it > should align. > Options are good. Just use extcmd to parse them, not manual parsing.
+static void > Better to return grub_err_t here and properly propagate it > +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_error(GRUB_ERR_IO, "failed to retrieve variable data 0x%" > PRIxGRUB_EFI_UINTN_T, status); > + return; > + } > + > + grub_printf(_("Attributes:\n")); > + if (attributes & GRUB_EFI_VARIABLE_NON_VOLATILE) > + grub_printf(_("\tNon-Volatile\n")); > + if (attributes & GRUB_EFI_VARIABLE_BOOTSERVICE_ACCESS) > + grub_printf(_("\tBoot Service Access\n")); > + if (attributes & GRUB_EFI_VARIABLE_RUNTIME_ACCESS) > + grub_printf(_("\tRuntime Service Access\n")); > + > + grub_printf(_("Value:\n")); > + hexdump(0, data, data_size); > + grub_free(data); > +} > + > +static grub_err_t > +dump_efi_variables(void) > +{ > + 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_dprintf("lsefivar", "buffer isn't enough, > enlarging up to %ld bytes\n",variable_name_size * > sizeof(grub_efi_char16_t)); > + variable_name = grub_realloc(variable_name, > variable_name_size * sizeof(grub_efi_char16_t)); > + if (variable_name == NULL) > + { > + grub_free(variable_name); > This free of NULL does absolutely nothing. Please fix it. > + return grub_errno; > + } > + } > + variable_name_string = grub_calloc(variable_name_size, > GRUB_MAX_UTF8_PER_UTF16); > This is not enough. You need 1 byte more. > + 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); > + dump_variable_data((char*)variable_name_string, > &vendor_guid); > + } > + > + grub_free(variable_name); > + if (variable_name_string) > + grub_free(variable_name_string); > grub_free already checks for null. + return GRUB_ERR_NONE; > +} > + > +static grub_err_t > +grub_cmd_lsefivar (grub_command_t cmd __attribute__((unused)), > + int argc __attribute__((unused)), char **argv > __attribute__((unused))) > +{ > + return dump_efi_variables(); > As I said: options and extcmd. Like normal ls command > +} > + > +static grub_command_t cmd; > + > +GRUB_MOD_INIT(lsefivar) > +{ > + cmd = grub_register_command("lsefivar", grub_cmd_lsefivar, NULL, > N_("Display UEFI variables.")); > +} > +GRUB_MOD_FINI(lsefivar) > +{ > + grub_unregister_command(cmd); > +} > + > + > -- > 2.49.0 > > > _______________________________________________ > Grub-devel mailing list > Grub-devel@gnu.org > https://lists.gnu.org/mailman/listinfo/grub-devel >
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel