diff options
Diffstat (limited to 'util/nvmutil')
| -rw-r--r-- | util/nvmutil/nvmutil.c | 86 | 
1 files changed, 54 insertions, 32 deletions
| diff --git a/util/nvmutil/nvmutil.c b/util/nvmutil/nvmutil.c index 5cb53be8..86e9c814 100644 --- a/util/nvmutil/nvmutil.c +++ b/util/nvmutil/nvmutil.c @@ -42,6 +42,7 @@ int validChecksum(int partnum);  uint16_t word(int pos16, int partnum);  void setWord(int pos16, int partnum, uint16_t val);  void byteswap(uint8_t *byte); +void writeGbeFile(int *fd, const char *filename);  #define FILENAME argv[1]  #define COMMAND argv[2] @@ -51,7 +52,8 @@ void byteswap(uint8_t *byte);  #define SIZE_8KB 0x2000  uint8_t gbe[SIZE_8KB]; -int part, modified = 0; +int part, gbeFileModified = 0; +uint8_t nvmPartModified[2];  uint16_t test;  uint8_t little_endian; @@ -63,6 +65,8 @@ main(int argc, char *argv[])  	int flags = O_RDWR;  	char *strMac = NULL;  	char *strRMac = "??:??:??:??:??:??"; +	nvmPartModified[0] = 0; +	nvmPartModified[1] = 0;  	test = 1;  	little_endian = ((uint8_t *) &test)[0]; @@ -93,22 +97,16 @@ main(int argc, char *argv[])  	if (errno != 0)  		goto nvmutil_exit; -	if (readFromFile(&fd, gbe, FILENAME, flags, SIZE_8KB) -		== SIZE_8KB) -	{ -		if (strMac != NULL) -			setmac(strMac); -		else -			cmd(COMMAND); +	if (readFromFile(&fd, gbe, FILENAME, flags, SIZE_8KB) != SIZE_8KB) +		goto nvmutil_exit; -		if (modified) { -			errno = 0; -			if (pwrite(fd, gbe, SIZE_8KB, 0) == SIZE_8KB) -				close(fd); -			if (errno == 0) -				printf("%s successfully modified\n", FILENAME); -		} -	} +	if (strMac != NULL) +		setmac(strMac); +	else +		cmd(COMMAND); + +	if (gbeFileModified) +		writeGbeFile(&fd, FILENAME);  nvmutil_exit:  	if (errno == ENOTDIR) @@ -119,6 +117,27 @@ nvmutil_exit:  	return errno;  } +void +writeGbeFile(int *fd, const char *filename) +{ +	int partnum; +	errno = 0; + +	if (pwrite((*fd), gbe, SIZE_8KB, 0) == SIZE_8KB) +		close((*fd)); +	if (errno != 0) +		return; + +	for (partnum = 0; partnum < 2; partnum++) { +		if (nvmPartModified[partnum]) +			printf("Part %d modified\n", partnum); +		else +			fprintf (stderr, +				"Part %d NOT modified\n", partnum); +	} +	printf("File `%s` successfully modified\n", filename); +} +  ssize_t  readFromFile(int *fd, uint8_t *buf, const char *path, int flags, size_t size)  { @@ -152,8 +171,10 @@ setmac(const char *strMac)  	if (readFromFile(&macfd, rmac, "/dev/urandom", O_RDONLY, 12) != 12)  		return; -	else if (strnlen(strMac, 20) != 17) + +	if (strnlen(strMac, 20) != 17)  		goto invalid_mac_address; +  	for (o = 0, random = 0; o < 16; o += 3) {  		if (o != 15)  			if (strMac[o + 2] != ':') @@ -195,12 +216,12 @@ setmac(const char *strMac)  			byteswap((uint8_t *) &mac[o]);  	for (partnum = 0; partnum < 2; partnum++) { -		if (validChecksum(partnum)) { -			for (o = 0; o < 3; o++) -				setWord(o, partnum, mac[o]); -			part = partnum; -			cmd("setchecksum"); -		} +		if (!validChecksum(partnum)) +			continue; +		for (o = 0; o < 3; o++) +			setWord(o, partnum, mac[o]); +		part = partnum; +		cmd("setchecksum");  	}  	return;  invalid_mac_address: @@ -263,7 +284,7 @@ cmd(const char *command)  	} else if (strcmp(command, "swap") == 0) {  		part0 = validChecksum(0);  		part1 = validChecksum(1); -		if ((modified = (part0 | part1))) { +		if ((gbeFileModified = (part0 | part1))) {  			for(part0 = 0; part0 < SIZE_4KB; part0++) {  				gbe[part0] ^= gbe[part1 = (part0 | SIZE_4KB)];  				gbe[part1] ^= gbe[part0]; @@ -272,7 +293,7 @@ cmd(const char *command)  		}  	} else if (strcmp(command, "copy") == 0) {  		if (validChecksum(part)) -			memcpy(gbe + ((part ^ (modified = 1)) << 12), +			memcpy(gbe + ((part ^ (gbeFileModified = 1)) << 12),  				gbe + (part << 12), SIZE_4KB);  	} else  		errno = EINVAL; @@ -287,12 +308,12 @@ validChecksum(int partnum)  	for(w = 0; w <= 0x3F; w++)  		total += word(w, partnum); -	if (total != 0xBABA) { -		fprintf(stderr, "WARNING: BAD checksum in part %d\n", partnum); -		errno = ECANCELED; -		return 0; -	} -	return 1; +	if (total == 0xBABA) +		return 1; + +	fprintf(stderr, "WARNING: BAD checksum in part %d\n", partnum); +	errno = ECANCELED; +	return 0;  }  uint16_t @@ -310,7 +331,8 @@ setWord(int pos16, int partnum, uint16_t val)  	((uint16_t *) gbe)[pos16 + (partnum << 11)] = val;  	if (!little_endian)  		byteswap(gbe + (pos16 << 1) + (partnum << 12)); -	modified = 1; +	gbeFileModified = 1; +	nvmPartModified[partnum] = 1;  }  void | 
