util/nvmutil: general code cleanup

Signed-off-by: Leah Rowe <leah@libreboot.org>
This commit is contained in:
Leah Rowe
2026-03-06 20:11:30 +00:00
parent 5b120d71e7
commit 00e0197cfe
+43 -25
View File
@@ -13,11 +13,28 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
/*
* On the platforms below, we will use arc4random
* for random MAC address generation.
*
* Later on, the code has fallbacks for other systems.
*/
#if defined(__OpenBSD__) || defined(__FreeBSD__) || \
defined(__NetBSD__) || defined(__APPLE__) || \
defined(__DragonFly__)
#ifndef HAVE_ARC4RANDOM
#define HAVE_ARC4RANDOM
#endif
#endif
static void reset_global_state(void); static void reset_global_state(void);
static void set_cmd(int, char **); static void set_cmd(int, char **);
static void check_cmd_args(int, char **); static void check_cmd_args(int, char **);
static void set_io_flags(int, char **); static void set_io_flags(int, char **);
static void open_files(void); static void open_gbe_file(void);
#ifndef HAVE_ARC4RANDOM
static void open_dev_urandom(void);
#endif
static void xopen(int *, const char *, int, struct stat *); static void xopen(int *, const char *, int, struct stat *);
static void read_gbe(void); static void read_gbe(void);
static void read_gbe_part(size_t, unsigned char); static void read_gbe_part(size_t, unsigned char);
@@ -28,7 +45,7 @@ static void check_mac_separator(size_t);
static void set_mac_nib(size_t, size_t); static void set_mac_nib(size_t, size_t);
static uint8_t hextonum(char); static uint8_t hextonum(char);
static uint8_t rhex(void); static uint8_t rhex(void);
static void read_file_PERFECTLY_or_die(int, void *, size_t, static void xread(int, void *, size_t,
off_t, const char *, const char *); off_t, const char *, const char *);
static int write_mac_part(size_t); static int write_mac_part(size_t);
static void cmd_dump(void); static void cmd_dump(void);
@@ -53,20 +70,6 @@ static void err(int, const char *, ...);
static const char *getnvmprogname(void); static const char *getnvmprogname(void);
static void set_err(int); static void set_err(int);
/*
* On the platforms below, we will use arc4random
* for random MAC address generation.
*
* Later on, the code has fallbacks for other systems.
*/
#if defined(__OpenBSD__) || defined(__FreeBSD__) || \
defined(__NetBSD__) || defined(__APPLE__) || \
defined(__DragonFly__)
#ifndef HAVE_ARC4RANDOM
#define HAVE_ARC4RANDOM
#endif
#endif
/* /*
* Sizes in bytes: * Sizes in bytes:
*/ */
@@ -201,7 +204,10 @@ main(int argc, char *argv[])
} }
#endif #endif
open_files(); #ifndef HAVE_ARC4RANDOM
open_dev_urandom();
#endif
open_gbe_file();
#ifdef __OpenBSD__ #ifdef __OpenBSD__
if (pledge("stdio", NULL) == -1) if (pledge("stdio", NULL) == -1)
@@ -301,18 +307,22 @@ static void
set_io_flags(int argc, char *argv[]) set_io_flags(int argc, char *argv[])
{ {
flags = O_RDWR; flags = O_RDWR;
if (argc < 3) if (argc < 3)
return; return;
if (strcmp(argv[2], "dump") == 0) if (strcmp(argv[2], "dump") == 0)
flags = O_RDONLY; flags = O_RDONLY;
} }
static void
open_files(void)
{
#ifndef HAVE_ARC4RANDOM #ifndef HAVE_ARC4RANDOM
static void
open_dev_urandom(void)
{
struct stat st_rfd; struct stat st_rfd;
rname = newrandom; rname = newrandom;
if ((rfd = open(rname, O_RDONLY)) == -1) { if ((rfd = open(rname, O_RDONLY)) == -1) {
/* /*
* Fall back to /dev/random on old platforms * Fall back to /dev/random on old platforms
@@ -321,7 +331,12 @@ open_files(void)
rname = oldrandom; rname = oldrandom;
xopen(&rfd, rname, O_RDONLY, &st_rfd); xopen(&rfd, rname, O_RDONLY, &st_rfd);
} }
}
#endif #endif
static void
open_gbe_file(void)
{
xopen(&fd, fname, flags, &st); xopen(&fd, fname, flags, &st);
switch(st.st_size) { switch(st.st_size) {
@@ -370,7 +385,7 @@ read_gbe(void)
static void static void
read_gbe_part(size_t p, unsigned char invert) read_gbe_part(size_t p, unsigned char invert)
{ {
read_file_PERFECTLY_or_die(fd, gbe_mem_offset(p ^ invert, "pread"), xread(fd, gbe_mem_offset(p ^ invert, "pread"),
GBE_PART_SIZE, gbe_file_offset(p, "pread"), fname, "pread"); GBE_PART_SIZE, gbe_file_offset(p, "pread"), fname, "pread");
} }
@@ -410,6 +425,7 @@ static void
set_mac_byte(size_t mac_pos) set_mac_byte(size_t mac_pos)
{ {
size_t nib; size_t nib;
check_mac_separator(mac_pos); check_mac_separator(mac_pos);
for (nib = 0; nib < 2; nib++) for (nib = 0; nib < 2; nib++)
@@ -487,15 +503,15 @@ hextonum(char ch)
static uint8_t static uint8_t
rhex(void) rhex(void)
{ {
static uint8_t rnum[12];
static size_t n = 0; static size_t n = 0;
static uint8_t rnum[12];
if (!n) { if (!n) {
n = sizeof(rnum); n = sizeof(rnum);
#ifdef HAVE_ARC4RANDOM #ifdef HAVE_ARC4RANDOM
arc4random_buf(rnum, n); arc4random_buf(rnum, n);
#else #else
read_file_PERFECTLY_or_die(rfd, rnum, n, 0, rname, NULL); xread(rfd, rnum, n, 0, rname, NULL);
#endif #endif
} }
@@ -503,11 +519,11 @@ rhex(void)
} }
static void static void
read_file_PERFECTLY_or_die(int fd, void *buf, size_t len, xread(int fd, void *buf, size_t len,
off_t off, const char *path, const char *op) off_t off, const char *path, const char *op)
{ {
ssize_t rval;
int retry; int retry;
ssize_t rval;
for (retry = 0; retry < MAX_RETRY_READ; retry++) { for (retry = 0; retry < MAX_RETRY_READ; retry++) {
if (op) if (op)
@@ -576,6 +592,7 @@ static void
print_mac_address(size_t partnum) print_mac_address(size_t partnum)
{ {
size_t c; size_t c;
for (c = 0; c < 3; c++) { for (c = 0; c < 3; c++) {
uint16_t val16 = word(c, partnum); uint16_t val16 = word(c, partnum);
printf("%02x:%02x", val16 & 0xff, val16 >> 8); printf("%02x:%02x", val16 & 0xff, val16 >> 8);
@@ -688,6 +705,7 @@ good_checksum(size_t partnum)
{ {
size_t w; size_t w;
uint16_t total = 0; uint16_t total = 0;
for (w = 0; w <= NVM_CHECKSUM_WORD; w++) for (w = 0; w <= NVM_CHECKSUM_WORD; w++)
total += word(w, partnum); total += word(w, partnum);