[PATCH v3 1/2] bootmenu: use utf-8 for menu title
Masahisa Kojima
masahisa.kojima at linaro.org
Sun May 29 03:52:43 CEST 2022
The commit a3d0aa87acbe ("bootmenu: update bootmenu_entry structure")
changes the bootmenu title type from char to u16(UTF16 string)
to support EFI based system. If EFI_LOADER is not enabled,
printf("%ls") is not supported, so bootmenu does not appear
correctly.
This commit changes the type of menu title from u16(UTF16) to
utf-8 string and EFI strings is conveted into utf-8.
Fixes: a3d0aa87acbe ("bootmenu: update bootmenu_entry structure")
Signed-off-by: Masahisa Kojima <masahisa.kojima at linaro.org>
Tested-by: Pali Rohar <pali at kernel.org>
---
Changes in v3:
- use strdup for bootmenu_x command parameter
- add comment for readbility
- use proper space
no change in v2
cmd/bootmenu.c | 44 ++++++++++++++++++++++++--------------------
1 file changed, 24 insertions(+), 20 deletions(-)
diff --git a/cmd/bootmenu.c b/cmd/bootmenu.c
index 8859eebea5..7f776fde59 100644
--- a/cmd/bootmenu.c
+++ b/cmd/bootmenu.c
@@ -43,7 +43,7 @@ enum boot_type {
struct bootmenu_entry {
unsigned short int num; /* unique number 0 .. MAX_COUNT */
char key[3]; /* key identifier of number */
- u16 *title; /* title of entry */
+ char *title; /* title of entry */
char *command; /* hush command of entry */
enum boot_type type; /* boot type of entry */
u16 bootorder; /* order for each boot type */
@@ -76,7 +76,7 @@ static void bootmenu_print_entry(void *data)
if (reverse)
puts(ANSI_COLOR_REVERSE);
- printf("%ls", entry->title);
+ printf("%s", entry->title);
if (reverse)
puts(ANSI_COLOR_RESET);
@@ -170,8 +170,9 @@ static int prepare_bootmenu_entry(struct bootmenu_data *menu,
struct bootmenu_entry *iter = *current;
while ((option = bootmenu_getoption(i))) {
- u16 *buf;
+ char *buf;
+ /* bootmenu_[num] format is "[title]=[commands]" */
sep = strchr(option, '=');
if (!sep) {
printf("Invalid bootmenu entry: %s\n", option);
@@ -182,24 +183,21 @@ static int prepare_bootmenu_entry(struct bootmenu_data *menu,
if (!entry)
return -ENOMEM;
- len = sep-option;
- buf = calloc(1, (len + 1) * sizeof(u16));
+ len = sep - option;
+ buf = calloc(1, (len + 1));
entry->title = buf;
if (!entry->title) {
free(entry);
return -ENOMEM;
}
- utf8_utf16_strncpy(&buf, option, len);
+ strncpy(buf, option, len);
- len = strlen(sep + 1);
- entry->command = malloc(len + 1);
+ entry->command = strdup(sep + 1);
if (!entry->command) {
free(entry->title);
free(entry);
return -ENOMEM;
}
- memcpy(entry->command, sep + 1, len);
- entry->command[len] = 0;
sprintf(entry->key, "%d", i);
@@ -227,6 +225,7 @@ static int prepare_bootmenu_entry(struct bootmenu_data *menu,
return 1;
}
+#if (CONFIG_IS_ENABLED(CMD_BOOTEFI_BOOTMGR))
/**
* prepare_uefi_bootorder_entry() - generate the uefi bootmenu entries
*
@@ -279,13 +278,17 @@ static int prepare_uefi_bootorder_entry(struct bootmenu_data *menu,
}
if (lo.attributes & LOAD_OPTION_ACTIVE) {
- entry->title = u16_strdup(lo.label);
- if (!entry->title) {
+ char *buf;
+
+ buf = calloc(1, utf16_utf8_strlen(lo.label) + 1);
+ if (!buf) {
free(load_option);
free(entry);
free(bootorder);
return -ENOMEM;
}
+ entry->title = buf;
+ utf16_utf8_strncpy(&buf, lo.label, u16_strlen(lo.label));
entry->command = strdup("bootefi bootmgr");
sprintf(entry->key, "%d", i);
entry->num = i;
@@ -315,6 +318,7 @@ static int prepare_uefi_bootorder_entry(struct bootmenu_data *menu,
return 1;
}
+#endif
static struct bootmenu_data *bootmenu_create(int delay)
{
@@ -341,13 +345,13 @@ static struct bootmenu_data *bootmenu_create(int delay)
if (ret < 0)
goto cleanup;
- if (IS_ENABLED(CONFIG_CMD_BOOTEFI_BOOTMGR)) {
- if (i < MAX_COUNT - 1) {
+#if (CONFIG_IS_ENABLED(CMD_BOOTEFI_BOOTMGR))
+ if (i < MAX_COUNT - 1) {
ret = prepare_uefi_bootorder_entry(menu, &iter, &i);
if (ret < 0 && ret != -ENOENT)
goto cleanup;
- }
}
+#endif
/* Add U-Boot console entry at the end */
if (i <= MAX_COUNT - 1) {
@@ -357,9 +361,9 @@ static struct bootmenu_data *bootmenu_create(int delay)
/* Add Quit entry if entering U-Boot console is disabled */
if (IS_ENABLED(CONFIG_CMD_BOOTMENU_ENTER_UBOOT_CONSOLE))
- entry->title = u16_strdup(u"U-Boot console");
+ entry->title = strdup("U-Boot console");
else
- entry->title = u16_strdup(u"Quit");
+ entry->title = strdup("Quit");
if (!entry->title) {
free(entry);
@@ -461,7 +465,7 @@ static enum bootmenu_ret bootmenu_show(int delay)
int cmd_ret;
int init = 0;
void *choice = NULL;
- u16 *title = NULL;
+ char *title = NULL;
char *command = NULL;
struct menu *menu;
struct bootmenu_entry *iter;
@@ -517,7 +521,7 @@ static enum bootmenu_ret bootmenu_show(int delay)
if (menu_get_choice(menu, &choice) == 1) {
iter = choice;
- title = u16_strdup(iter->title);
+ title = strdup(iter->title);
command = strdup(iter->command);
/* last entry is U-Boot console or Quit */
@@ -561,7 +565,7 @@ cleanup:
}
if (title && command) {
- debug("Starting entry '%ls'\n", title);
+ debug("Starting entry '%s'\n", title);
free(title);
if (efi_ret == EFI_SUCCESS)
cmd_ret = run_command(command, 0);
--
2.17.1
More information about the U-Boot
mailing list