summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--util/nvmutil/nvmutil.c72
1 files changed, 53 insertions, 19 deletions
diff --git a/util/nvmutil/nvmutil.c b/util/nvmutil/nvmutil.c
index 1910c974..8cab66ac 100644
--- a/util/nvmutil/nvmutil.c
+++ b/util/nvmutil/nvmutil.c
@@ -77,26 +77,41 @@ op_t op[] = {
};
void (*cmd)(void) = NULL;
-#define err_if(x) if (x) err(EXIT_FAILURE, "%s", filename)
+#define err_if(x) \
+ do { \
+ if (x) { \
+ err(EXIT_FAILURE, "%s", filename); \
+ } \
+ } while(0)
#define xopen(f,l,p) \
do { \
- if ((f = open_on_eintr(l, p)) == -1) \
- err(EXIT_FAILURE, "%s", l); \
- if (fstat(f, &st) == -1) \
- err(EXIT_FAILURE, "%s", l); \
+ if ((f = open_on_eintr(l, p)) == -1) { \
+ err(EXIT_FAILURE, "%s", l); \
+ } \
+ if (fstat(f, &st) == -1) { \
+ err(EXIT_FAILURE, "%s", l); \
+ } \
} while(0)
-#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)
+#define word(pos16, partnum) \
+ (((uint16_t *) gbe[partnum])[pos16])
+
+#define setWord(pos16, p, val16) \
+ do { \
+ if (word(pos16, p) != val16) { \
+ nvmPartChanged[p] = 1 | (word(pos16, p) = val16); \
+ } \
+ } while(0)
-#define SUCCESS(x) ((x) >= 0)
+#define SUCCESS(x) \
+ ((x) >= 0)
#define reset_caller_errno(return_value) \
do { \
- if (SUCCESS(return_value) && (!errno)) \
- errno = saved_errno; \
+ if (SUCCESS(return_value) && (!errno)) { \
+ errno = saved_errno; \
+ } \
} while (0)
int
@@ -283,7 +298,7 @@ cmd_setmac(void)
if (mac_updated)
return;
- errno = EINVAL;
+ errno = ECANCELED;
err(EXIT_FAILURE, "Error updating MAC address");
}
@@ -376,6 +391,11 @@ cmd_dump(void)
printf("MAC (part %d): ", partnum);
macf(partnum);
hexdump(partnum);
+
+ if (numInvalid > 1) {
+ errno = EINVAL;
+ err(EXIT_FAILURE, "dump: No valid checksums");
+ }
}
}
@@ -407,6 +427,7 @@ hexdump(int partnum)
}
}
+/* WARNING: Cannot fail. Make sure the file is valid. */
void
cmd_setchecksum(void)
{
@@ -420,22 +441,30 @@ cmd_setchecksum(void)
void
cmd_brick(void)
{
- if (goodChecksum(part))
+ if (goodChecksum(part)) {
setWord(NVM_CHECKSUM_WORD, part,
((word(NVM_CHECKSUM_WORD, part)) ^ 0xFF));
+ } else {
+ errno = ECANCELED;
+ err(EXIT_FAILURE, "brick: Bad checksum in part %d", part);
+ }
}
void
cmd_copy(void)
{
nvmPartChanged[part ^ 1] = goodChecksum(part);
+ if (!nvmPartChanged[part ^ 1]) {
+ errno = ECANCELED;
+ err(EXIT_FAILURE, "copy: Bad checksum in part %d", part);
+ }
}
void
cmd_swap(void) {
if(!(goodChecksum(0) || goodChecksum(1))) {
- errno = EINVAL;
- err(EXIT_FAILURE, "Invalid checksums");
+ errno = ECANCELED;
+ err(EXIT_FAILURE, "swap: Bad checksums");
}
gbe[0] ^= gbe[1];
@@ -502,8 +531,10 @@ xclose(int *fd)
int saved_errno = errno;
int rval = 0;
- if (fd == NULL)
+ if (fd == NULL) {
+ errno = EBADF;
err(EXIT_FAILURE, "xclose: null pointer");
+ }
if (*fd < 0)
return;
@@ -710,21 +741,24 @@ if_err_sys(int condition)
#define fs_err_retry() \
do { \
if ((rval == -1) && \
- (errno == EINTR)) \
+ (errno == EINTR)) { \
return 1; \
- if (rval >= 0 && !errno) \
+ } \
+ if (rval >= 0 && !errno) { \
errno = saved_errno; \
- return 0; \
+ } \
} while(0)
int
fs_retry(int saved_errno, int rval)
{
fs_err_retry();
+ return 0;
}
int
rw_retry(int saved_errno, ssize_t rval)
{
fs_err_retry();
+ return 0;
}