aboutsummaryrefslogtreecommitdiff
path: root/hardinfo
diff options
context:
space:
mode:
authorBurt P <pburt0@gmail.com>2019-12-28 00:25:26 -0600
committerLeandro A. F. Pereira <leandro@hardinfo.org>2019-12-28 08:32:12 -0800
commitb45f68508254c3ddbcabfc536ed5f2b5a7a9528c (patch)
treec1799045b5741ada049a922845f1e8ea361b1d4a /hardinfo
parent78f5404cba4760f08f94a5d8e133081521df1dc9 (diff)
pci_util: add some id lookup functions
So we can do pci.ids lookups ourselves. Signed-off-by: Burt P <pburt0@gmail.com>
Diffstat (limited to 'hardinfo')
-rw-r--r--hardinfo/pci_util.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/hardinfo/pci_util.c b/hardinfo/pci_util.c
index 2aa2ece3..e7ae81ac 100644
--- a/hardinfo/pci_util.c
+++ b/hardinfo/pci_util.c
@@ -20,6 +20,80 @@
#include "hardinfo.h"
#include "pci_util.h"
+#include "util_ids.h"
+
+gchar *pci_ids_file = NULL;
+
+void find_pci_ids_file() {
+ if (pci_ids_file) return;
+ char *file_search_order[] = {
+ g_strdup("/usr/share/hwdata/pci.ids"),
+ g_build_filename(g_get_user_config_dir(), "hardinfo", "pci.ids", NULL),
+ g_build_filename(params.path_data, "pci.ids", NULL),
+ NULL
+ };
+ int n;
+ for(n = 0; file_search_order[n]; n++) {
+ if (!pci_ids_file && !access(file_search_order[n], R_OK))
+ pci_ids_file = file_search_order[n];
+ else
+ g_free(file_search_order[n]);
+ }
+}
+
+char *pci_lookup_ids_vendor_str(uint32_t id) {
+ gchar *ret = NULL;
+
+ ids_query_result result = {};
+ gchar *qpath;
+
+ if (!pci_ids_file)
+ find_pci_ids_file();
+
+ qpath = g_strdup_printf("%04x", id);
+ scan_ids_file(pci_ids_file, qpath, &result, -1);
+ if (result.results[0]) {
+ ret = g_strdup(result.results[0]);
+ }
+ g_free(qpath);
+
+ return ret;
+}
+
+static void pci_lookup_ids(pcid *d) {
+ ids_query_result result = {};
+ gchar *qpath;
+
+ if (!pci_ids_file)
+ find_pci_ids_file();
+
+ /* lookup vendor, device, sub device */
+ qpath = g_strdup_printf("%04x/%04x/%04x %04x",
+ d->vendor_id, d->device_id, d->sub_vendor_id, d->sub_device_id);
+ scan_ids_file(pci_ids_file, qpath, &result, -1);
+ if (result.results[0]) {
+ if (d->vendor_id_str) g_free(d->vendor_id_str);
+ d->vendor_id_str = g_strdup(result.results[0]);
+ }
+ if (result.results[1]) {
+ if (d->device_id_str) g_free(d->device_id_str);
+ d->device_id_str = g_strdup(result.results[1]);
+ }
+ if (result.results[2]) {
+ if (d->sub_device_id_str) g_free(d->sub_device_id_str);
+ d->sub_device_id_str = g_strdup(result.results[2]);
+ }
+ g_free(qpath);
+
+ /* lookup sub vendor by itself */
+ qpath = g_strdup_printf("%04x", d->sub_vendor_id);
+ scan_ids_file(pci_ids_file, qpath, &result, -1);
+ if (result.results[0]) {
+ if (d->sub_vendor_id_str) g_free(d->sub_vendor_id_str);
+ d->sub_vendor_id_str = g_strdup(result.results[0]);
+ }
+ g_free(qpath);
+}
pcid *pcid_new() {
return g_new0(pcid, 1);