From 041118644383b7518500e3ce1d670dd90d1983d9 Mon Sep 17 00:00:00 2001 From: Zdenek Styblik Date: Thu, 18 Apr 2013 08:45:50 +0000 Subject: [PATCH] ID: 3608765 - Fixed big endian bug in ipmi_ek_display_carrier_connectivity. Fixed a bug where the carrier connectivity point to point descriptor was not being displayed properly when compiled on big endian machines. Commit for Dan Gora --- ipmitool/lib/ipmi_ekanalyzer.c | 42 ++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/ipmitool/lib/ipmi_ekanalyzer.c b/ipmitool/lib/ipmi_ekanalyzer.c index 24153e1..dc58586 100644 --- a/ipmitool/lib/ipmi_ekanalyzer.c +++ b/ipmitool/lib/ipmi_ekanalyzer.c @@ -803,7 +803,7 @@ ipmi_ek_display_carrier_connectivity( struct ipmi_ek_multi_header * record ) { int return_value = ERROR_STATUS; struct fru_picmgext_carrier_p2p_record rsc_desc; - struct fru_picmgext_carrier_p2p_descriptor port_desc; + struct fru_picmgext_carrier_p2p_descriptor *port_desc; if ( record == NULL ){ lprintf(LOG_ERR, "P2P connectivity record is invalid\n"); @@ -848,20 +848,32 @@ ipmi_ek_display_carrier_connectivity( struct ipmi_ek_multi_header * record ) (rsc_desc.resource_id & 0x0f)); } while ( rsc_desc.p2p_count > 0 ){ - memcpy ( &port_desc, &record->data[offset], - sizeof ( struct fru_picmgext_carrier_p2p_descriptor ) ); - offset += sizeof ( struct fru_picmgext_carrier_p2p_descriptor ); - if ( (port_desc.remote_resource_id & AMC_MODULE) == AMC_MODULE ){ - printf("\tPort %d =====> %s, Port %d\n", port_desc.local_port, - val2str( (port_desc.remote_resource_id & 0x0f), - ipmi_ekanalyzer_module_type), port_desc.remote_port ); - } - else{ - printf("\tPort %d =====> On Carrier Device ID %d, Port %d\n", - port_desc.local_port,(port_desc.remote_resource_id & 0x0f), - port_desc.remote_port ); - } - rsc_desc.p2p_count--; + unsigned char data[3]; +#ifndef WORDS_BIGENDIAN + data[0] = record->data[offset+0]; + data[1] = record->data[offset+1]; + data[2] = record->data[offset+2]; +#else + data[0] = record->data[offset+2]; + data[1] = record->data[offset+1]; + data[2] = record->data[offset+0]; +#endif + port_desc = (struct fru_picmgext_carrier_p2p_descriptor*)data; + offset += sizeof (struct fru_picmgext_carrier_p2p_descriptor); + if ((port_desc->remote_resource_id & AMC_MODULE) == AMC_MODULE) { + printf("\tPort %d =====> %s, Port %d\n", + port_desc->local_port, + val2str( (port_desc->remote_resource_id & 0x0f), + ipmi_ekanalyzer_module_type), + port_desc->remote_port); + } + else { + printf("\tPort %d =====> On Carrier Device ID %d, Port %d\n", + port_desc->local_port, + (port_desc->remote_resource_id & 0x0f), + port_desc->remote_port); + } + rsc_desc.p2p_count--; } } return_value = OK_STATUS;