forked from pool/ipmitool
Thomas Renninger
e7e8d0d141
* Add: 0001-fix-typo.patch 0002-added-microTCA-major-version.patch 0003-replaced-removed-defines-which-are-already-present-i.patch 0004-fix-typo.patch 0005-fix-typo.patch 0006-ID-461-OpenSSL-1.1-compatibility-error-storage-size-.patch 0007-ID-461-Make-compiler-happier-about-changes-related-t.patch 0008-ID-474-Compile-fix-on-nonlinux-systems.patch 0009-Add-bootstrap-support-for-Mac.patch 0010-Prevent-autoreconf-from-complaining-about-missing-NE.patch 0011-Add-git-hash-and-dirty-mark-to-ipmitool-version.patch 0012-Add-some-more-configure-build-editor-byproducts-to-..patch 0013-ID-478-ekanalyzer-Fixed-decoding-of-FRU-fields.patch 0014-ID-479-ekanalyzer-fix-processing-of-custom-mfg.-fiel.patch 0015-ID-477-fru-Fix-decoding-of-non-text-data-in-get_fru_.patch 0016-Make-git-revision-more-descriptive.patch 0017-ID-480-ipmitool-coredumps-in-EVP_CIPHER_CTX_init.patch OBS-URL: https://build.opensuse.org/package/show/systemsmanagement/ipmitool?expand=0&rev=40
142 lines
4.7 KiB
Diff
142 lines
4.7 KiB
Diff
From 840f5730831b0d7cdb976b07e6c9c1aafc86f978 Mon Sep 17 00:00:00 2001
|
|
From: Alexander Amelkin <alexander@amelkin.msk.ru>
|
|
Date: Mon, 23 Jan 2017 12:47:35 +0300
|
|
Subject: [PATCH 13/17] ID:478 - ekanalyzer: Fixed decoding of FRU fields
|
|
|
|
Got rid of the field decoding code that was only capable of
|
|
processing ASCII and binary fields, and switched to using
|
|
get_fru_area_str() that can also decode BCDplus and 6-bit ASCII
|
|
and maybe will eventually be enabled to decode Unicode text
|
|
as well.
|
|
|
|
This is the first step to completely get rid of the completely
|
|
awfully written FRU data decoding functionality of ekanalyzer
|
|
that essentially duplicates that of ipmi_fru.c module.
|
|
---
|
|
include/ipmitool/ipmi_fru.h | 1 +
|
|
lib/ipmi_ekanalyzer.c | 50 ++++++++++++++++++++++++---------------------
|
|
2 files changed, 28 insertions(+), 23 deletions(-)
|
|
|
|
diff --git a/include/ipmitool/ipmi_fru.h b/include/ipmitool/ipmi_fru.h
|
|
index 65696ba..d03abfc 100644
|
|
--- a/include/ipmitool/ipmi_fru.h
|
|
+++ b/include/ipmitool/ipmi_fru.h
|
|
@@ -614,5 +614,6 @@ typedef struct ipmi_fru_bloc {
|
|
|
|
int ipmi_fru_main(struct ipmi_intf *intf, int argc, char **argv);
|
|
int ipmi_fru_print(struct ipmi_intf *intf, struct sdr_record_fru_locator *fru);
|
|
+char *get_fru_area_str(uint8_t *data, uint32_t *offset);
|
|
|
|
#endif /* IPMI_FRU_H */
|
|
diff --git a/lib/ipmi_ekanalyzer.c b/lib/ipmi_ekanalyzer.c
|
|
index 7a6c63d..35aa850 100644
|
|
--- a/lib/ipmi_ekanalyzer.c
|
|
+++ b/lib/ipmi_ekanalyzer.c
|
|
@@ -37,6 +37,7 @@
|
|
#include <ipmitool/log.h>
|
|
#include <ipmitool/helper.h>
|
|
#include <ipmitool/ipmi_strings.h>
|
|
+#include <ipmitool/ipmi_fru.h>
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
@@ -2702,6 +2703,12 @@ ipmi_ek_display_board_info_area(FILE *input_file, char *board_type,
|
|
}
|
|
file_offset = ftell(input_file);
|
|
|
|
+ /*
|
|
+ * TODO: This whole file's code is extremely dirty and wicked.
|
|
+ * Must eventually switch to using ipmi_fru.c code or some
|
|
+ * specialized FRU library.
|
|
+ */
|
|
+
|
|
/* Board length*/
|
|
ret = fread(&len, 1, 1, input_file);
|
|
if ((ret != 1) || ferror(input_file)) {
|
|
@@ -2717,14 +2724,15 @@ ipmi_ek_display_board_info_area(FILE *input_file, char *board_type,
|
|
goto out;
|
|
}
|
|
if (strncmp(board_type, "Custom", 6 ) != 0) {
|
|
- unsigned char *data;
|
|
+ unsigned char *data, *str;
|
|
unsigned int i = 0;
|
|
- data = malloc(size_board);
|
|
+ data = malloc(size_board + 1); /* Make room for type/length field */
|
|
if (data == NULL) {
|
|
lprintf(LOG_ERR, "ipmitool: malloc failure");
|
|
return (size_t)(-1);
|
|
}
|
|
- ret = fread(data, size_board, 1, input_file);
|
|
+ data[0] = len; /* Save the type/length byte in 'data' */
|
|
+ ret = fread(data + 1, size_board, 1, input_file);
|
|
if ((ret != 1) || ferror(input_file)) {
|
|
lprintf(LOG_ERR, "Invalid board type size!");
|
|
free(data);
|
|
@@ -2733,17 +2741,11 @@ ipmi_ek_display_board_info_area(FILE *input_file, char *board_type,
|
|
}
|
|
printf("%s type: 0x%02x\n", board_type, len);
|
|
printf("%s: ", board_type);
|
|
- for (i = 0; i < size_board; i++) {
|
|
- if ((len & TYPE_CODE) == TYPE_CODE) {
|
|
- printf("%c", data[i]);
|
|
- } else {
|
|
- /* other than language code (binary, BCD,
|
|
- * ASCII 6 bit...) is not supported
|
|
- */
|
|
- printf("%02x", data[i]);
|
|
- }
|
|
- }
|
|
- printf("\n");
|
|
+ i = 0;
|
|
+ str = (unsigned char *)get_fru_area_str(data, &i);
|
|
+ printf("%s\n", str);
|
|
+ free(str);
|
|
+ str = NULL;
|
|
free(data);
|
|
data = NULL;
|
|
(*board_length) -= size_board;
|
|
@@ -2772,14 +2774,15 @@ ipmi_ek_display_board_info_area(FILE *input_file, char *board_type,
|
|
}
|
|
printf("Additional Custom Mfg. length: 0x%02x\n", len);
|
|
if ((size_board > 0) && (size_board < (*board_length))) {
|
|
- unsigned char * additional_data = NULL;
|
|
+ unsigned char *additional_data, *str;
|
|
unsigned int i = 0;
|
|
- additional_data = malloc(size_board);
|
|
+ additional_data = malloc(size_board + 1); /* Make room for type/length field */
|
|
if (additional_data == NULL) {
|
|
lprintf(LOG_ERR, "ipmitool: malloc failure");
|
|
return (size_t)(-1);
|
|
}
|
|
- ret = fread(additional_data, size_board, 1, input_file);
|
|
+ additional_data[0] = len;
|
|
+ ret = fread(additional_data + 1, size_board, 1, input_file);
|
|
if ((ret != 1) || ferror(input_file)) {
|
|
lprintf(LOG_ERR, "Invalid Additional Data!");
|
|
if (additional_data != NULL) {
|
|
@@ -2788,14 +2791,15 @@ ipmi_ek_display_board_info_area(FILE *input_file, char *board_type,
|
|
}
|
|
goto out;
|
|
}
|
|
- printf("Additional Custom Mfg. Data: %02x",
|
|
- additional_data[0]);
|
|
- for (i = 1; i < size_board; i++) {
|
|
- printf("-%02x", additional_data[i]);
|
|
- }
|
|
- printf("\n");
|
|
+ printf("Additional Custom Mfg. Data: ");
|
|
+ i = 0;
|
|
+ str = (unsigned char *)get_fru_area_str(additional_data, &i);
|
|
+ printf("%s\n", str);
|
|
+ free(str);
|
|
+ str = NULL;
|
|
free(additional_data);
|
|
additional_data = NULL;
|
|
+
|
|
(*board_length) -= size_board;
|
|
}
|
|
else {
|
|
--
|
|
1.8.5.6
|
|
|