summaryrefslogtreecommitdiffstats
path: root/src/hardware/dmidecode.c
diff options
context:
space:
mode:
authorPeter Schiffer <pschiffe@redhat.com>2013-05-14 19:02:01 +0200
committerPeter Schiffer <pschiffe@redhat.com>2013-05-14 19:02:01 +0200
commitfcc1acdd4302e4c9e31d102ae8b7e25fc2d67a96 (patch)
tree0e09949cd4ccd21e12f7a767790f2d2b94255c4d /src/hardware/dmidecode.c
parentf3265d37cea12a5126f9e7ac8266142cd7a05f23 (diff)
downloadopenlmi-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.c177
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;
+}
+