aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOndrej Čerman <ondrej.cerman@gmail.com>2021-10-16 23:37:45 +0200
committerOndrej Čerman <ondrej.cerman@gmail.com>2021-10-19 19:31:50 +0200
commit0444fa61fa43112c8a3d1025223ea1821ed21d97 (patch)
tree185f69f3b570ffc87695a1b1dcefc3225c6f1569
parente941b2ada4ef3cad921d0fe87dcc75baf2cdcb73 (diff)
devices/storage - added WWN/EUI Identifier and IEEE OUI
-rw-r--r--hardinfo/storage_util.c71
-rw-r--r--hardinfo/udisks2_util.c12
-rw-r--r--includes/storage_util.h4
-rw-r--r--includes/udisks2_util.h1
-rw-r--r--modules/devices/storage.c29
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)