svn commit: r339797 - head/usr.sbin/efivar

Warner Losh imp at FreeBSD.org
Fri Oct 26 22:13:41 UTC 2018


Author: imp
Date: Fri Oct 26 22:13:40 2018
New Revision: 339797
URL: https://svnweb.freebsd.org/changeset/base/339797

Log:
  Implenent --fromfile to read variable values when printing variables
  
  So
  
  ./efivar --fromfile Boot0001.bin --print --load-option
  
  will take the value from Boot0001.bin file and then decode it as if it
  were a load-option. This is useful for debugging handling of such
  variables that may be hanging the boot for some people.
  
  Sponsored by: Netflix, Inc

Modified:
  head/usr.sbin/efivar/efivar.8
  head/usr.sbin/efivar/efivar.c

Modified: head/usr.sbin/efivar/efivar.8
==============================================================================
--- head/usr.sbin/efivar/efivar.8	Fri Oct 26 21:57:22 2018	(r339796)
+++ head/usr.sbin/efivar/efivar.8	Fri Oct 26 22:13:40 2018	(r339797)
@@ -86,8 +86,17 @@ This flag implies
 .Fl -write
 unless the
 .Fl -append
-flag is given.
-This behavior is not well understood and is currently unimplemented.
+or
+.Fl -print
+flags are given.
+This behavior is not well understood and is currently unimplemented
+for writes.
+When
+.Fl -print
+is specified, the contents of the file are used as the value to
+print using any other specified flags.
+This is used primarily for testing purposes for more complicated
+variable decoding.
 .It Fl a Fl -append
 Append the specified value to the UEFI variable rather than replacing
 it.

Modified: head/usr.sbin/efivar/efivar.c
==============================================================================
--- head/usr.sbin/efivar/efivar.c	Fri Oct 26 21:57:22 2018	(r339796)
+++ head/usr.sbin/efivar/efivar.c	Fri Oct 26 22:13:40 2018	(r339797)
@@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$");
 #include <efivar-dp.h>
 #include <err.h>
 #include <errno.h>
+#include <fcntl.h>
 #include <getopt.h>
 #include <stddef.h>
 #include <stdio.h>
@@ -70,6 +71,7 @@ static struct option longopts[] = {
 static int aflag, Aflag, bflag, dflag, Dflag, gflag, Hflag, Nflag,
 	lflag, Lflag, Rflag, wflag, pflag, uflag, load_opt_flag;
 static char *varname;
+static char *fromfile;
 static u_long attrib = EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS;
 
 static void
@@ -183,16 +185,32 @@ print_var(efi_guid_t *guid, char *name)
 	uint32_t att;
 	uint8_t *data;
 	size_t datalen;
-	char *gname;
+	char *gname = NULL;
 	int rv;
 
-	pretty_guid(guid, &gname);
-	if (pflag) {
-		rv = efi_get_variable(*guid, name, &data, &datalen, &att);
+	if (guid)
+		pretty_guid(guid, &gname);
+	if (pflag || fromfile) {
+		if (fromfile) {
+			int fd;
 
-		if (rv < 0)
-			err(1, "%s-%s", gname, name);
+			fd = open(fromfile, O_RDONLY);
+			if (fd < 0)
+				err(1, "open %s", fromfile);
+			data = malloc(64 * 1024);
+			if (data == NULL)
+				err(1, "malloc");
+			datalen = read(fd, data, 64 * 1024);
+			if (datalen <= 0)
+				err(1, "read");
+			close(fd);
+		} else {
+			rv = efi_get_variable(*guid, name, &data, &datalen, &att);
+			if (rv < 0)
+				err(1, "fetching %s-%s", gname, name);
+		}
 
+
 		if (!Nflag)
 			printf("%s-%s\n", gname, name);
 		if (load_opt_flag)
@@ -310,6 +328,9 @@ parse_args(int argc, char **argv)
 			wflag++;
 			break;
 		case 'f':
+			free(fromfile);
+			fromfile = strdup(optarg);
+			break;
 		case 0:
 			errx(1, "unknown or unimplemented option\n");
 			break;
@@ -343,7 +364,10 @@ parse_args(int argc, char **argv)
 		write_variable(varname, NULL);
 	else if (Lflag)
 		print_known_guid();
-	else if (varname) {
+	else if (fromfile) {
+		Nflag = 1;
+		print_var(NULL, NULL);
+	} else if (varname) {
 		pflag++;
 		print_variable(varname);
 	} else if (argc > 0) {


More information about the svn-src-all mailing list