aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/efivar
diff options
context:
space:
mode:
authorWarner Losh <imp@FreeBSD.org>2017-08-31 17:53:50 +0000
committerWarner Losh <imp@FreeBSD.org>2017-08-31 17:53:50 +0000
commitb0da7c79f10201f5113d326ef8dfe6708598ba74 (patch)
treec8290d2cf88a3dbd0c3160d9f525ba88454c9d01 /usr.sbin/efivar
parent6b4a1e856fbce74c45c54f38b84521f8bdf4e44f (diff)
downloadsrc-b0da7c79f10201f5113d326ef8dfe6708598ba74.tar.gz
src-b0da7c79f10201f5113d326ef8dfe6708598ba74.zip
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
Notes
Notes: svn path=/head/; revision=323066
Diffstat (limited to 'usr.sbin/efivar')
-rw-r--r--usr.sbin/efivar/Makefile3
-rw-r--r--usr.sbin/efivar/efivar.86
-rw-r--r--usr.sbin/efivar/efivar.c30
3 files changed, 37 insertions, 2 deletions
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 <bsd.prog.mk>
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 <stdlib.h>
#include <string.h>
#include <unistd.h>
+#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;
@@ -176,6 +178,27 @@ asciidump(uint8_t *data, size_t datalen)
}
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)
{
size_t i;
@@ -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;