diff options
author | Burt P <pburt0@gmail.com> | 2018-10-04 17:24:54 -0500 |
---|---|---|
committer | Leandro A. F. Pereira <leandro@hardinfo.org> | 2018-11-04 15:02:12 -0800 |
commit | 11936f0c93bd0416f5cba22de18228c46864a927 (patch) | |
tree | 8cc1e1714c77f1df81bdfc1d1e72ec5a7b4098b7 /modules/devices.c | |
parent | 3d61921be280fab9b4a5740a8f20a65d4bd2a4cf (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.c | 91 |
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 |