diff options
author | Peter Schiffer <pschiffe@redhat.com> | 2013-05-14 19:02:01 +0200 |
---|---|---|
committer | Peter Schiffer <pschiffe@redhat.com> | 2013-05-14 19:02:01 +0200 |
commit | fcc1acdd4302e4c9e31d102ae8b7e25fc2d67a96 (patch) | |
tree | 0e09949cd4ccd21e12f7a767790f2d2b94255c4d /src/hardware/dmidecode.c | |
parent | f3265d37cea12a5126f9e7ac8266142cd7a05f23 (diff) | |
download | openlmi-providers-fcc1acdd4302e4c9e31d102ae8b7e25fc2d67a96.tar.gz openlmi-providers-fcc1acdd4302e4c9e31d102ae8b7e25fc2d67a96.tar.xz openlmi-providers-fcc1acdd4302e4c9e31d102ae8b7e25fc2d67a96.zip |
Hardware: Added Chassis provider
New Provider:
* LMI_ChassisProvider
Diffstat (limited to 'src/hardware/dmidecode.c')
-rw-r--r-- | src/hardware/dmidecode.c | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/src/hardware/dmidecode.c b/src/hardware/dmidecode.c index b3d00ef..d27c9dc 100644 --- a/src/hardware/dmidecode.c +++ b/src/hardware/dmidecode.c @@ -1101,3 +1101,180 @@ void dmi_free_memory(DmiMemory *memory) memory->modules_nb = 0; memory->modules = NULL; } + + +/****************************************************************************** + * DmiChassis + */ + + +/* + * Initialize DmiChassis attributes. + * @param chassis + */ +void init_dmi_chassis_struct(DmiChassis *chassis) +{ + chassis->serial_number = NULL; + chassis->type = NULL; + chassis->manufacturer = NULL; + chassis->sku_number = NULL; + chassis->version = NULL; + chassis->has_lock = 0; + chassis->power_cords = 0; +} + +/* + * Check attributes of chassis structure and fill in defaults if needed. + * @param chassis + * @return 0 if success, negative value otherwise + */ +short check_dmi_chassis_attributes(DmiChassis *chassis) +{ + short ret = -1; + + if (!chassis->serial_number) { + if (!(chassis->serial_number = strdup("Not Specified"))) { + ret = -2; + goto done; + } + } + if (!chassis->type) { + if (!(chassis->type = strdup("Unknown"))) { + ret = -3; + goto done; + } + } + if (!chassis->manufacturer) { + if (!(chassis->manufacturer = strdup(""))) { + ret = -4; + goto done; + } + } + if (!chassis->sku_number) { + if (!(chassis->sku_number = strdup(""))) { + ret = -5; + goto done; + } + } + if (!chassis->version) { + if (!(chassis->version = strdup(""))) { + ret = -6; + goto done; + } + } + + ret = 0; + +done: + if (ret != 0) { + warn("Failed to allocate memory."); + } + + return ret; +} + +short dmi_get_chassis(DmiChassis *chassis) +{ + short ret = -1; + unsigned i, buffer_size = 0; + char **buffer = NULL, *buf; + + init_dmi_chassis_struct(chassis); + + /* get dmidecode output for chassis */ + if (run_command("dmidecode -t 3", &buffer, &buffer_size) != 0) { + ret = -2; + goto done; + } + + /* parse information about chassis */ + for (i = 0; i < buffer_size; i++) { + /* Serial Number */ + buf = copy_string_part_after_delim(buffer[i], "Serial Number: "); + if (buf) { + chassis->serial_number = buf; + buf = NULL; + continue; + } + /* Type */ + buf = copy_string_part_after_delim(buffer[i], "Type: "); + if (buf) { + chassis->type = buf; + buf = NULL; + continue; + } + /* Manufacturer */ + buf = copy_string_part_after_delim(buffer[i], "Manufacturer: "); + if (buf) { + chassis->manufacturer = buf; + buf = NULL; + continue; + } + /* SKU Number */ + buf = copy_string_part_after_delim(buffer[i], "SKU Number: "); + if (buf) { + chassis->sku_number = buf; + buf = NULL; + continue; + } + /* SKU Number */ + buf = copy_string_part_after_delim(buffer[i], "Version: "); + if (buf) { + chassis->version = buf; + buf = NULL; + continue; + } + /* Has Lock */ + buf = copy_string_part_after_delim(buffer[i], "Lock: "); + if (buf) { + if (strcmp(buf, "Present") == 0) { + chassis->has_lock = 1; + } + free(buf); + buf = NULL; + continue; + } + /* Number of power cords */ + buf = copy_string_part_after_delim(buffer[i], "Number Of Power Cords: "); + if (buf) { + if (strcmp(buf, "Unspecified") != 0) { + sscanf(buf, "%u", &chassis->power_cords); + } + free(buf); + buf = NULL; + continue; + } + } + + /* fill in default attributes if needed */ + if (check_dmi_chassis_attributes(chassis) != 0) { + ret = -3; + goto done; + } + + ret = 0; + +done: + free_2d_buffer(&buffer, &buffer_size); + + if (ret != 0) { + dmi_free_chassis(chassis); + } + + return ret; +} + +void dmi_free_chassis(DmiChassis *chassis) +{ + free(chassis->serial_number); + chassis->serial_number = NULL; + free(chassis->type); + chassis->type = NULL; + free(chassis->manufacturer); + chassis->manufacturer = NULL; + free(chassis->sku_number); + chassis->sku_number = NULL; + free(chassis->version); + chassis->version = NULL; +} + |