diff options
Diffstat (limited to 'util/nvmutil/nvmutil.c')
| -rw-r--r-- | util/nvmutil/nvmutil.c | 98 |
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); |
