summaryrefslogtreecommitdiffstats
path: root/src/nvme/filters.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvme/filters.c')
-rw-r--r--src/nvme/filters.c59
1 files changed, 52 insertions, 7 deletions
diff --git a/src/nvme/filters.c b/src/nvme/filters.c
index b5959a8..312b8f6 100644
--- a/src/nvme/filters.c
+++ b/src/nvme/filters.c
@@ -21,10 +21,53 @@
#include "filters.h"
#include "types.h"
#include "util.h"
+#include "cleanup.h"
-const char *nvme_ctrl_sysfs_dir = "/sys/class/nvme";
-const char *nvme_ns_sysfs_dir = "/sys/block";
-const char *nvme_subsys_sysfs_dir = "/sys/class/nvme-subsystem";
+#define PATH_SYSFS_NVME "/sys/class/nvme"
+#define PATH_SYSFS_NVME_SUBSYSTEM "/sys/class/nvme-subsystem"
+#define PATH_SYSFS_BLOCK "/sys/block"
+
+char *nvme_ctrl_sysfs_dir(void)
+{
+ char *basepath = getenv("LIBNVME_SYSFS_PATH");
+ char *str;
+
+ if (!basepath)
+ return strdup(PATH_SYSFS_NVME);
+
+ if (!asprintf(&str, "%s" PATH_SYSFS_NVME, basepath))
+ return NULL;
+
+ return str;
+}
+
+char *nvme_ns_sysfs_dir(void)
+{
+ char *basepath = getenv("LIBNVME_SYSFS_PATH");
+ char *str;
+
+ if (!basepath)
+ return strdup(PATH_SYSFS_BLOCK);
+
+ if (!asprintf(&str, "%s" PATH_SYSFS_BLOCK, basepath))
+ return NULL;
+
+ return str;
+}
+
+char *nvme_subsys_sysfs_dir(void)
+{
+ char *basepath = getenv("LIBNVME_SYSFS_PATH");
+ char *str;
+
+ if (!basepath)
+ return strdup(PATH_SYSFS_NVME_SUBSYSTEM);
+
+ if (!asprintf(&str, "%s" PATH_SYSFS_NVME_SUBSYSTEM, basepath))
+ return NULL;
+
+ return str;
+}
int nvme_namespace_filter(const struct dirent *d)
{
@@ -89,8 +132,9 @@ int nvme_subsys_filter(const struct dirent *d)
int nvme_scan_subsystems(struct dirent ***subsys)
{
- return scandir(nvme_subsys_sysfs_dir, subsys, nvme_subsys_filter,
- alphasort);
+ _cleanup_free_ char *dir = nvme_subsys_sysfs_dir();
+
+ return scandir(dir, subsys, nvme_subsys_filter, alphasort);
}
int nvme_scan_subsystem_namespaces(nvme_subsystem_t s, struct dirent ***ns)
@@ -101,8 +145,9 @@ int nvme_scan_subsystem_namespaces(nvme_subsystem_t s, struct dirent ***ns)
int nvme_scan_ctrls(struct dirent ***ctrls)
{
- return scandir(nvme_ctrl_sysfs_dir, ctrls, nvme_ctrls_filter,
- alphasort);
+ _cleanup_free_ char *dir = nvme_ctrl_sysfs_dir();
+
+ return scandir(dir, ctrls, nvme_ctrls_filter, alphasort);
}
int nvme_scan_ctrl_namespace_paths(nvme_ctrl_t c, struct dirent ***paths)