aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/efivar/efivar.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/efivar/efivar.c')
-rw-r--r--usr.sbin/efivar/efivar.c38
1 files changed, 31 insertions, 7 deletions
diff --git a/usr.sbin/efivar/efivar.c b/usr.sbin/efivar/efivar.c
index dc4a7b899b14..f278ecd78b6a 100644
--- a/usr.sbin/efivar/efivar.c
+++ b/usr.sbin/efivar/efivar.c
@@ -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,15 +185,31 @@ 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;
+
+ 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 (rv < 0)
- err(1, "%s-%s", gname, name);
if (!Nflag)
printf("%s-%s\n", gname, name);
@@ -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) {