Date: Thu, 31 Aug 2017 17:53:51 +0000 (UTC) From: Warner Losh <imp@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r323066 - head/usr.sbin/efivar Message-ID: <201708311753.v7VHrpT4045443@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: imp Date: Thu Aug 31 17:53:50 2017 New Revision: 323066 URL: https://svnweb.freebsd.org/changeset/base/323066 Log: 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 Modified: head/usr.sbin/efivar/Makefile head/usr.sbin/efivar/efivar.8 head/usr.sbin/efivar/efivar.c Modified: head/usr.sbin/efivar/Makefile ============================================================================== --- head/usr.sbin/efivar/Makefile Thu Aug 31 17:32:24 2017 (r323065) +++ head/usr.sbin/efivar/Makefile Thu Aug 31 17:53:50 2017 (r323066) @@ -5,4 +5,7 @@ MAN= efivar.8 LIBADD= efivar +EFIBOOT=${SRCTOP}/sys/boot/efi +CFLAGS+= -I${EFIBOOT}/include + .include <bsd.prog.mk> Modified: head/usr.sbin/efivar/efivar.8 ============================================================================== --- head/usr.sbin/efivar/efivar.8 Thu Aug 31 17:32:24 2017 (r323065) +++ head/usr.sbin/efivar/efivar.8 Thu Aug 31 17:53:50 2017 (r323066) @@ -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. Modified: head/usr.sbin/efivar/efivar.c ============================================================================== --- head/usr.sbin/efivar/efivar.c Thu Aug 31 17:32:24 2017 (r323065) +++ head/usr.sbin/efivar/efivar.c Thu Aug 31 17:53:50 2017 (r323066) @@ -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) @@ -343,6 +368,9 @@ parse_args(int argc, char **argv) break; case 't': attrib = strtoul(optarg, NULL, 16); + break; + case 'u': + uflag++; break; case 'w': wflag++;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201708311753.v7VHrpT4045443>