util/nvmutil: put hextonum in its own function

fsdg20230625
Leah Rowe 2022-11-27 09:29:37 +00:00
parent 9e5ff5e4e6
commit d7465efbb0
1 changed files with 50 additions and 23 deletions

View File

@ -30,13 +30,12 @@
#include <unistd.h> #include <unistd.h>
#include <errno.h> #include <errno.h>
#include <dirent.h> #include <dirent.h>
#ifdef HAVE_PLEDGE
#include <err.h> #include <err.h>
#endif
ssize_t readFromFile(int *fd, uint8_t *buf, const char *path, int flags, ssize_t readFromFile(int *fd, uint8_t *buf, const char *path, int flags,
size_t size); size_t size);
void setmac(const char *strMac); void setmac(const char *strMac);
uint8_t hextonum(char chs);
void cmd_dump(void); void cmd_dump(void);
void showmac(int partnum); void showmac(int partnum);
void hexdump(int partnum); void hexdump(int partnum);
@ -178,41 +177,30 @@ readFromFile(int *fd, uint8_t *buf, const char *path, int flags, size_t size)
void void
setmac(const char *strMac) setmac(const char *strMac)
{ {
uint8_t rmac[12]; uint8_t o, val8;
uint8_t o, ch, val8;
uint16_t val16; uint16_t val16;
int macfd, partnum, random, byte, nib; int partnum, byte, nib;
uint16_t mac[3] = {0, 0, 0}; uint16_t mac[3] = {0, 0, 0};
uint64_t total = 0; uint64_t total = 0;
if (readFromFile(&macfd, rmac, "/dev/urandom", O_RDONLY, 12) != 12)
return;
if (strnlen(strMac, 20) != 17) if (strnlen(strMac, 20) != 17)
goto invalid_mac_address; goto invalid_mac_address;
for (o = 0, random = 0; o < 16; o += 3) { for (o = 0; o < 16; o += 3) {
if (o != 15) if (o != 15)
if (strMac[o + 2] != ':') if (strMac[o + 2] != ':')
goto invalid_mac_address; goto invalid_mac_address;
byte = o / 3; byte = o / 3;
for (nib = 0; nib < 2; nib++, total += val8) { for (nib = 0; nib < 2; nib++, total += val8) {
ch = strMac[o + nib]; if ((val8 = hextonum(strMac[o + nib])) > 15) {
if ((ch >= '0') && ch <= '9') { if (errno != 0)
val8 = ch - '0'; return;
} else if ((ch >= 'A') && (ch <= 'F')) {
val8 = ch - 'A' + 10;
} else if ((ch >= 'a') && (ch <= 'f')) {
val8 = ch - 'a' + 10;
} else if (ch == '?') {
val8 = rmac[random++] & 0xf;
if ((byte == 0 && (nib == 1))) {
val8 &= 0xE;
val8 |= 2;
}
} else {
goto invalid_mac_address; goto invalid_mac_address;
} else if ((byte == 0 && (nib == 1))) {
val8 &= 0xE;
val8 |= 2;
} }
val16 = val8; val16 = val8;
if ((byte % 2) ^ 1) if ((byte % 2) ^ 1)
byteswap((uint8_t *) &val16); byteswap((uint8_t *) &val16);
@ -246,6 +234,45 @@ invalid_mac_address:
return; return;
} }
uint8_t
hextonum(char chs)
{
uint8_t val8, ch;
static int macfd;
static uint8_t *rmac = NULL;
static int random;
if (random > 15) {
close(macfd);
free(rmac);
random = 0;
rmac = NULL;
} else if (rmac == NULL) {
random = 0;
if ((rmac = (uint8_t *) malloc(12)) == NULL)
err(1, NULL);
if (readFromFile(&macfd, rmac, "/dev/urandom", O_RDONLY, 12)
!= 12) {
warn("%s", "/dev/urandom");
return 16;
}
}
ch = (uint8_t) chs;
if ((ch >= '0') && ch <= '9') {
val8 = ch - '0';
} else if ((ch >= 'A') && (ch <= 'F')) {
val8 = ch - 'A' + 10;
} else if ((ch >= 'a') && (ch <= 'f')) {
val8 = ch - 'a' + 10;
} else if (ch == '?') {
val8 = rmac[random++] & 0xf;
} else {
return 16;
}
return val8;
}
void void
cmd_dump(void) cmd_dump(void)
{ {