Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F154949147
D8278.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D8278.diff
View Options
Index: usr.sbin/efivar/efivar.c
===================================================================
--- usr.sbin/efivar/efivar.c
+++ usr.sbin/efivar/efivar.c
@@ -32,6 +32,7 @@
#include <err.h>
#include <errno.h>
#include <getopt.h>
+#include <fcntl.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
@@ -62,7 +63,9 @@
static int aflag, Aflag, bflag, dflag, Dflag, Hflag, Nflag,
lflag, Lflag, Rflag, wflag, pflag;
static char *varname;
-static u_long attrib = EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS;
+static char *from = NULL;
+#define ATTRIB_DEFAULT (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS)
+static u_long attrib = ATTRIB_DEFAULT;
static void
usage(void)
@@ -92,14 +95,22 @@
get_value(char *val, size_t *datalen)
{
static char buffer[16*1024];
+ int fd = 0;
if (val != NULL) {
*datalen = strlen(val);
return ((uint8_t *)val);
}
/* Read from stdin */
+ if (from != NULL) {
+ fd = open(from, O_RDONLY, 0);
+ if (fd < 0)
+ return NULL;
+ }
*datalen = sizeof(buffer);
- *datalen = read(0, buffer, *datalen);
+ *datalen = read(fd, buffer, *datalen);
+ if (fd != 0)
+ close(fd);
return ((uint8_t *)buffer);
}
@@ -110,8 +121,13 @@
efi_guid_t guid;
size_t datalen;
uint8_t *data;
+ uint32_t old_attrib = 0;
breakdown_name(name, &guid, &vname);
+ if (efi_get_variable(guid, vname, NULL, &datalen, &old_attrib) < 0)
+ err(1, "efi_get_variable");
+ if (attrib == ATTRIB_DEFAULT)
+ attrib = old_attrib;
data = get_value(val, &datalen);
if (efi_append_variable(guid, vname, data, datalen, attrib) < 0)
err(1, "efi_append_variable");
@@ -135,8 +151,12 @@
efi_guid_t guid;
size_t datalen;
uint8_t *data;
+ uint32_t old_attrib = 0;
breakdown_name(name, &guid, &vname);
+ if (efi_get_variable(guid, vname, NULL, &datalen, &old_attrib) >= 0)
+ if (attrib == ATTRIB_DEFAULT)
+ attrib = old_attrib;
data = get_value(val, &datalen);
if (efi_set_variable(guid, vname, data, datalen, attrib, 0) < 0)
err(1, "efi_set_variable");
@@ -273,6 +293,9 @@
case 'D':
Dflag++;
break;
+ case 'f':
+ from = optarg;
+ break;
case 'H':
Hflag++;
break;
@@ -295,12 +318,11 @@
Rflag++;
break;
case 't':
- attrib = strtoul(optarg, NULL, 16);
+ attrib = strtoul(optarg, NULL, 0);
break;
case 'w':
wflag++;
break;
- case 'f':
case 0:
errx(1, "unknown or unimplemented option\n");
break;
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, May 1, 6:44 AM (9 h, 1 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
32559439
Default Alt Text
D8278.diff (2 KB)
Attached To
Mode
D8278: Make append and write work more like Linux
Attached
Detach File
Event Timeline
Log In to Comment