diff options
author | Alexander Amelkin <alexander@amelkin.msk.ru> | 2018-11-16 22:21:14 +0300 |
---|---|---|
committer | Alexander Amelkin <alexander@amelkin.msk.ru> | 2018-11-16 22:25:27 +0300 |
commit | a4c10404202ad0f5064ff6149a30aa86c844a7a1 (patch) | |
tree | 94a105a196da59c6619603409d058e361f764e75 | |
parent | 576d4855d9bb6cb6ca3d231ebc604836b8dba255 (diff) | |
download | ipmitool-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.h | 15 | ||||
-rw-r--r-- | lib/ipmi_ekanalyzer.c | 6 |
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 */ |