From b0da7c79f10201f5113d326ef8dfe6708598ba74 Mon Sep 17 00:00:00 2001 From: Warner Losh Date: Thu, 31 Aug 2017 17:53:50 +0000 Subject: Add UCS2->UTF8 option. Many UEFI variables are UCS2 strings (some NUL terminated, others not). Add --utf8 (-u) to convert UCS2 strings to UTF8 before printing. Sponsored by: Netflix --- usr.sbin/efivar/Makefile | 3 +++ usr.sbin/efivar/efivar.8 | 6 +++++- usr.sbin/efivar/efivar.c | 30 +++++++++++++++++++++++++++++- 3 files changed, 37 insertions(+), 2 deletions(-) (limited to 'usr.sbin/efivar') diff --git a/usr.sbin/efivar/Makefile b/usr.sbin/efivar/Makefile index 9a7ac90c820c..821a8e41b8d3 100644 --- a/usr.sbin/efivar/Makefile +++ b/usr.sbin/efivar/Makefile @@ -5,4 +5,7 @@ MAN= efivar.8 LIBADD= efivar +EFIBOOT=${SRCTOP}/sys/boot/efi +CFLAGS+= -I${EFIBOOT}/include + .include diff --git a/usr.sbin/efivar/efivar.8 b/usr.sbin/efivar/efivar.8 index 1c23303e295d..07c7366e7dec 100644 --- a/usr.sbin/efivar/efivar.8 +++ b/usr.sbin/efivar/efivar.8 @@ -32,7 +32,7 @@ .Nd UEFI environment variable interaction .Sh SYNOPSIS .Nm -.Op Fl abdDHlLNpRtw +.Op Fl abdDHlLNpRtuw .Op Fl n Ar name .Op Fl f Ar file .Op Fl -append @@ -51,6 +51,7 @@ .Op Fl -print .Op Fl -print-decimal .Op Fl -raw-guid +.Op Fl -utf8 .Op Fl -write .Sh DESCRIPTION This program manages @@ -143,6 +144,9 @@ Do not display the variable name. Print the value of the variable. .It Fl R Fl -raw-guid Do not substitute well known names for GUID numeric values in output. +.It Fl u Fl -utf8 +Treat the value of the variable as UCS2 and convert it to UTF8 and +print the result. .It Fl w Fl -write Write (replace) the variable specified with the value specified from standard input. diff --git a/usr.sbin/efivar/efivar.c b/usr.sbin/efivar/efivar.c index c4aa5a4397e3..3c4ada22eba3 100644 --- a/usr.sbin/efivar/efivar.c +++ b/usr.sbin/efivar/efivar.c @@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include "efichar.h" /* options descriptor */ static struct option longopts[] = { @@ -58,13 +59,14 @@ static struct option longopts[] = { { "print", no_argument, NULL, 'p' }, { "print-decimal", no_argument, NULL, 'd' }, { "raw-guid", no_argument, NULL, 'R' }, + { "utf8", no_argument, NULL, 'u' }, { "write", no_argument, NULL, 'w' }, { NULL, 0, NULL, 0 } }; static int aflag, Aflag, bflag, dflag, Dflag, gflag, Hflag, Nflag, - lflag, Lflag, Rflag, wflag, pflag; + lflag, Lflag, Rflag, wflag, pflag, uflag; static char *varname; static u_long attrib = EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS; @@ -175,6 +177,27 @@ asciidump(uint8_t *data, size_t datalen) printf("\n"); } +static void +utf8dump(uint8_t *data, size_t datalen) +{ + char *utf8 = NULL; + efi_char *ucs2; + + /* + * NUL terminate the string. Not all strings need it, but some + * do and an extra NUL won't change what's printed. + */ + ucs2 = malloc(datalen + sizeof(efi_char)); + memcpy(ucs2, data, datalen); + ucs2[datalen / sizeof(efi_char)] = 0; + ucs2_to_utf8(ucs2, &utf8); + if (!Nflag) + printf("\n"); + printf("%s\n", utf8); + free(utf8); + free(ucs2); +} + static void hexdump(uint8_t *data, size_t datalen) { @@ -245,6 +268,8 @@ print_var(efi_guid_t *guid, char *name) printf("%s-%s", gname, name); if (Aflag) asciidump(data, datalen); + else if (uflag) + utf8dump(data, datalen); else if (bflag) bindump(data, datalen); else if (dflag) @@ -344,6 +369,9 @@ parse_args(int argc, char **argv) case 't': attrib = strtoul(optarg, NULL, 16); break; + case 'u': + uflag++; + break; case 'w': wflag++; break; -- cgit v1.2.3