diff options
author | Burt P <pburt0@gmail.com> | 2020-01-01 11:15:21 -0600 |
---|---|---|
committer | Leandro A. F. Pereira <leandro@hardinfo.org> | 2020-01-03 09:31:10 -0800 |
commit | 112e399c0810f04248ca2a23886afd2bc3b25f83 (patch) | |
tree | ec65942595dca1f2d2d9b86b4770dc7ea1916ad4 /hardinfo | |
parent | 6a2a9112f97433707605cca1f6a25a43a6c369a4 (diff) |
storage: nvme pci info + udisks2_util vendor fixes
Signed-off-by: Burt P <pburt0@gmail.com>
Diffstat (limited to 'hardinfo')
-rw-r--r-- | hardinfo/pci_util.c | 2 | ||||
-rw-r--r-- | hardinfo/udisks2_util.c | 45 |
2 files changed, 27 insertions, 20 deletions
diff --git a/hardinfo/pci_util.c b/hardinfo/pci_util.c index 728e6356..6db14136 100644 --- a/hardinfo/pci_util.c +++ b/hardinfo/pci_util.c @@ -323,7 +323,7 @@ static gboolean pci_get_device_lspci(uint32_t dom, uint32_t bus, uint32_t dev, u } pcid *pci_get_device_str(const char *addy) { - uint32_t dom, bus, dev, func, cls; + uint32_t dom, bus, dev, func; int ec; if (addy) { ec = sscanf(addy, "%x:%x:%x.%x", &dom, &bus, &dev, &func); diff --git a/hardinfo/udisks2_util.c b/hardinfo/udisks2_util.c index dfb0b20f..e3cf255a 100644 --- a/hardinfo/udisks2_util.c +++ b/hardinfo/udisks2_util.c @@ -2,7 +2,6 @@ #include "udisks2_util.h" #include "hardinfo.h" #include "util_ids.h" -#include "pci_util.h" #define UDISKS2_INTERFACE "org.freedesktop.UDisks2" #define UDISKS2_MANAGER_INTERFACE "org.freedesktop.UDisks2.Manager" @@ -376,6 +375,7 @@ void udiskd_free(udiskd *u) { udisksa_free(u->smart_attributes); g_free(u->media); g_strfreev(u->media_compatibility); + pcid_free(u->nvme_controller); g_free(u); } } @@ -678,29 +678,36 @@ gpointer get_udisks2_drive_info(const char *blockdev, GDBusProxy *block, g_variant_unref(v); } - /* NVMe vendor from PCI device */ - if (strstr(u->block_dev, "nvme") - && (!u->vendor || !*u->vendor) - ) { - gchar *file = g_strdup_printf("/sys/block/%s/device/device/vendor", u->block_dev); - gchar *val = NULL; - if (g_file_get_contents(file, &val, NULL, NULL) ) { - unsigned long int id = strtoul(val, NULL, 16); - if (id) - u->vendor = pci_lookup_ids_vendor_str(id); - } - g_free(file); - g_free(val); + if (!u->vendor || !*u->vendor) { + const Vendor *v = vendor_match(u->model, NULL); + if (v) + u->vendor = g_strdup(v->name); } check_sdcard_vendor(u); - if (!u->vendors) { - const Vendor *v = NULL; - v = vendor_match(u->vendor, NULL); - if (v) - u->vendors = vendor_list_append(u->vendors, v); + u->vendors = vendor_list_append(u->vendors, vendor_match(u->vendor, NULL)); + + /* NVMe PCI device */ + if (strstr(u->block_dev, "nvme")) { + gchar *path = g_strdup_printf("/sys/block/%s/device/device", u->block_dev); + gchar *systarget = g_file_read_link(path, NULL); + gchar *target = systarget ? g_filename_to_utf8(systarget, -1, NULL, NULL, NULL) : NULL; + gchar *pci_addy = target ? g_path_get_basename(target) : NULL; + u->nvme_controller = pci_addy ? pci_get_device_str(pci_addy) : NULL; + g_free(path); + g_free(systarget); + g_free(target); + g_free(pci_addy); + if (u->nvme_controller) { + u->vendors = vendor_list_append(u->vendors, + vendor_match(u->nvme_controller->vendor_id_str, NULL)); + u->vendors = vendor_list_append(u->vendors, + vendor_match(u->nvme_controller->sub_vendor_id_str, NULL)); + } } + u->vendors = gg_slist_remove_null(u->vendors); + u->vendors = vendor_list_remove_duplicates_deep(u->vendors); return u; } |