summaryrefslogtreecommitdiff
path: root/util/nvmutil/nvmutil.c
diff options
context:
space:
mode:
Diffstat (limited to 'util/nvmutil/nvmutil.c')
-rw-r--r--util/nvmutil/nvmutil.c93
1 files changed, 68 insertions, 25 deletions
diff --git a/util/nvmutil/nvmutil.c b/util/nvmutil/nvmutil.c
index f968d16c..d775f116 100644
--- a/util/nvmutil/nvmutil.c
+++ b/util/nvmutil/nvmutil.c
@@ -47,7 +47,6 @@ static void write_gbe(void);
static void write_gbe_part(int);
static void swap(int);
static void usage(void);
-static void err_if(int);
static void err(int, const char *, ...);
static const char *getnvmprogname(void);
static void set_err(int);
@@ -103,30 +102,46 @@ main(int argc, char *argv[])
argv0 = argv[0];
if (argc < 2)
usage();
+
reset_global_state();
fname = argv[1];
+
#ifdef __OpenBSD__
- err_if(pledge("stdio rpath wpath unveil", NULL) == -1);
- err_if(unveil("/dev/urandom", "r") == -1);
+ if (pledge("stdio rpath wpath unveil", NULL) == -1)
+ err(ECANCELED, "pledge");
+ if (unveil("/dev/urandom", "r") == -1)
+ err(ECANCELED, "unveil '/dev/urandom'");
#endif
+
set_cmd(argc, argv);
check_cmd_args(argc, argv);
set_io_flags(argc, argv);
+
#ifdef __OpenBSD__
if (flags == O_RDONLY) {
- err_if(unveil(fname, "r") == -1);
- err_if(unveil(NULL, NULL) == -1);
- err_if(pledge("stdio rpath", NULL) == -1);
+ if (unveil(fname, "r") == -1)
+ err(ECANCELED, "unveil ro '%s'", fname);
+ if (unveil(NULL, NULL) == -1)
+ err(ECANCELED, "unveil block (ro)");
+ if (pledge("stdio rpath", NULL) == -1)
+ err(ECANCELED, "pledge ro (kill unveil)");
} else {
- err_if(unveil(fname, "rw") == -1);
- err_if(unveil(NULL, NULL) == -1);
- err_if(pledge("stdio rpath wpath", NULL) == -1);
+ if (unveil(fname, "rw") == -1)
+ err(ECANCELED, "unveil rw '%s'", fname);
+ if (unveil(NULL, NULL) == -1)
+ err(ECANCELED, "unveil block (rw)");
+ if (pledge("stdio rpath wpath", NULL) == -1)
+ err(ECANCELED, "pledge rw (kill unveil)");
}
#endif
+
open_files();
+
#ifdef __OpenBSD__
- err_if(pledge("stdio", NULL) == -1);
+ if (pledge("stdio", NULL) == -1)
+ err(ECANCELED, "pledge stdio (main)");
#endif
+
read_gbe();
(*cmd)();
write_gbe();
@@ -136,8 +151,15 @@ main(int argc, char *argv[])
if (close(rfd) == -1)
err(ECANCELED, "close '/dev/urandom'");
- err_if((errno != 0) && (cmd != cmd_dump));
- return errno ? EXIT_FAILURE : EXIT_SUCCESS;
+ if (cmd != cmd_dump) {
+ if (errno)
+ err(ECANCELED, "Unhandled error on exit");
+ }
+
+ if (errno)
+ return EXIT_FAILURE;
+ else
+ return EXIT_SUCCESS;
}
static void
@@ -511,24 +533,52 @@ cmd_setchecksum(void)
static void
cmd_brick(void)
{
- if (good_checksum(part))
- set_word(NVM_CHECKSUM_WORD, part,
- ((word(NVM_CHECKSUM_WORD, part)) ^ 0xFF));
+ if (!good_checksum(part))
+ err(ECANCELED, "brick p%d, file '%s'", part, fname);
+
+ set_word(NVM_CHECKSUM_WORD, part,
+ ((word(NVM_CHECKSUM_WORD, part)) ^ 0xFF));
}
static void
cmd_copy(void)
{
- err_if(!good_checksum(part ^ 1));
+ if (!good_checksum(part ^ 1))
+ err(ECANCELED, "copy p%d, file '%s'", part ^ 1, fname);
+
+ /*
+ * SPEED HACK:
+ *
+ * read_gbe() already performed the copy,
+ * by virtue of inverted read. We need
+ * only set the other part as changed.
+ *
+ * THIS IS NOT A BUG!
+ */
part_modified[part ^ 1] = 1;
}
static void
cmd_swap(void)
{
- err_if(!(good_checksum(0) || good_checksum(1)));
+ if (!(good_checksum(0) || good_checksum(1)))
+ err(ECANCELED, "swap parts, file '%s'", fname);
+
+ /*
+ * good_checksum() can set errno, if one
+ * of the parts is bad. We will reset it.
+ */
errno = 0;
+ /*
+ * SPEED HACK:
+ *
+ * read_gbe() already performed the swap,
+ * by virtue of inverted read. We need
+ * only set both parts as changed.
+ *
+ * THIS IS NOT A BUG!
+ */
part_modified[1] = part_modified[0] = 1;
}
@@ -636,7 +686,7 @@ usage(void)
#ifdef __OpenBSD__
if (pledge("stdio", NULL) == -1)
- err(ECANCELED, NULL);
+ err(ECANCELED, "pledge");
#endif
fprintf(stderr,
"Modify Intel GbE NVM images e.g. set MAC\n"
@@ -654,13 +704,6 @@ usage(void)
}
static void
-err_if(int x)
-{
- if (x)
- err(ECANCELED, "%s", fname);
-}
-
-static void
err(int nvm_errval, const char *msg, ...)
{
va_list args;