aboutsummaryrefslogtreecommitdiff
path: root/modules/devices.c
diff options
context:
space:
mode:
authorBurt P <pburt0@gmail.com>2018-10-04 17:24:54 -0500
committerLeandro A. F. Pereira <leandro@hardinfo.org>2018-11-04 15:02:12 -0800
commit11936f0c93bd0416f5cba22de18228c46864a927 (patch)
tree8cc1e1714c77f1df81bdfc1d1e72ec5a7b4098b7 /modules/devices.c
parent3d61921be280fab9b4a5740a8f20a65d4bd2a4cf (diff)
devices: get_motherboard() refinements
As discussed in #289: "Maybe instead of falling back separately it could try for the best from the board group and the best from the product/system group and always give <board> (<system>), perhaps with any duplicates removed." Signed-off-by: Burt P <pburt0@gmail.com>
Diffstat (limited to 'modules/devices.c')
-rw-r--r--modules/devices.c91
1 files changed, 75 insertions, 16 deletions
diff --git a/modules/devices.c b/modules/devices.c
index ad5c641d..92215df7 100644
--- a/modules/devices.c
+++ b/modules/devices.c
@@ -355,31 +355,90 @@ gchar *get_memory_total(void)
gchar *get_motherboard(void)
{
- char *board_name, *board_vendor;
- char *ret;
+ gchar *board_name, *board_vendor, *board_version;
+ gchar *product_name, *product_vendor, *product_version;
+ gchar *board_part = NULL, *product_part = NULL;
+ int b = 0, p = 0, iv = 0;
+
+ gchar *ret;
#if defined(ARCH_x86) || defined(ARCH_x86_64)
scan_dmi(FALSE);
board_name = dmi_get_str("baseboard-product-name");
- if (board_name == NULL)
- board_name = dmi_get_str("system-product-name");
-
board_vendor = dmi_get_str("baseboard-manufacturer");
- if (board_vendor == NULL)
- board_vendor = dmi_get_str("system-manufacturer");
-
- if (board_name && board_vendor)
- ret = g_strconcat(board_vendor, " ", board_name, NULL);
- else if (board_name)
- ret = g_strdup(board_name);
- else if (board_vendor)
- ret = g_strdup(board_vendor);
+ board_version = dmi_get_str("baseboard-version");
+
+ product_name = dmi_get_str("system-product-name");
+ product_vendor = dmi_get_str("system-manufacturer");
+ product_version = dmi_get_str("system-version");
+
+ if (board_vendor && product_vendor &&
+ strcmp(board_vendor, product_vendor) == 0)
+ iv = 1;
+
+ if (board_name) b += 1;
+ if (board_vendor) b += 2;
+ if (board_version) b += 4;
+
+ switch(b) {
+ case 1: /* only name */
+ board_part = g_strdup(board_name);
+ break;
+ case 2: /* only vendor */
+ board_part = g_strdup(board_vendor);
+ break;
+ case 3: /* only name and vendor */
+ board_part = g_strdup_printf("%s %s", board_vendor, board_name);
+ break;
+ case 6: /* only vendor and version (like lpereira's Thinkpad) */
+ board_part = g_strdup_printf("%s %s", board_vendor, board_version);
+ break;
+ case 7: /* all */
+ board_part = g_strdup_printf("%s %s %s", board_vendor, board_name, board_version);
+ break;
+ }
+
+ if (product_name) p += 1;
+ if (product_vendor) p += 2;
+ if (product_version) p += 4;
+
+ switch(p) {
+ case 1: /* only name */
+ product_part = g_strdup(product_name);
+ break;
+ case 3: /* only name and vendor */
+ if (board_part && iv)
+ product_part = g_strdup(product_name);
+ else
+ product_part = g_strdup_printf("%s %s", product_vendor, product_name);
+ break;
+ case 7: /* all */
+ if (board_part && iv)
+ product_part = g_strdup_printf("%s %s", product_name, product_version);
+ else
+ product_part = g_strdup_printf("%s %s %s", product_vendor, product_name, product_version);
+ break;
+ }
+
+ if (board_part && product_part) {
+ ret = g_strdup_printf("%s (%s)", board_part, product_part);
+ g_free(board_part);
+ g_free(product_part);
+ } else if (board_part)
+ ret = board_part;
+ else if (product_part)
+ ret = product_part;
else
ret = g_strdup(_("(Unknown)"));
- free(board_name);
- free(board_vendor);
+ g_free(board_name);
+ g_free(board_vendor);
+ g_free(board_version);
+ g_free(product_name);
+ g_free(product_vendor);
+ g_free(product_version);
+
return ret;
#endif