summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Amelkin <alexander@amelkin.msk.ru>2019-05-30 16:05:55 +0300
committerAlexander Amelkin <alexander@amelkin.msk.ru>2019-06-04 12:18:23 +0300
commit69a44963d03362d4139774f2cf1e740dbbe487a5 (patch)
tree5f85a11e9f8d4b71212d9fe0b1f2e227d7aba469
parentca3a80fef832ed8a28f3048679b626cd110ff85a (diff)
downloadipmitool-69a44963d03362d4139774f2cf1e740dbbe487a5.tar.gz
Add support for command-specific completion codes
Some commands may return command-specific completion codes. Now they are all reported as 'Unknown'. Add helper functions to support such command-specific codes. Command handlers will need to define their own valstr arrays with completion code descriptions and then use specific_val2str() instead of generic val2str() to convert the completion code into a string. Also reduce code duplication in helper.c Signed-off-by: Alexander Amelkin <alexander@amelkin.msk.ru>
-rw-r--r--include/ipmitool/helper.h4
-rw-r--r--lib/helper.c69
2 files changed, 61 insertions, 12 deletions
diff --git a/include/ipmitool/helper.h b/include/ipmitool/helper.h
index 1da83fb..b9c834e 100644
--- a/include/ipmitool/helper.h
+++ b/include/ipmitool/helper.h
@@ -80,6 +80,10 @@ struct oemvalstr {
const char * str;
};
+const char *
+specific_val2str(uint16_t val,
+ const struct valstr *specific,
+ const struct valstr *generic);
const char * val2str(uint16_t val, const struct valstr * vs);
const char * oemval2str(uint32_t oem,uint16_t val, const struct oemvalstr * vs);
diff --git a/lib/helper.c b/lib/helper.c
index 46c4282..a069bef 100644
--- a/lib/helper.c
+++ b/lib/helper.c
@@ -319,26 +319,74 @@ mac2str(const uint8_t *buf)
return buf2str_extended(buf, 6, ":");
}
-const char * val2str(uint16_t val, const struct valstr *vs)
+/**
+ * Find the index of value in a valstr array
+ *
+ * @param[in] val The value to search for
+ * @param[in] vs The valstr array to search in
+ * @return >=0 The index into \p vs
+ * @return -1 Error: value \p val was not found in \p vs
+ */
+static
+inline
+off_t find_val_idx(uint16_t val, const struct valstr *vs)
{
- static char un_str[32];
- int i;
-
- for (i = 0; vs[i].str; i++) {
- if (vs[i].val == val)
- return vs[i].str;
+ if (vs) {
+ for (off_t i = 0; vs[i].str; ++i) {
+ if (vs[i].val == val) {
+ return i;
+ }
+ }
}
+ return -1;
+}
+
+/**
+ * Generate a statically allocated 'Unknown' string for the provided value.
+ * The function is not thread-safe (as most of ipmitool).
+ *
+ * @param[in] val The value to put into the string
+ * @returns A pointer to a statically allocated string
+ */
+static
+inline
+const char *unknown_val_str(uint16_t val)
+{
+ static char un_str[32];
memset(un_str, 0, 32);
snprintf(un_str, 32, "Unknown (0x%02X)", val);
return un_str;
}
+const char *
+specific_val2str(uint16_t val,
+ const struct valstr *specific,
+ const struct valstr *generic)
+{
+ int i;
+
+ if (0 <= (i = find_val_idx(val, specific))) {
+ return specific[i].str;
+ }
+
+ if (0 <= (i = find_val_idx(val, generic))) {
+ return generic[i].str;
+ }
+
+ return unknown_val_str(val);
+}
+
+const char * val2str(uint16_t val, const struct valstr *vs)
+{
+ return specific_val2str(val, NULL, vs);
+}
+
+
const char * oemval2str(uint32_t oem, uint16_t val,
const struct oemvalstr *vs)
{
- static char un_str[32];
int i;
for (i = 0; vs[i].oem != 0xffffff && vs[i].str; i++) {
@@ -349,10 +397,7 @@ const char * oemval2str(uint32_t oem, uint16_t val,
}
}
- memset(un_str, 0, 32);
- snprintf(un_str, 32, "Unknown (0x%X)", val);
-
- return un_str;
+ return unknown_val_str(val);
}
/* str2double - safely convert string to double