diff options
author | Ondrej Čerman <ondrej.cerman@gmail.com> | 2021-10-16 23:37:45 +0200 |
---|---|---|
committer | Ondrej Čerman <ondrej.cerman@gmail.com> | 2021-10-19 19:31:50 +0200 |
commit | 0444fa61fa43112c8a3d1025223ea1821ed21d97 (patch) | |
tree | 185f69f3b570ffc87695a1b1dcefc3225c6f1569 | |
parent | e941b2ada4ef3cad921d0fe87dcc75baf2cdcb73 (diff) |
devices/storage - added WWN/EUI Identifier and IEEE OUI
-rw-r--r-- | hardinfo/storage_util.c | 71 | ||||
-rw-r--r-- | hardinfo/udisks2_util.c | 12 | ||||
-rw-r--r-- | includes/storage_util.h | 4 | ||||
-rw-r--r-- | includes/udisks2_util.h | 1 | ||||
-rw-r--r-- | modules/devices/storage.c | 29 |
5 files changed, 116 insertions, 1 deletions
diff --git a/hardinfo/storage_util.c b/hardinfo/storage_util.c index 78802e4b..ce824071 100644 --- a/hardinfo/storage_util.c +++ b/hardinfo/storage_util.c @@ -4,6 +4,7 @@ #include "hardinfo.h" gchar *sdcard_ids_file = NULL; +gchar *oui_ids_file = NULL; // moved from udisks2_util.h void find_sdcard_ids_file() { @@ -22,6 +23,62 @@ void find_sdcard_ids_file() { } } +void find_oui_ids_file() { + if (oui_ids_file) return; + char *file_search_order[] = { + g_build_filename(g_get_user_config_dir(), "hardinfo", "ieee_oui.ids", NULL), + g_build_filename(params.path_data, "ieee_oui.ids", NULL), + NULL + }; + int n; + for(n = 0; file_search_order[n]; n++) { + if (!oui_ids_file && !access(file_search_order[n], R_OK)) + oui_ids_file = file_search_order[n]; + else + g_free(file_search_order[n]); + } +} + +gchar* get_oui_from_wwid(gchar* wwid){ + gchar* ret = NULL; + + if (g_str_has_prefix(wwid, "nna.")) { + if (strlen(wwid)*4 < 48) + return NULL; + + switch (wwid[4]){ + case '1': + case '2': + ret = g_strndup(wwid + 8, 6); + break; + case '5': + case '6': + ret = g_strndup(wwid + 5, 6); + break; + } + } + else if(g_str_has_prefix(wwid, "eui.")) { + if (strlen(wwid)*4 < 48) + return NULL; + ret = g_strndup(wwid+4, 6); + } + + return ret; +} + +gchar* get_oui_company(gchar* oui){ + ids_query_result result = {}; + + if (!oui_ids_file) + find_oui_ids_file(); + + scan_ids_file(oui_ids_file, oui, &result, -1); + if (result.results[0]) + return g_strdup(result.results[0]); + + return NULL; +} + // moved from udisks2_util.h void check_sdcard_vendor(u2driveext *e) { if (!e || !e->d) return; @@ -147,6 +204,17 @@ GSList* get_udisks2_drives_ext(void){ extdrive->vendors = vendor_list_append(extdrive->vendors, vendor_match(extdrive->d->vendor, NULL)); + // get OUI from WWID + if (extdrive->d->wwid) { + extdrive->wwid_oui.oui = get_oui_from_wwid(extdrive->d->wwid); + if (extdrive->wwid_oui.oui) { + extdrive->wwid_oui.vendor = get_oui_company(extdrive->wwid_oui.oui); + } + if (extdrive->wwid_oui.vendor){ + extdrive->vendors = vendor_list_append(extdrive->vendors, vendor_match(extdrive->wwid_oui.vendor, NULL)); + } + } + // NVMe PCI device if (strstr(extdrive->d->block_dev, "nvme")) { set_nvme_controller_info(extdrive); @@ -169,6 +237,8 @@ u2driveext* u2drive_ext(udiskd * udisks_drive_data) { void u2driveext_free(u2driveext *u) { if (u) { udiskd_free(u->d); + g_free(u->wwid_oui.oui); + g_free(u->wwid_oui.vendor); pcid_free(u->nvme_controller); g_free(u); } @@ -176,4 +246,5 @@ void u2driveext_free(u2driveext *u) { void storage_shutdown(){ g_free(sdcard_ids_file); + g_free(oui_ids_file); } diff --git a/hardinfo/udisks2_util.c b/hardinfo/udisks2_util.c index e86e59d3..e764de2a 100644 --- a/hardinfo/udisks2_util.c +++ b/hardinfo/udisks2_util.c @@ -264,6 +264,7 @@ void udiskd_free(udiskd *u) { g_free(u->revision); g_free(u->block_dev); g_free(u->serial); + g_free(u->wwid); g_free(u->connection_bus); g_free(u->partition_table); udiskp_free(u->partitions); @@ -483,6 +484,17 @@ gpointer get_udisks2_drive_info(const char *blockdev, GDBusProxy *block, u->serial = g_variant_dup_string(v, NULL); g_variant_unref(v); } + v = get_dbus_property(drive, UDISKS2_DRIVE_INTERFACE, "WWN"); + if (v){ + str = g_variant_get_string(v, NULL); + if (g_str_has_prefix(str, "0x")) { + u->wwid = g_strdup_printf("nna.%s", str+2); + } + else if (g_str_has_prefix(str, "nna.") || g_str_has_prefix(str, "eui.")) { + u->wwid = g_strdup(str); + } + g_variant_unref(v); + } v = get_dbus_property(drive, UDISKS2_DRIVE_INTERFACE, "ConnectionBus"); if (v){ u->connection_bus = g_variant_dup_string(v, NULL); diff --git a/includes/storage_util.h b/includes/storage_util.h index 8dfed42f..4866d88c 100644 --- a/includes/storage_util.h +++ b/includes/storage_util.h @@ -5,6 +5,10 @@ typedef struct u2driveext { udiskd *d; pcid *nvme_controller; + struct{ + gchar *oui; + gchar *vendor; + } wwid_oui; vendor_list vendors; } u2driveext; diff --git a/includes/udisks2_util.h b/includes/udisks2_util.h index 0af221b9..2f65c376 100644 --- a/includes/udisks2_util.h +++ b/includes/udisks2_util.h @@ -35,6 +35,7 @@ typedef struct udiskd { gchar *revision; gchar *block_dev; gchar *serial; + gchar *wwid; gchar *connection_bus; gchar *partition_table; udiskp *partitions; diff --git a/modules/devices/storage.c b/modules/devices/storage.c index 8bbb524d..fd5132da 100644 --- a/modules/devices/storage.c +++ b/modules/devices/storage.c @@ -87,7 +87,7 @@ gboolean __scan_udisks2_devices(void) { gchar *udisks2_storage_list = NULL, *features = NULL, *moreinfo = NULL; gchar *devid, *size, *tmp = NULL, *media_comp = NULL, *ven_tag = NULL; const gchar *url, *media_label, *alabel, *icon, *media_curr = NULL; - int n = 0, i, j; + int n = 0, i, j, m; // http://storaged.org/doc/udisks2-api/latest/gdbus-org.freedesktop.UDisks2.Drive.html#gdbus-property-org-freedesktop-UDisks2-Drive.MediaCompatibility static struct { @@ -304,6 +304,33 @@ gboolean __scan_udisks2_devices(void) { if (disk->connection_bus && strlen(disk->connection_bus) > 0) { moreinfo = h_strdup_cprintf(_("Connection bus=%s\n"), moreinfo, disk->connection_bus); } + + tmp = NULL; + if (disk->wwid) { + m = strlen(disk->wwid); + if (m > 2 && m % 2 == 0){ + for (j = 4; j < m; j = j + 2) { + tmp = h_strdup_cprintf("%s%c%c", tmp, j > 4 ? "-": "", disk->wwid[j], disk->wwid[j+1]); + } + } + moreinfo = h_strdup_cprintf("%s=%s\n", moreinfo, + g_str_has_prefix(disk->wwid, "nna.") ? _("WWN"): + (g_str_has_prefix(disk->wwid, "eui.") ? _("EUI "): "Unknown ID"), + tmp); + g_free(tmp); + } + else{ + moreinfo = h_strdup_cprintf("%s=%s\n", moreinfo, _("WWN / EUI"), _("(None)")); + } + + if (ext->wwid_oui.oui) { + moreinfo = h_strdup_cprintf(_("$^$%s=[%s] %s\n"), + moreinfo, + _("IEEE OUI"), ext->wwid_oui.oui, + ext->wwid_oui.vendor ? + ext->wwid_oui.vendor : _("(Unknown)")); + } + if (ext->nvme_controller) { gchar *nvme = nvme_pci_sections(ext->nvme_controller); if (nvme) |