summaryrefslogtreecommitdiff
path: root/util
diff options
context:
space:
mode:
Diffstat (limited to 'util')
-rw-r--r--util/nvmutil/nvmutil.c98
1 files changed, 62 insertions, 36 deletions
diff --git a/util/nvmutil/nvmutil.c b/util/nvmutil/nvmutil.c
index 4188c0dc..0d9020ee 100644
--- a/util/nvmutil/nvmutil.c
+++ b/util/nvmutil/nvmutil.c
@@ -19,9 +19,11 @@ void cmd_setchecksum(void), cmd_brick(void), swap(int partnum), writeGbe(void),
checkdir(const char *path), macf(int partnum), hexdump(int partnum),
parseMacString(const char *strMac, uint16_t *mac), cmd_swap(void),
openFiles(const char *path), cmd_copy(void), writeGbe_part(int),
- readGbe_part(int), usage(char*);
+ readGbe_part(int), usage(char*), set_io_flags(int, char **),
+ set_cmd(int, char **), setWord(int, int, uint16_t), check_bounds(int, int);
int goodChecksum(int partnum);
uint8_t hextonum(char chs), rhex(void);
+uint16_t word(int, int);
#ifdef __OpenBSD__
void block_unveil(void);
@@ -44,6 +46,7 @@ ssize_t nf;
size_t partsize, gbe[2];
uint8_t nvmPartChanged[2] = {0, 0}, do_read[2] = {1, 1};
int flags, rfd, fd, part, e = 1;
+struct stat st;
const char *strMac = NULL, *strRMac = "xx:xx:xx:xx:xx:xx", *fname = NULL;
@@ -68,45 +71,43 @@ void (*cmd)(void) = NULL;
#define xopen(f,l,p) \
if ((f = open(l, p)) == -1) \
err(SET_ERR(ECANCELED), "%s", l); \
- if (fstat(f, &st) == -1) err(SET_ERR(ECANCELED), "%s", l)
-
-#define word(pos16, partnum) ((uint16_t *) gbe[partnum])[pos16]
-#define setWord(pos16, p, val16) if (word(pos16, p) != val16) \
- nvmPartChanged[p] = 1 | (word(pos16, p) = val16)
+ if (fstat(f, &st) == -1) \
+ err(SET_ERR(ECANCELED), "%s", l)
int
main(int argc, char *argv[])
{
#ifdef __OpenBSD__
err_if(pledge("stdio rpath wpath unveil", NULL) == -1);
+ err_if(unveil("/dev/urandom", "r") == -1);
#endif
- if (argc < 2)
- usage(argv[0]);
+ set_cmd(argc, argv);
fname = argv[1];
- flags = O_RDWR;
- if (argc > 2)
- if (strcmp(COMMAND, "dump") == 0)
- flags = O_RDONLY;
-
-#ifdef __OpenBSD__
- if (flags == O_RDONLY)
- err_if(pledge("stdio rpath unveil", NULL) == -1);
-#endif
-
- checkdir("/dev/urandom");
- checkdir(fname);
-
+ set_io_flags(argc, argv);
#ifdef __OpenBSD__
block_unveil();
#endif
-
openFiles(fname);
#ifdef __OpenBSD__
err_if(pledge("stdio", NULL) == -1);
#endif
- if (argc > 2) {
+ nvmalloc();
+ readGbe();
+ (*cmd)();
+ writeGbe();
+
+ err_if((errno != 0) && (cmd != cmd_dump));
+ return errno;
+}
+
+void
+set_cmd(int argc, char *argv[])
+{
+ if (argc < 2) {
+ usage(argv[0]);
+ } else if (argc > 2) {
for (int i = 0; (i < 6) && (cmd == NULL); i++) {
if (strcmp(COMMAND, op[i].str) != 0)
continue;
@@ -117,7 +118,7 @@ main(int argc, char *argv[])
err(SET_ERR(EINVAL), "Too few args on command '%s'",
op[i].str);
}
- } else {
+ } else { /* argc == 2 */
cmd = cmd_setmac;
}
@@ -133,14 +134,15 @@ main(int argc, char *argv[])
|| PARTN[1] ? EINVAL : errno)); /* only allow '0' or '1' */
}
err_if((errno = (cmd == NULL) ? EINVAL : errno));
+}
- nvmalloc();
- readGbe();
- (*cmd)();
- writeGbe();
-
- err_if((errno != 0) && (cmd != cmd_dump));
- return errno;
+void
+set_io_flags(int argc, char *argv[])
+{
+ flags = O_RDWR;
+ if (argc > 2)
+ if (strcmp(COMMAND, "dump") == 0)
+ flags = O_RDONLY;
}
void
@@ -156,8 +158,10 @@ checkdir(const char *path)
void
openFiles(const char *path)
{
- struct stat st;
+ checkdir("/dev/urandom");
+ checkdir(fname);
+ xopen(rfd, "/dev/urandom", O_RDONLY);
xopen(fd, path, flags);
switch(st.st_size) {
@@ -170,8 +174,6 @@ openFiles(const char *path)
err(SET_ERR(ECANCELED), "Invalid file size (not 8/16/128KiB)");
break;
}
-
- xopen(rfd, "/dev/urandom", O_RDONLY);
}
void
@@ -401,6 +403,32 @@ goodChecksum(int partnum)
return 0;
}
+uint16_t
+word(int pos16, int p)
+{
+ check_bounds(pos16, p);
+ return ((uint16_t *) gbe[p])[pos16];
+}
+
+void
+setWord(int pos16, int p, uint16_t val16)
+{
+ check_bounds(pos16, p);
+ if (((uint16_t *) gbe[p])[pos16] != val16) {
+ nvmPartChanged[p] = 1;
+ ((uint16_t *) gbe[p])[pos16] = val16;
+ }
+}
+
+void
+check_bounds(int c, int p)
+{
+ if ((p != 0) && (p != 1))
+ err(SET_ERR(EINVAL), "check_bounds: invalid partnum %d", p);
+ if ((c < 0) || (c > ((nf >> 1) - 1)))
+ err(SET_ERR(EINVAL), "check_bounds: out of bounds %d", c);
+}
+
void
writeGbe(void)
{
@@ -437,8 +465,6 @@ swap(int partnum)
void
block_unveil(void)
{
- err_if(unveil("/dev/urandom", "r") == -1);
-
if (flags == O_RDONLY) {
err_if(unveil(fname, "r") == -1);
err_if(unveil(NULL, NULL) == -1);