summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Sommerseth <davids@redhat.com>2009-04-10 13:52:47 +0200
committerDavid Sommerseth <davids@redhat.com>2009-04-29 11:22:12 +0200
commit38c943db697b13e5f9be020a0729f58b7366e932 (patch)
tree1c7c8dec01ec2f86883d12a336c46a8ffe1655b0
parent62f276eea2d8477854d7fe9b230a957a8df4102c (diff)
downloadpython-dmidecode-38c943db697b13e5f9be020a0729f58b7366e932.tar.gz
python-dmidecode-38c943db697b13e5f9be020a0729f58b7366e932.tar.xz
python-dmidecode-38c943db697b13e5f9be020a0729f58b7366e932.zip
Cleaned up the XML data
-rw-r--r--src/dmidecode.c361
-rw-r--r--src/dmidecode.h2
-rw-r--r--src/dmihelper.h90
3 files changed, 79 insertions, 374 deletions
diff --git a/src/dmidecode.c b/src/dmidecode.c
index 9c00e63..c348380 100644
--- a/src/dmidecode.c
+++ b/src/dmidecode.c
@@ -702,8 +702,8 @@ void dmi_processor_type(xmlNode *node, u8 code)
};
xmlNode *proct_n = xmlNewChild(node, NULL, (xmlChar *) "Type", NULL);
assert( proct_n != NULL );
- dmixml_AddAttribute(proct_n, "dmispec", "3.3.5");
dmixml_AddAttribute(proct_n, "flags", "0x%04x", code);
+
if(code >= 0x01 && code <= 0x06) {
dmixml_AddTextContent(proct_n, type[code - 0x01]);
} else {
@@ -1000,7 +1000,6 @@ xmlNode *dmi_processor_id(xmlNode *node, u8 type, const u8 * p, const char *vers
xmlNode *flags_n = NULL;
xmlNode *data_n = xmlNewChild(node, NULL, (xmlChar *) "CPUCore", NULL);
assert( data_n != NULL );
- dmixml_AddAttribute(data_n, "dmispec", "3.3.5");
/*
** Extra flags are now returned in the ECX register when one calls
@@ -1149,8 +1148,8 @@ void dmi_processor_voltage(xmlNode *node, u8 code)
dmixml_AddAttribute(vltg_n, "flags", "0x%04x", code);
if(code & 0x80) {
- dmixml_AddTextChild(vltg_n, "Voltage", "%.1f", (float)(code & 0x7f) / 10);
- dmixml_AddAttribute(vltg_n, "unit", "V");
+ xmlNode *v_n = dmixml_AddTextChild(vltg_n, "Voltage", "%.1f", (float)(code & 0x7f) / 10);
+ dmixml_AddAttribute(v_n, "unit", "V");
} else if( code == 0x00 ) {
dmixml_AddAttribute(vltg_n, "unknown_value", "1");
} else {
@@ -1242,10 +1241,10 @@ void dmi_processor_cache(xmlNode *cache_n, u16 code, u16 ver)
{
assert( cache_n != NULL );
- dmixml_AddAttribute(cache_n, "flags", "0x%04x", code);
dmixml_AddAttribute(cache_n, "ver", "0x%04x", ver);
if(code == 0xFFFF) {
+ dmixml_AddAttribute(cache_n, "flags", "0x%04x", code);
if(ver >= 0x0203) {
dmixml_AddAttribute(cache_n, "provided", "0");
dmixml_AddAttribute(cache_n, "available", "1");
@@ -1255,7 +1254,7 @@ void dmi_processor_cache(xmlNode *cache_n, u16 code, u16 ver)
} else {
dmixml_AddAttribute(cache_n, "provided", "1");
dmixml_AddAttribute(cache_n, "available", "1");
- dmixml_AddTextChild(cache_n, "Handle", "0x%04x", code);
+ dmixml_AddAttribute(cache_n, "Handle", "0x%04x", code);
}
}
@@ -3645,7 +3644,7 @@ void dmi_additional_info(xmlNode *node, const struct dmi_header *h)
** Main
*/
-void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
+xmlNode *dmi_decode(struct dmi_header * h, u16 ver)
{
const u8 *data = h->data;
xmlNode *sect_n = NULL, *sub_n = NULL, *sub2_n = NULL;
@@ -3655,18 +3654,17 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
//dmi_codes_major *dmiMajor = (dmi_codes_major *)&dmiCodesMajor[map_maj[h->type]];
dmi_codes_major *dmiMajor = (dmi_codes_major *) &dmiCodesMajor[h->type];
- dmixml_AddAttribute(handle_n, "id", "%s", dmiMajor->id);
- dmixml_AddAttribute(handle_n, "type", "%i", h->type);
- dmixml_AddTextChild(handle_n, "description", "%s", dmiMajor->desc);
+
+ sect_n = xmlNewNode(NULL, (xmlChar *) dmiMajor->tagname);
+ assert( sect_n != NULL );
+
+ dmixml_AddAttribute(sect_n, "id", "%s", dmiMajor->id);
+ dmixml_AddAttribute(sect_n, "type", "%i", h->type);
+ dmixml_AddTextChild(sect_n, "description", "%s", dmiMajor->desc);
switch (h->type) {
case 0: /* 3.3.1 BIOS Information */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "BIOSinformation", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.1");
-
if(h->length < 0x12) {
- sect_n = NULL;
break;
}
@@ -3695,7 +3693,6 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
sub_n = NULL;
if(h->length < 0x13) {
- sect_n = NULL;
break;
}
@@ -3707,7 +3704,6 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
sub_n = NULL;
if(h->length < 0x14) {
- sect_n = NULL;
break;
}
@@ -3719,7 +3715,6 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
sub_n = NULL;
if(h->length < 0x18) {
- sect_n = NULL;
break;
}
@@ -3730,16 +3725,10 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
if(data[0x16] != 0xFF && data[0x17] != 0xFF) {
dmixml_AddTextChild(sect_n, "FirmwareRevision", "%i.%i", data[0x16], data[0x17]);
}
- sect_n = NULL;
break;
case 1: /* 3.3.2 System Information */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "SystemInformation", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.2");
-
if(h->length < 0x08) {
- sect_n = NULL;
break;
}
@@ -3749,7 +3738,6 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmixml_AddTextChild(sect_n, "SerialNumber", "%s", dmi_string(h, data[0x07]));
if(h->length < 0x19) {
- sect_n = NULL;
break;
}
@@ -3758,23 +3746,15 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmi_system_wake_up_type(sect_n, data[0x18]);
if(h->length < 0x1B) {
- sect_n = NULL;
break;
}
dmixml_AddTextChild(sect_n, "SKUnumber", "%s", dmi_string(h, data[0x19]));
dmixml_AddTextChild(sect_n, "Family", "%s", dmi_string(h, data[0x1A]));
-
- sect_n = NULL;
break;
case 2: /* 3.3.3 Base Board Information */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "BaseboardInformation", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.3");
-
if(h->length < 0x08) {
- sect_n = NULL;
break;
}
@@ -3784,7 +3764,6 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmixml_AddTextChild(sect_n, "SerialNumber", "%s", dmi_string(h, data[0x07]));
if(h->length < 0x0F) {
- sect_n = NULL;
break;
}
@@ -3798,20 +3777,14 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmi_base_board_type(sect_n, "Type", data[0x0D]);
if(h->length < 0x0F + data[0x0E] * sizeof(u16)) {
- sect_n = NULL;
break;
}
dmi_base_board_handles(sect_n, data[0x0E], data + 0x0F);
- sect_n = NULL;
break;
case 3: /* 3.3.4 Chassis Information */
- sect_n= xmlNewChild(handle_n, NULL, (xmlChar *) "ChassisInformation", NULL);
- assert( sect_n != NULL );
-
if(h->length < 0x09) {
- sect_n = NULL;
break;
}
@@ -3823,7 +3796,6 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmixml_AddTextChild(sect_n, "AssetTag", "%s", dmi_string(h, data[0x08]));
if(h->length < 0x0D) {
- sect_n = NULL;
break;
}
@@ -3838,14 +3810,12 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmi_chassis_security_status(sect_n, data[0x0C]);
if(h->length < 0x11) {
- sect_n = NULL;
break;
}
dmixml_AddTextChild(sect_n, "OEMinformation", "0x%08x", DWORD(data + 0x0D));
if(h->length < 0x13) {
- sect_n = NULL;
break;
}
@@ -3853,21 +3823,14 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmi_chassis_power_cords(sect_n, data[0x12]);
if((h->length < 0x15) || (h->length < 0x15 + data[0x13] * data[0x14])){
- sect_n = NULL;
break;
}
dmi_chassis_elements(sect_n, data[0x13], data[0x14], data + 0x15);
- sect_n = NULL;
break;
case 4: /* 3.3.5 Processor Information */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "ProcessorInformation", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.5");
-
if(h->length < 0x1A) {
- sect_n = NULL;
break;
}
@@ -3912,7 +3875,6 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmi_processor_upgrade(sect_n, data[0x19]);
if(h->length < 0x20) {
- sect_n = NULL;
break;
}
@@ -3943,7 +3905,6 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
sub_n = NULL;
if(h->length < 0x23) {
- sect_n = NULL;
break;
}
@@ -3952,7 +3913,6 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmixml_AddTextChild(sect_n, "PartNumber", "%s", dmi_string(h, data[0x22]));
if(h->length < 0x28) {
- sect_n = NULL;
break;
}
@@ -3973,19 +3933,12 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmi_processor_characteristics(sub_n, WORD(data + 0x26));
sub_n = NULL;
-
- sect_n = NULL;
break;
case 5: /* 3.3.6 Memory Controller Information */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "MemoryControllerInformation", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.6");
-
dmi_on_board_devices(sect_n, "dmi_on_board_devices", h);
if(h->length < 0x0F) {
- sect_n = NULL;
break;
}
@@ -4014,31 +3967,23 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmi_processor_voltage(sect_n, data[0x0D]);
if(h->length < 0x0F + data[0x0E] * sizeof(u16)) {
- sect_n = NULL;
break;
}
dmi_memory_controller_slots(sect_n, data[0x0E], data + 0x0F);
if(h->length < 0x10 + data[0x0E] * sizeof(u16)) {
- sect_n = NULL;
break;
}
dmi_memory_controller_ec_capabilities(sect_n, "EnabledErrorCorrection",
data[0x0F + data[0x0E] * sizeof(u16)]);
- sect_n = NULL;
break;
case 6: /* 3.3.7 Memory Module Information */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "MemoryModuleInformation", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.7");
-
dmi_on_board_devices(sect_n, "dmi_on_board_devices", h);
if(h->length < 0x0C) {
- sect_n = NULL;
break;
}
@@ -4050,18 +3995,12 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmi_memory_module_size(sect_n, "InstalledSize", data[0x09]);
dmi_memory_module_size(sect_n, "EnabledSize", data[0x0A]);
dmi_memory_module_error(sect_n, data[0x0B]);
- sect_n = NULL;
break;
case 7: /* 3.3.8 Cache Information */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "CacheInformation", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.8");
-
dmi_on_board_devices(sect_n, "dmi_on_board_devices", h);
if(h->length < 0x0F) {
- sect_n = NULL;
break;
}
@@ -4083,7 +4022,6 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmi_cache_types(sect_n, "InstalledSRAMtypes", WORD(data + 0x0D));
if(h->length < 0x13) {
- sect_n = NULL;
break;
}
@@ -4091,19 +4029,12 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmi_cache_ec_type(sect_n, data[0x10]);
dmi_cache_type(sect_n, data[0x11]);
dmi_cache_associativity(sect_n, data[0x12]);
-
- sect_n = NULL;
break;
case 8: /* 3.3.9 Port Connector Information */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "PortConnectorInformation", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.9");
-
dmi_on_board_devices(sect_n, "dmi_on_board_devices", h);
if(h->length < 0x09) {
- sect_n = NULL;
break;
}
@@ -4121,19 +4052,12 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmi_port_connector_type(sect_n, "external", data[0x07]);
dmi_port_type(sect_n, data[0x08]);
-
- sect_n = NULL;
break;
case 9: /* 3.3.10 System Slots */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "SystemSlots", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.10");
-
dmi_on_board_devices(sect_n, "dmi_on_board_devices", h);
if(h->length < 0x0C) {
- sect_n = NULL;
break;
}
@@ -4150,76 +4074,42 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
} else {
dmi_slot_characteristics(sect_n, data[0x0B], data[0x0C]);
}
-
- sect_n = NULL;
break;
case 10: /* 3.3.11 On Board Devices Information */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "OnBoardDevicesInformation", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.11");
-
dmi_on_board_devices(sect_n, "dmi_on_board_devices", h);
-
- sect_n = NULL;
break;
case 11: /* 3.3.12 OEM Strings */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "OEMstrings", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.12");
-
dmi_on_board_devices(sect_n, "dmi_on_board_devices", h);
if(h->length < 0x05) {
- sect_n = NULL;
break;
}
dmi_oem_strings(sect_n, h);
-
- sect_n = NULL;
break;
case 12: /* 3.3.13 System Configuration Options */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "SystemConfigurationOptions", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.13");
-
if(h->length < 0x05) {
- sect_n = NULL;
break;
}
dmi_system_configuration_options(sect_n, h);
-
- sect_n = NULL;
break;
case 13: /* 3.3.14 BIOS Language Information */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "BIOSlanguageInformation", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.14");
-
if(h->length < 0x16) {
- sect_n = NULL;
break;
}
dmixml_AddAttribute(sect_n, "installable_languages", "%i", data[0x04]);
dmi_bios_languages(sect_n, h);
-
- sect_n = NULL;
break;
case 14: /* 3.3.15 Group Associations */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "GroupAssociations", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.15");
-
if(h->length < 0x05) {
- sect_n = NULL;
break;
}
@@ -4229,18 +4119,11 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
assert( sub_n != NULL );
dmi_group_associations_items(sub_n, (h->length - 0x05) / 3, data + 0x05);
sub_n = NULL;
-
- sect_n = NULL;
break;
case 15: /* 3.3.16 System Event Log */
// SysEventLog - sect_n
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "SystemEventLog", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.16");
-
if(h->length < 0x14) {
- sect_n = NULL;
break;
}
@@ -4268,7 +4151,6 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmixml_AddTextChild(sub2_n, "ChangeToken", "0x%08x", DWORD(data + 0x0C));
if(h->length < 0x17) {
- sect_n = NULL;
break;
}
@@ -4286,7 +4168,6 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmixml_AddAttribute(sub_n, "count", "%i", data[0x15]);
if(h->length < 0x17 + data[0x15] * data[0x16]) {
- sect_n = NULL;
break;
}
@@ -4295,17 +4176,10 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
// SysEventLog/LogTypes/LogType
dmi_event_log_descriptors(sub_n, data[0x15], data[0x16], data + 0x17);
sub_n = NULL;
-
- sect_n = NULL;
break;
case 16: /* 3.3.17 Physical Memory Array */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "PhysicalMemoryArray", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.17");
-
if(h->length < 0x0F) {
- sect_n = NULL;
break;
}
@@ -4315,17 +4189,10 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmi_memory_array_ec_type(sect_n, data[0x06]);
dmi_memory_array_capacity(sect_n, DWORD(data + 0x07));
dmi_memory_array_error_handle(sect_n, WORD(data + 0x0B));
-
- sect_n = NULL;
break;
case 17: /* 3.3.18 Memory Device */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "MemoryDevice", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.18");
-
if(h->length < 0x15) {
- sect_n = NULL;
break;
}
@@ -4344,14 +4211,12 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmi_memory_device_type_detail(sect_n, WORD(data + 0x13));
if(h->length < 0x17) {
- sect_n = NULL;
break;
}
dmi_memory_device_speed(sect_n, WORD(data + 0x15));
if(h->length < 0x1B) {
- sect_n = NULL;
break;
}
@@ -4359,27 +4224,19 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmixml_AddTextChild(sect_n, "SerialNumber", "%s", dmi_string(h, data[0x18]));
dmixml_AddTextChild(sect_n, "AssetTag", "%s", dmi_string(h, data[0x19]));
dmixml_AddTextChild(sect_n, "PartNumber", "%s", dmi_string(h, data[0x1A]));
-
- sect_n = NULL;
break;
case 18: /* 3.3.19 32-bit Memory Error Information */
case 33: /* 3.3.34 64-bit Memory Error Information */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "MemoryErrorInfo", NULL);
- assert( sect_n != NULL );
-
if( h->type == 18 ) {
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.19");
dmixml_AddAttribute(sect_n, "bits", "32");
} else {
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.34");
dmixml_AddAttribute(sect_n, "bits", "64");
}
if( ((h->type == 18) && (h->length < 0x17)) /* 32-bit */
|| ((h->type == 33) && (h->length < 0x1F)) ) /* 64-bit */
{
- sect_n = NULL;
break;
}
@@ -4399,17 +4256,10 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmi_64bit_memory_error_address(sect_n, "DeviceAddr", QWORD(data + 0x13));
dmi_32bit_memory_error_address(sect_n, "Resolution", DWORD(data + 0x1B));
}
-
- sect_n = NULL;
break;
case 19: /* 3.3.20 Memory Array Mapped Address */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "MemoryArrayMappedAddress", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.20");
-
if(h->length < 0x0F) {
- sect_n = NULL;
break;
}
@@ -4422,17 +4272,10 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmi_mapped_address_size(sect_n, DWORD(data + 0x08) - DWORD(data + 0x04) + 1);
dmixml_AddTextChild(sect_n, "PhysicalArrayHandle", "0x%04x", WORD(data + 0x0C));
dmixml_AddTextChild(sect_n, "PartitionWidth", "%i", data[0x0F]);
-
- sect_n = NULL;
break;
case 20: /* 3.3.21 Memory Device Mapped Address */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "MemoryDeviceMappedAddress", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.21");
-
if(h->length < 0x13) {
- sect_n = NULL;
break;
}
@@ -4453,34 +4296,20 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmi_mapped_address_interleave_position(sect_n, data[0x11]);
dmi_mapped_address_interleaved_data_depth(sect_n, data[0x12]);
-
- sect_n = NULL;
break;
case 21: /* 3.3.22 Built-in Pointing Device */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "BuiltInPointingDevice", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.22");
-
if(h->length < 0x07) {
- sect_n = NULL;
break;
}
dmi_pointing_device_type(sect_n, data[0x04]);
dmi_pointing_device_interface(sect_n, data[0x05]);
dmixml_AddTextContent(sect_n, "Buttons", "%i", data[0x06]);
-
- sect_n = NULL;
break;
case 22: /* 3.3.23 Portable Battery */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "PortableBattery", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.23");
-
if(h->length < 0x10) {
- sect_n = NULL;
break;
}
@@ -4508,7 +4337,6 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmi_battery_maximum_error(sect_n, data[0x0F]);
if(h->length < 0x1A) {
- sect_n = NULL;
break;
}
@@ -4526,17 +4354,10 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
}
dmixml_AddTextChild(sect_n, "OEMinformation", "%s", "0x%08x", DWORD(data + 0x16));
-
- sect_n = NULL;
break;
case 23: /* 3.3.24 System Reset */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "SystemReset", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.24");
-
if(h->length < 0x0D) {
- sect_n = NULL;
break;
}
@@ -4551,7 +4372,6 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
sub_n = NULL;
if(!(data[0x04] & (1 << 5))) {
- sect_n = NULL;
break;
}
@@ -4563,17 +4383,10 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmi_system_reset_timer(sect_n, "TimerInterval", WORD(data + 0x09));
dmi_system_reset_timer(sect_n, "Timeout", WORD(data + 0x0B));
-
- sect_n = NULL;
break;
case 24: /* 3.3.25 Hardware Security */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "HardwareSecurity", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.25");
-
if(h->length < 0x05) {
- sect_n = NULL;
break;
}
@@ -4582,31 +4395,20 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmi_hardware_security_status(sect_n, "AdministratorPassword", (data[0x04] >> 2) & 0x3);
dmi_hardware_security_status(sect_n, "FronPanelReset", data[0x04] & 0x3);
- sect_n = NULL;
break;
case 25: /* 3.3.26 System Power Controls */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "SystemPowerControls", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.26");
-
if(h->length < 0x09) {
- sect_n = NULL;
break;
}
dmi_power_controls_power_on(sect_n, "NextSchedPowerOn", data + 0x04);
-
- sect_n = NULL;
break;
case 26: /* 3.3.27 Voltage Probe */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "VoltageProbe", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.27");
+ dmixml_AddAttribute(sect_n, "probetype", "Voltage");
if(h->length < 0x14) {
- sect_n = NULL;
break;
}
@@ -4625,22 +4427,14 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmixml_AddTextChild(sect_n, "OEMinformation", "0x%08x", DWORD(data + 0x10));
if(h->length < 0x16) {
- sect_n = NULL;
break;
}
dmi_voltage_probe_value(sect_n, "NominalValue", WORD(data + 0x14));
-
- sect_n = NULL;
break;
case 27: /* 3.3.28 Cooling Device */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "CoolingDevice", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.28");
-
if(h->length < 0x0C) {
- sect_n = NULL;
break;
}
@@ -4658,22 +4452,16 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmixml_AddTextChild(sect_n, "OEMinformation", "0x%08x", DWORD(data + 0x08));
if(h->length < 0x0E) {
- sect_n = NULL;
break;
}
dmi_cooling_device_speed(sect_n, WORD(data + 0x0C));
-
- sect_n = NULL;
break;
case 28: /* 3.3.29 Temperature Probe */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "TemperatureProbe", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.29");
+ dmixml_AddAttribute(sect_n, "probetype", "Temperature");
if(h->length < 0x14) {
- sect_n = NULL;
break;
}
@@ -4690,22 +4478,16 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmixml_AddTextChild(sect_n, "OEMinformation", "0x%08x", DWORD(data + 0x10));
if(h->length < 0x16) {
- sect_n = NULL;
break;
}
dmi_temperature_probe_value(sect_n, "NominalValue", WORD(data + 0x14));
-
- sect_n = NULL;
break;
case 29: /* 3.3.30 Electrical Current Probe */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "ElectricalCurrentProbe", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.30");
+ dmixml_AddAttribute(sect_n, "probetype", "Electrical Current");
if(h->length < 0x14) {
- sect_n = NULL;
break;
}
@@ -4723,61 +4505,38 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmixml_AddTextChild(sect_n, "OEMinformation", "0x%08x", DWORD(data + 0x10));
if(h->length < 0x16) {
- sect_n = NULL;
break;
}
dmi_current_probe_value(sect_n, "NominalValue", WORD(data + 0x14));
-
- sect_n = NULL;
break;
case 30: /* 3.3.31 Out-of-band Remote Access */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "OutOfBandRemoteAccess", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.31");
-
if(h->length < 0x06) {
- sect_n = NULL;
break;
}
dmixml_AddTextChild(sect_n, "ManufacturerName", "%s", dmi_string(h, data[0x04]));
dmixml_AddAttribute(sect_n, "InboundConnectionEnabled", "%i", data[0x05] & (1 << 0) ? 1 : 0);
dmixml_AddAttribute(sect_n, "OutboundConnectionEnabled", "%i", data[0x05] & (1 << 1) ? 1 : 0);
-
- sect_n = NULL;
break;
case 31: /* 3.3.32 Boot Integrity Services Entry Point */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "BootIntegrityServiceEntryPoint", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.32");
dmixml_AddAttribute(sect_n, "NOT_IMPLEMENTED", "1");
break;
case 32: /* 3.3.33 System Boot Information */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "SystemBootInformation", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.33");
-
if(h->length < 0x0B) {
- sect_n = NULL;
break;
}
dmi_system_boot_status(sect_n, data[0x0A]);
-
- sect_n = NULL;
break;
case 34: /* 3.3.35 Management Device */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "ManagementDevice", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.35");
+ dmixml_AddAttribute(sect_n, "mgmtype", "");
if(h->length < 0x0B) {
- sect_n = NULL;
break;
}
@@ -4785,17 +4544,12 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmi_management_device_type(sect_n, data[0x05]);
dmixml_AddTextChild(sect_n, "Address", "0x%08x", DWORD(data + 0x06));
dmi_management_device_address_type(sect_n, data[0x0A]);
-
- sect_n = NULL;
break;
case 35: /* 3.3.36 Management Device Component */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "ManagementDeviceComponent", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.36");
+ dmixml_AddAttribute(sect_n, "mgmtype", "Component");
if(h->length < 0x0B) {
- sect_n = NULL;
break;
}
@@ -4806,17 +4560,12 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
if(WORD(data + 0x09) != 0xFFFF) {
dmixml_AddTextChild(sect_n, "ThresholdHandle", "0x%04x", WORD(data + 0x09));
}
-
- sect_n = NULL;
break;
case 36: /* 3.3.37 Management Device Threshold Data */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "ManagementDeviceThresholdData", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.37");
+ dmixml_AddAttribute(sect_n, "mgmtype", "Threshold Data");
if(h->length < 0x10) {
- sect_n = NULL;
break;
}
@@ -4856,17 +4605,10 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmixml_AddAttribute(sub_n, "Upper", "%d", (i16) WORD(data + 0x0E));
}
sub_n = NULL;
-
- sect_n = NULL;
break;
case 37: /* 3.3.38 Memory Channel */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "MemoryChannel", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.38");
-
if(h->length < 0x07) {
- sect_n = NULL;
break;
}
@@ -4879,14 +4621,11 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
if(h->length < 0x07 + 3 * data[0x06]) {
sub_n = NULL;
- sect_n = NULL;
break;
}
dmi_memory_channel_devices(sub_n, data[0x06], data + 0x07);
sub_n = NULL;
-
- sect_n = NULL;
break;
case 38: /* 3.3.39 IPMI Device Information */
@@ -4894,12 +4633,7 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
* We use the word "Version" instead of "Revision", conforming to
* the IPMI specification.
*/
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "IPMIdeviceInformation", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.39");
-
if(h->length < 0x10) {
- sect_n = NULL;
break;
}
@@ -4923,7 +4657,6 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
h->length < 0x12 ? 0 : (data[0x10] >> 5) & 1);
if(h->length < 0x12) {
- sect_n = NULL;
break;
}
@@ -4948,17 +4681,10 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmixml_AddTextChild(sub_n, "InterruptNumber", "%x", data[0x11]);
}
sub_n = NULL;
-
- sect_n = NULL;
break;
case 39: /* 3.3.40 System Power Supply */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "SystemPowerSupply", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.40");
-
if(h->length < 0x10) {
- sect_n = NULL;
break;
}
@@ -4997,7 +4723,6 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
if(h->length < 0x16) {
sub_n = NULL;
- sect_n = NULL;
break;
}
@@ -5014,31 +4739,24 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
}
sub_n = NULL;
- sect_n = NULL;
break;
case 40: /* 3.3.41 Additional Information */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "AdditionalInformation", NULL);
- assert( sect_n != NULL );
+ dmixml_AddAttribute(sect_n, "subtype", "AdditionalInformation");
dmixml_AddAttribute(sect_n, "dmispec", "3.3.41");
if(h->length < 0x0B) {
- sect_n = NULL;
break;
}
dmi_additional_info(sect_n, h);
-
- sect_n = NULL;
break;
case 41: /* 3.3.42 Onboard Device Extended Information */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "OnboardDeviceExtendedInformation", NULL);
- assert( sect_n != NULL );
+ dmixml_AddAttribute(sect_n, "subtype", "OnboardDeviceExtendedInformation");
dmixml_AddAttribute(sect_n, "dmispec", "3.3.42");
if(h->length < 0x0B) {
- sect_n = NULL;
break;
}
@@ -5051,41 +4769,26 @@ void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver)
dmixml_AddAttribute(sub_n, "TypeInstance", "%ld", data[0x06]);
dmi_slot_segment_bus_func(sub_n, WORD(data + 0x07), data[0x09], data[0x0A]);
sub_n = NULL;
-
- sect_n = NULL;
break;
case 126: /* 3.3.43 Inactive */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "Inactive", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.43");
-
- sect_n = NULL;
- break;
-
case 127: /* 3.3.44 End Of Table */
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "EndOfTable", NULL);
- assert( sect_n != NULL );
- dmixml_AddAttribute(sect_n, "dmispec", "3.3.44");
- sect_n = NULL;
-
break;
default:
if(dmi_decode_oem(h))
break;
- sect_n = xmlNewChild(handle_n, NULL, (xmlChar *) "DMIdump", NULL);
+ sect_n = xmlNewChild(sect_n, NULL, (xmlChar *) "DMIdump", NULL);
assert( sect_n != NULL );
dmixml_AddAttribute(sect_n, "Type", "%i", h->type);
dmixml_AddAttribute(sect_n, "InfoType", "%s", h->type >= 128 ? "OEM-specific" : "Unknown");
dmi_dump(sect_n, h);
-
- sect_n = NULL;
break;
}
+ return sect_n;
}
void to_dmi_header(struct dmi_header *h, u8 * data)
@@ -5326,13 +5029,6 @@ static void dmi_table(u32 base, u16 len, u16 num, u16 ver, const char *devmem, x
* stop decoding at end of table marker
*/
- xmlNode *handle_n = xmlNewChild(xmlnode, NULL, (xmlChar *) "DMIentry", NULL);
- assert( handle_n != NULL );
-
- dmixml_AddAttribute(handle_n, "handle", "0x%04x%c", h.handle);
- dmixml_AddAttribute(handle_n, "type", "%d", h.type);
- dmixml_AddAttribute(handle_n, "size", "%d", h.length);
-
/* assign vendor for vendor-specific decodes later */
if(h.type == 0 && h.length >= 5) {
dmi_set_vendor(dmi_string(&h, data[0x04]));
@@ -5345,6 +5041,7 @@ static void dmi_table(u32 base, u16 len, u16 num, u16 ver, const char *devmem, x
}
next += 2;
+ xmlNode *handle_n = NULL;
if(display) {
if(next - buf <= len) {
/* TODO: ...
@@ -5357,13 +5054,19 @@ static void dmi_table(u32 base, u16 len, u16 num, u16 ver, const char *devmem, x
* PyDict_SetItem(hDict, PyString_FromString("data"), dmi_decode(&h, ver));
* PyDict_SetItem(pydata, PyString_FromString(hid), hDict);
* } */
- dmi_decode(handle_n, &h, ver);
+ handle_n = dmi_decode(&h, ver);
} else
fprintf(stderr, "<TRUNCATED>");
} else if(opt.string != NULL && opt.string->type == h.type) {
- // <<<---- ** Need to handle this as well **
+ handle_n = xmlNewNode(NULL, (xmlChar *) "DMItable");
+ assert( handle_n != NULL );
dmi_table_string(&h, data, handle_n, ver);
}
+ if( handle_n != NULL ) {
+ dmixml_AddAttribute(handle_n, "handle", "0x%04x", h.handle);
+ dmixml_AddAttribute(handle_n, "size", "%d", h.length);
+ xmlAddChild(xmlnode, handle_n);
+ }
data = next;
i++;
diff --git a/src/dmidecode.h b/src/dmidecode.h
index bbc8eca..ef13ce3 100644
--- a/src/dmidecode.h
+++ b/src/dmidecode.h
@@ -29,7 +29,7 @@ struct dmi_header {
};
void dmi_dump(xmlNode *node, struct dmi_header * h);
-void dmi_decode(xmlNode *handle_n, struct dmi_header * h, u16 ver);
+xmlNode *dmi_decode(struct dmi_header * h, u16 ver);
int address_from_efi(size_t * address);
void to_dmi_header(struct dmi_header *h, u8 * data);
int smbios_decode_set_version(u8 * buf, const char *devmem, xmlNode *node);
diff --git a/src/dmihelper.h b/src/dmihelper.h
index ac82916..6c0b854 100644
--- a/src/dmihelper.h
+++ b/src/dmihelper.h
@@ -33,53 +33,55 @@ typedef struct _dmi_codes_major {
const unsigned short code;
const char *id;
const char *desc;
+ const char *tagname;
} dmi_codes_major;
static const dmi_codes_major dmiCodesMajor[] = {
- {0, "3.3.1", "BIOS Information"},
- {1, "3.3.2", "System Information"},
- {2, "3.3.3", "Base Board Information"},
- {3, "3.3.4", "Chassis Information"},
- {4, "3.3.5", "Processor Information"},
- {5, "3.3.6", "Memory Controller Information"},
- {6, "3.3.7", "Memory Module Information"},
- {7, "3.3.8", "Cache Information"},
- {8, "3.3.9", "Port Connector Information"},
- {9, "3.3.10", "System Slots"},
- {10, "3.3.11", "On Board Devices Information"},
- {11, "3.3.12", "OEM Strings"},
- {12, "3.3.13", "System Configuration Options"},
- {13, "3.3.14", "BIOS Language Information"},
- {14, "3.3.15", "Group Associations"},
- {15, "3.3.16", "System Event Log"},
- {16, "3.3.17", "Physical Memory Array"},
- {17, "3.3.18", "Memory Device"},
- {18, "3.3.19", "32-bit Memory Error Information"},
- {19, "3.3.20", "Memory Array Mapped Address"},
- {20, "3.3.21", "Memory Device Mapped Address"},
- {21, "3.3.22", "Built-in Pointing Device"},
- {22, "3.3.23", "Portable Battery"},
- {23, "3.3.24", "System Reset"},
- {24, "3.3.25", "Hardware Security"},
- {25, "3.3.26", "System Power Controls"},
- {26, "3.3.27", "Voltage Probe"},
- {27, "3.3.28", "Cooling Device"},
- {28, "3.3.29", "Temperature Probe"},
- {29, "3.3.30", "Electrical Current Probe"},
- {30, "3.3.31", "Out-of-band Remote Access"},
- {31, "3.3.32", "Boot Integrity Services Entry Point"},
- {32, "3.3.33", "System Boot Information"},
- {33, "3.3.34", "64-bit Memory Error Information"},
- {34, "3.3.35", "Management Device"},
- {35, "3.3.36", "Management Device Component"},
- {36, "3.3.37", "Management Device Threshold Data"},
- {37, "3.3.38", "Memory Channel"},
- {38, "3.3.39", "IPMI Device Information"},
- {39, "3.3.40", "System Power Supply"},
- {40, "3.3.41", "-------------------"},
- {41, "3.3.42", "-------------------"},
- {126, "3.3.41", "Inactive"},
- {127, "3.3.42", "End Of Table"},
+ {0, "3.3.1", "BIOS Information", "BIOSinfo"},
+ {1, "3.3.2", "System Information", "SystemInfo"},
+ {2, "3.3.3", "Base Board Information", "BaseBoardInfo"},
+ {3, "3.3.4", "Chassis Information", "ChassisInfo"},
+ {4, "3.3.5", "Processor Information", "ProcessorInfo"},
+ {5, "3.3.6", "Memory Controller Information", "MemoryCtrlInfo"},
+ {6, "3.3.7", "Memory Module Information", "MemoryModuleInfo"},
+ {7, "3.3.8", "Cache Information", "CacheInfo"},
+ {8, "3.3.9", "Port Connector Information", "PortConnectorInfo"},
+ {9, "3.3.10", "System Slots", "SystemSlots"},
+ {10, "3.3.11", "On Board Devices Information", "OnBoardDevicesInfo"},
+ {11, "3.3.12", "OEM Strings", "OEMstrings"},
+ {12, "3.3.13", "System Configuration Options", "SysConfigOptions"},
+ {13, "3.3.14", "BIOS Language Information", "BIOSlanguage"},
+ {14, "3.3.15", "Group Associations", "GroupAssoc"},
+ {15, "3.3.16", "System Event Log", "SysEventLog"},
+ {16, "3.3.17", "Physical Memory Array", "PhysicalMemoryArray"},
+ {17, "3.3.18", "Memory Device", "MemoryDevice"},
+ {18, "3.3.19", "32-bit Memory Error Information", "MemoryErrorInfo"},
+ {19, "3.3.20", "Memory Array Mapped Address", "MemoryArrayMappedAddress"},
+ {20, "3.3.21", "Memory Device Mapped Address", "MemoryDeviceMappedAddress"},
+ {21, "3.3.22", "Built-in Pointing Device", "BuiltIntPointingDevice"},
+ {22, "3.3.23", "Portable Battery", "PortableBattery"},
+ {23, "3.3.24", "System Reset", "SystemReset"},
+ {24, "3.3.25", "Hardware Security", "HardwareSecurity"},
+ {25, "3.3.26", "System Power Controls", "SystemPowerCtrls"},
+ {26, "3.3.27", "Voltage Probe", "Probe"},
+ {27, "3.3.28", "Cooling Device", "CoolingDevice"},
+ {28, "3.3.29", "Temperature Probe", "Probe"},
+ {29, "3.3.30", "Electrical Current Probe", "Probe"},
+ {30, "3.3.31", "Out-of-band Remote Access", "RemoteAccess"},
+ {31, "3.3.32", "Boot Integrity Services Entry Point", "BootIntegrity"},
+ {32, "3.3.33", "System Boot Information", "SystemBootInfo"},
+ {33, "3.3.34", "64-bit Memory Error Information", "MemoryErrorInfo"},
+ {34, "3.3.35", "Management Device", "ManagementDevice"},
+ {35, "3.3.36", "Management Device Component", "ManagementDevice"},
+ {36, "3.3.37", "Management Device Threshold Data", "ManagementDevice"},
+ {37, "3.3.38", "Memory Channel", "MemoryChannel"},
+ {38, "3.3.39", "IPMI Device Information", "IPMIdeviceInfo"},
+ {39, "3.3.40", "System Power Supply", "SystemPowerSupply"},
+ {40, "3.3.41", "-------------------", "Unknown"},
+ {41, "3.3.42", "-------------------", "Unknown"},
+ {126, "3.3.41", "Inactive", "Inactive"},
+ {127, "3.3.42", "End Of Table", "EndOfTable"},
+ {-1, NULL, NULL, NULL}
};
typedef struct _dmi_minor {