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 #include #include +#include #if HAVE_CONFIG_H # include @@ -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 */