summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Amelkin <alexander@amelkin.msk.ru>2018-11-16 22:21:14 +0300
committerAlexander Amelkin <alexander@amelkin.msk.ru>2018-11-16 22:25:27 +0300
commita4c10404202ad0f5064ff6149a30aa86c844a7a1 (patch)
tree94a105a196da59c6619603409d058e361f764e75
parent576d4855d9bb6cb6ca3d231ebc604836b8dba255 (diff)
downloadipmitool-a4c10404202ad0f5064ff6149a30aa86c844a7a1.tar.gz
fru: Fix processing of unspecified board mfg. date
FRU board mfg. date uses a different value for 'unspecified' timestamp than the general IPMI specification. This commit makes ekanalyzer and fru commands process unspecified FRU dates properly, displaying 'Unspecified' instead of 'Mon Jan 1 03:00:00 1996'. Resolves ipmitool/ipmitool#57 Signed-off-by: Alexander Amelkin <alexander@amelkin.msk.ru>
-rw-r--r--include/ipmitool/ipmi_fru.h15
-rw-r--r--lib/ipmi_ekanalyzer.c6
2 files changed, 19 insertions, 2 deletions
diff --git a/include/ipmitool/ipmi_fru.h b/include/ipmitool/ipmi_fru.h
index 28226d8..9726788 100644
--- a/include/ipmitool/ipmi_fru.h
+++ b/include/ipmitool/ipmi_fru.h
@@ -36,6 +36,7 @@
#include <inttypes.h>
#include <ipmitool/ipmi.h>
#include <ipmitool/ipmi_sdr.h>
+#include <ipmitool/ipmi_time.h>
#if HAVE_CONFIG_H
# include <config.h>
@@ -591,9 +592,21 @@ struct fru_picmgext_amc_link_desc_record {
#endif
/* FRU Board manufacturing date */
+#define FRU_BOARD_DATE_UNSPEC 0 /* IPMI FRU Information Storage Definition
+ v1.0 rev 1.3, Table 11-1 */
static inline time_t ipmi_fru2time_t(void *mfg_date) {
const uint64_t secs_from_1970_1996 = 820454400;
- return ipmi24toh(mfg_date) * 60 + secs_from_1970_1996;
+ uint32_t fru_ts = ipmi24toh(mfg_date);
+ time_t ts;
+
+ if (FRU_BOARD_DATE_UNSPEC == fru_ts) {
+ ts = IPMI_TIME_UNSPECIFIED;
+ }
+ else {
+ ts = fru_ts * 60 + secs_from_1970_1996;
+ }
+
+ return ts;
}
static const char * chassis_type_desc[] __attribute__((unused)) = {
"Unspecified", "Other", "Unknown",
diff --git a/lib/ipmi_ekanalyzer.c b/lib/ipmi_ekanalyzer.c
index b4fedaa..86c5550 100644
--- a/lib/ipmi_ekanalyzer.c
+++ b/lib/ipmi_ekanalyzer.c
@@ -2546,7 +2546,11 @@ ipmi_ek_display_fru_header_detail(char *filename)
}
ts = ipmi_fru2time_t(mfg_date);
- printf("Board Mfg Date: %ld, %s\n", ts, ipmi_timestamp_numeric(ts));
+ printf("Board Mfg Date: %ld, %s\n",
+ (IPMI_TIME_UNSPECIFIED == ts)
+ ? FRU_BOARD_DATE_UNSPEC
+ : ts,
+ ipmi_timestamp_numeric(ts));
board_length -= SIZE_MFG_DATE;
/* Board Mfg */